using Modules.Library.Database.Database.Models.Anime; using Modules.Library.Database.Database.Models.CommonProperties; using Modules.Library.Database.Repositories; using System.Linq; namespace Modules.Library.Database.GatewaysImplementations.Converters; internal class AnimeTitleConverter { private readonly LanguageRepository _languageRepository; private readonly GenreRepository _genreRepository; private readonly CommonPropertiesConverter _commonPropertiesConverter; private readonly AnimeSeasonConverter _animeSeasonConverter; private readonly AnimeEpisodeConverter _animeEpisodeConverter; internal AnimeTitleConverter(LanguageRepository languageRepository, GenreRepository genreRepository) { _languageRepository = languageRepository; _genreRepository = genreRepository; _commonPropertiesConverter = new CommonPropertiesConverter(languageRepository, genreRepository); _animeSeasonConverter = new AnimeSeasonConverter(_commonPropertiesConverter); _animeEpisodeConverter = new AnimeEpisodeConverter(_commonPropertiesConverter); } internal async Task Convert(AnimeTitle title) { var dto = new Application.Models.Anime.Title { Id = title.Id, Deleted = title.Deleted, Rate = null, MyRate = null, Completed = title.Completed, CommonProperties = await _commonPropertiesConverter.Convert(title.CommonProperties), ExpirationTime = title.ExpirationTime, }; foreach (var season in title.Items.OfType()) { dto.Seasons.Add(await _animeSeasonConverter.Convert(season)); } foreach (var episode in title.Items.OfType()) { dto.Episodes.Add(await _animeEpisodeConverter.Convert(episode)); } return dto; } internal async Task ConvertToDomain(AnimeTitle title) { var dto = new Domain.Models.AnimeTitle { Id = title.Id, Deleted = title.Deleted, Completed = title.Completed, CommonProperties = await Convert(title.CommonProperties), ExpirationTime = title.ExpirationTime, }; foreach (var season in title.Items.OfType()) { dto.Items.Add(await Convert(season)); } foreach (var episode in title.Items.OfType()) { dto.Items.Add(await Convert(episode)); } return Domain.Entities.MediaContent.Items.Anime.AnimeTitle.New(dto); } internal async Task Convert(AnimeSeason season) { var result = new Domain.Models.AnimeSeason { Id = season.Id, Deleted = season.Deleted, Completed = season.Completed, CommonProperties = await Convert(season.CommonProperties), Number = season.Number, Order = season.Order, //Variant = season.Variant, ExpirationTime = season.ExpirationTime, Director = season.Director, OriginCountry = season.OriginCountry, }; foreach (var episode in season.Episodes) { result.Episodes.Add(await Convert(episode)); } return result; } private async Task Convert(CommonProperties commonProperties) { var commonPropertiesLanguageIds = commonProperties.Names.Select(q => q.LanguageId).ToList(); commonPropertiesLanguageIds.AddRange(commonProperties.Descriptions.Select(q => q.LanguageId)); var languages = await _languageRepository.GetWhere(q => commonPropertiesLanguageIds.Distinct().Contains(q.Id)); var genres = await _genreRepository.GetWhere(q => commonProperties.Genres.Select(q => q.Id).Distinct().Contains(q.Id)); return new Domain.Models.CommonProperties { Names = commonProperties.Names.Select(q => new Domain.Models.NameItem { LanguageId = q.LanguageId, Type = (Domain.Entities.MediaContent.CommonProperties.NameType)q.Type, Value = q.Value, }), Preview = commonProperties.Preview == null ? null : new Domain.Models.MediaInfo { Type = (Domain.Entities.MediaInfoType)commonProperties.Preview.Type, Url = commonProperties.Preview.Url, ContentType = commonProperties.Preview.ContentType, }, Descriptions = commonProperties.Descriptions.Select(q => new Domain.Models.Description { LanguageId = q.LanguageId, IsOriginal = q.IsOriginal, Value = q.Value, }), Genres = commonProperties.Genres.Select(q => new Domain.Models.GenreProportion { GenreId = q.GenreId, Proportion = q.Proportion, }), RelatedContent = commonProperties.RelatedContent.Select(q => new Domain.Models.MediaInfo { Type = (Domain.Entities.MediaInfoType)q.Type, Url = q.Url, ContentType = q.ContentType, }), AnnouncementDate = commonProperties.AnnouncementDate, EstimatedReleaseDate = commonProperties.EstimatedReleaseDate, ReleaseDate = commonProperties.ReleaseDate, }; } private async Task Convert(AnimeEpisode episode) { return new Domain.Models.AnimeEpisode { Id = episode.Id, Deleted = episode.Deleted, Completed = episode.Completed, CommonProperties = await Convert(episode.CommonProperties), Number = episode.Number, Order = episode.Order, Variant = episode.Variant, ExpirationTime = episode.ExpirationTime, Type = (Domain.Entities.MediaContent.Items.Anime.AnimeEpisodeType)episode.Type, Duration = episode.Duration, }; } internal AnimeTitle Convert(Domain.Entities.MediaContent.Items.Anime.AnimeTitle title) { var dbTitle = new AnimeTitle { Id = title.Id, CommonProperties = _commonPropertiesConverter.Convert(title.CommonProperties), Completed = title.Completed, Deleted = title.Deleted, ExpirationTime = title.ExpirationTime, }; if (!title.IsTransient()) dbTitle.Id = title.Id; foreach (var season in title.Items.OfType()) { dbTitle.Items.Add(_animeSeasonConverter.Convert(season)); } foreach (var episode in title.Items.OfType()) { dbTitle.Items.Add(_animeEpisodeConverter.Convert(episode)); } return dbTitle; } }