using Modules.Library.Domain.Entities.MediaContent.Items.Anime; using Modules.Library.Domain.Gateways; namespace Modules.Library.Domain.Interactors.MediaContent.Anime.Title; public abstract class InteractorBase(IAnimeTitleGateway gateway, ILanguageGateway languageGateway, IGenreGateway genreGateway) { internal readonly CommonPropertiesService _commonPropertiesService = new(languageGateway, genreGateway); protected async Task GetTitle(Guid titleId) => await gateway.GetByIdAsync(titleId); protected static AnimeSeason GetSeason(AnimeTitle title, Guid seasonId) { return title.Items.OfType().First(q => q.Id == seasonId); } protected static AnimeEpisode GetEpisode(AnimeTitle title, AnimeSeason? season, Guid episodeId) { if (season != null) return season.Episodes.First(q => q.Id == episodeId); else return title.Items.OfType().First(q => q.Id == episodeId); } protected static void OnStructureActionCompleted(AnimeTitle title, AnimeSeason? season = null) { if (season != null) CheckIfAnimeSeasonCompleted(title, season); CheckIfAnimeTitleCompleted(title); } private static void CheckIfAnimeTitleCompleted(AnimeTitle title) { var itemsQuery = title.Items.AsQueryable(); var ucompletedSeasons = itemsQuery .Any(q => !q.CommonProperties.ReleaseDate.HasValue); var lastEpisodeReleaseDate = itemsQuery .OrderByDescending(q => q.CommonProperties.ReleaseDate) .FirstOrDefault()?.CommonProperties.ReleaseDate; title.Completed = !(ucompletedSeasons || lastEpisodeReleaseDate >= DateTime.UtcNow - title.ExpirationTime); } private static void CheckIfAnimeSeasonCompleted(AnimeTitle title, AnimeSeason season) { var itemsQuery = title.Items.AsQueryable(); var ucompletedSeasons = itemsQuery .Any(q => !q.CommonProperties.ReleaseDate.HasValue); var lastEpisodeReleaseDate = itemsQuery .OrderByDescending(q => q.CommonProperties.ReleaseDate) .FirstOrDefault()?.CommonProperties.ReleaseDate; title.Completed = !(ucompletedSeasons || lastEpisodeReleaseDate >= DateTime.UtcNow - title.ExpirationTime); } }