using Microsoft.EntityFrameworkCore; using Modules.Library.Database.Database; using Modules.Library.Database.Database.Models.Anime; using System.Linq.Expressions; namespace Modules.Library.Database.Repositories; public class AnimeEpisodeRepository(AnimeTitleRepository titleRepository, LibraryDbContext context) { private readonly LibraryDbContext _context = context; internal async Task AddAsync(Guid animeTitleId, Guid? seasonId, AnimeEpisode animeEpisode) { var dbTitle = await titleRepository.GetFirstWhere(q => q.Id == animeTitleId); if (seasonId.HasValue) { var season = dbTitle.Items.OfType().First(q => q.Id == seasonId); season.Episodes.Add(animeEpisode); } else { dbTitle.Items.Add(animeEpisode); } await _context.SaveChangesAsync(); return animeEpisode.Id; } private IQueryable QueryFullIncludes() => _context.AnimeEpisodes .Include(q => q.Title) .Include(q => q.Season) .Include(q => q.CommonProperties).ThenInclude(q => q.Names) .Include(q => q.CommonProperties).ThenInclude(q => q.Descriptions) .Include(q => q.CommonProperties).ThenInclude(q => q.RelatedContent) .Include(q => q.CommonProperties).ThenInclude(q => q.Genres) .Include(q => q.CommonProperties).ThenInclude(q => q.Preview) .AsQueryable(); //internal async Task> GetAllAsync() => await QueryFullIncludes().ToListAsync(); internal async Task GetFirstWhere(Expression> predicate) => await QueryFullIncludes().FirstAsync(predicate); internal async Task UpdateAsync(Guid titleId, Guid? seasonId, AnimeEpisode animeEpisode) { var dbEpisodeQuery = QueryFullIncludes().Where(q => q.Title.Id == titleId && q.Id == animeEpisode.Id); if (seasonId.HasValue) { dbEpisodeQuery = dbEpisodeQuery.Where(q => q.Season.Id == seasonId); } var dbEpisode = await dbEpisodeQuery.FirstAsync(); CommonPropertiesHelper.SyncCommonProperties(dbEpisode.CommonProperties, animeEpisode.CommonProperties); dbEpisode.ExpirationTime = animeEpisode.ExpirationTime; dbEpisode.Completed = animeEpisode.Completed; dbEpisode.Deleted = animeEpisode.Deleted; await _context.SaveChangesAsync(); } internal async Task DeleteAsync(Guid titleId, Guid? seasonId, Guid animeEpisodeId) { var dbEpisodeQuery = QueryFullIncludes().Where(q => q.Title.Id == titleId && q.Id == animeEpisodeId); if (seasonId.HasValue) { dbEpisodeQuery = dbEpisodeQuery.Where(q => q.Season != null && q.Season.Id == seasonId); } var dbEpisode = await dbEpisodeQuery.FirstAsync(); _context.AnimeEpisodes.Remove(dbEpisode); await _context.SaveChangesAsync(); } //protected override async Task SoftDeleteAsync(AnimeTitle entity) //{ // entity.Deleted = true; // return await UpdateAsync(entity); //} /* public async Task AddAsync(Domain.Entities.MediaContent.Items.Anime.AnimeTitle entity, IUser user) => await AddAsync(ToDbConverter.Title(entity)); public Task AnyWhere(Expression> predicate) { var p = predicate. } public Task DeleteAsync(Domain.Entities.MediaContent.Items.Anime.AnimeTitle entity, IUser user) { throw new NotImplementedException(); } public Task GetByIdAsync(string id) { throw new NotImplementedException(); } public Task GetByIdOrDefaultAsync(string id) { throw new NotImplementedException(); } public Task GetFirstOrDefaultWhere(Expression> predicate) { throw new NotImplementedException(); } public Task GetFirstWhere(Expression> predicate) { throw new NotImplementedException(); } public Task> GetRangeByIdsAsync(List ids) { throw new NotImplementedException(); } public Task> GetWhere(Expression> predicate) { throw new NotImplementedException(); } public Task UpdateAsync(Domain.Entities.MediaContent.Items.Anime.AnimeTitle entity, IUser user) { throw new NotImplementedException(); } Task> Application.Gateways.IRepository.GetAllAsync() { throw new NotImplementedException(); } */ }