using System.Linq; using System.Threading.Tasks; using API.Entities; using API.Entities.Enums; using API.Interfaces.Repositories; using Microsoft.EntityFrameworkCore; namespace API.Data.Repositories { public class AppUserProgressRepository : IAppUserProgressRepository { private readonly DataContext _context; public AppUserProgressRepository(DataContext context) { _context = context; } public void Update(AppUserProgress userProgress) { _context.Entry(userProgress).State = EntityState.Modified; } /// /// This will remove any entries that have chapterIds that no longer exists. This will execute the save as well. /// public async Task CleanupAbandonedChapters() { var chapterIds = _context.Chapter.Select(c => c.Id); var rowsToRemove = await _context.AppUserProgresses .Where(progress => !chapterIds.Contains(progress.ChapterId)) .ToListAsync(); var rowsToRemoveBookmarks = await _context.AppUserBookmark .Where(progress => !chapterIds.Contains(progress.ChapterId)) .ToListAsync(); var rowsToRemoveReadingLists = await _context.ReadingListItem .Where(item => !chapterIds.Contains(item.ChapterId)) .ToListAsync(); _context.RemoveRange(rowsToRemove); _context.RemoveRange(rowsToRemoveBookmarks); _context.RemoveRange(rowsToRemoveReadingLists); return await _context.SaveChangesAsync() > 0 ? rowsToRemove.Count : 0; } /// /// Checks if user has any progress against a library of passed type /// /// /// /// public async Task UserHasProgress(LibraryType libraryType, int userId) { var seriesIds = await _context.AppUserProgresses .Where(aup => aup.PagesRead > 0 && aup.AppUserId == userId) .AsNoTracking() .Select(aup => aup.SeriesId) .ToListAsync(); if (seriesIds.Count == 0) return false; return await _context.Series .Include(s => s.Library) .Where(s => seriesIds.Contains(s.Id) && s.Library.Type == libraryType) .AsNoTracking() .AnyAsync(); } public async Task GetUserProgressAsync(int chapterId, int userId) { return await _context.AppUserProgresses .Where(p => p.ChapterId == chapterId && p.AppUserId == userId) .FirstOrDefaultAsync(); } } }