using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using API.DTOs; using API.Entities; using API.Interfaces; using API.Interfaces.Repositories; using AutoMapper; using AutoMapper.QueryableExtensions; using Microsoft.EntityFrameworkCore; namespace API.Data.Repositories { public class VolumeRepository : IVolumeRepository { private readonly DataContext _context; private readonly IMapper _mapper; public VolumeRepository(DataContext context, IMapper mapper) { _context = context; _mapper = mapper; } public void Update(Volume volume) { _context.Entry(volume).State = EntityState.Modified; } /// /// Returns a Chapter for an Id. Includes linked s. /// /// /// public async Task GetChapterAsync(int chapterId) { return await _context.Chapter .Include(c => c.Files) .SingleOrDefaultAsync(c => c.Id == chapterId); } /// /// Returns Chapters for a volume id. /// /// /// public async Task> GetChaptersAsync(int volumeId) { return await _context.Chapter .Where(c => c.VolumeId == volumeId) .ToListAsync(); } /// /// Returns the cover image for a chapter id. /// /// /// public async Task GetChapterCoverImageAsync(int chapterId) { return await _context.Chapter .Where(c => c.Id == chapterId) .Select(c => c.CoverImage) .AsNoTracking() .SingleOrDefaultAsync(); } public async Task GetChapterDtoAsync(int chapterId) { var chapter = await _context.Chapter .Include(c => c.Files) .ProjectTo(_mapper.ConfigurationProvider) .AsNoTracking() .SingleOrDefaultAsync(c => c.Id == chapterId); return chapter; } /// /// Returns non-tracked files for a given chapterId /// /// /// public async Task> GetFilesForChapterAsync(int chapterId) { return await _context.MangaFile .Where(c => chapterId == c.ChapterId) .AsNoTracking() .ToListAsync(); } /// /// Returns non-tracked files for a set of chapterIds /// /// /// public async Task> GetFilesForChaptersAsync(IReadOnlyList chapterIds) { return await _context.MangaFile .Where(c => chapterIds.Contains(c.ChapterId)) .AsNoTracking() .ToListAsync(); } public async Task> GetFilesForVolume(int volumeId) { return await _context.Chapter .Where(c => volumeId == c.VolumeId) .Include(c => c.Files) .SelectMany(c => c.Files) .AsNoTracking() .ToListAsync(); } } }