MyBookmark/Modules.Library.Domain/Interactors/MediaContent/Anime/Title/InteractorBase.cs
2024-09-04 23:08:56 +03:00

48 lines
2.2 KiB
C#

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<AnimeTitle> GetTitle(Guid titleId) => await gateway.GetByIdAsync(titleId);
protected static AnimeSeason GetSeason(AnimeTitle title, Guid seasonId)
{
return title.Items.OfType<AnimeSeason>().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<AnimeEpisode>().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);
}
}