MyBookmark/Modules.Library.Application/Commands/Anime/Title/CreateAnimeTitleCommand.cs
THE_KONDRAT 3294f8d88d title:
non season episode
seasons
2024-12-29 19:41:07 +03:00

118 lines
4.9 KiB
C#

using MediatR;
using Modules.Library.Application.Commands.CommonModels;
using Modules.Library.Application.Gateways;
using Modules.Library.Application.Services;
using Modules.Library.Domain.Entities.MediaContent.Items.Anime;
namespace Modules.Library.Application.Commands.Anime.Title;
public class CreateAnimeTitleCommand : IRequest<Guid>
{
public IEnumerable<Name> Names { get; set; } = [];
public MediaInfo? Preview { get; set; }
public IEnumerable<Description> Descriptions { get; set; } = [];
public IEnumerable<Genre> Genres { get; set; } = [];
public List<MediaInfo> RelatedContent { get; set; } = [];
public DateTime? AnnouncementDate { get; set; }
public DateTime? EstimatedReleaseDate { get; set; }
}
public class MediaInfo
{
public MediaInfoType Type { get; set; }
public string? ContentType { get; set; }
public Stream? Data { get; set; }
public string? Url { get; set; }
}
public class Name
{
public Guid LanguageId { get; set; }
public string Value { get; set; } = default!;
public NameType NameType { get; set; }
}
public class Description
{
public Guid LanguageId { get; set; }
public string Value { get; set; } = default!;
public bool IsOriginal { get; set; }
}
public class Genre
{
public Guid GenreId { get; set; }
public decimal? Proportion { get; set; }
}
public class CreateAnimtTitleCommandHandler(IAnimeTitleGateway titleGateway, ILanguageGateway languageGateway,
IGenreGateway genreGateway, MediaInfoService mediaInfoService) : IRequestHandler<CreateAnimeTitleCommand, Guid>
{
public async Task<Guid> Handle(CreateAnimeTitleCommand request, CancellationToken cancellationToken)
{
if (!request.Names.Any()) throw new Exception("No names");
//var language = await languageGateway.GetLanguageById(request.NameLanguageId);
var languages = await languageGateway.GetLanguageByIds(request.Names.Select(q => q.LanguageId).Distinct());
var genres = await genreGateway.GetGenreByIds(request.Genres.Select(q => q.GenreId).Distinct());
var animeTitle = new AnimeTitle(request.Names.Select(q =>
new Domain.Entities.MediaContent.CommonProperties.NameItem((Domain.Entities.MediaContent.CommonProperties.NameType)q.NameType,
languages.First(x => x.Id == q.LanguageId).Id, q.Value)));
if (request.Descriptions.Any())
{
foreach (var description in request.Descriptions)
{
var languageId = languages.First(q => q.Id == description.LanguageId).Id;
if (description.IsOriginal) animeTitle.CommonProperties.AddOriginalDescription(languageId, description.Value);
else animeTitle.CommonProperties.AddNotOriginalDescription(languageId, description.Value);
}
}
if (request.Genres.Any())
{
foreach (var genre in request.Genres)
{
var genreId = genres.First(q => q.Id == genre.GenreId).Id;
animeTitle.CommonProperties.AddGenre(genreId, genre.Proportion);
}
}
if (request.RelatedContent.Any())
{
foreach (var relatedContentItem in request.RelatedContent)
{
//add model
var (objectId, contentType) = await mediaInfoService.Add(new MediaInfoService.CreateModel
{
Data = relatedContentItem.Data,
Url = relatedContentItem.Url,
ContentType = relatedContentItem.ContentType,
Type = (Domain.Entities.MediaInfoType)relatedContentItem.Type,
}, false, cancellationToken);
//objectId
animeTitle.CommonProperties.AddRelatedContent(objectId, (Domain.Entities.MediaInfoType)relatedContentItem.Type, contentType);
}
}
animeTitle.CommonProperties.SetAnnouncementDate(request.AnnouncementDate);
animeTitle.CommonProperties.SetEstimatedReleaseDate(request.EstimatedReleaseDate);
//
//animeTitle.CommonProperties.SetReleaseDate(request.ReleaseDate);
var animeTitleId = await titleGateway.Create(animeTitle);
if (request.Preview != null)
{
var title = await titleGateway.GetById(animeTitleId);
var (objectId, contentType) = await mediaInfoService.Add(new MediaInfoService.CreateModel
{
Id = animeTitleId,
Data = request.Preview.Data,
Url = request.Preview.Url,
ContentType = request.Preview.ContentType,
Type = (Domain.Entities.MediaInfoType)request.Preview.Type,
}, true, cancellationToken);
title.CommonProperties.SetPreview(objectId, (Domain.Entities.MediaInfoType)request.Preview.Type, contentType);
await titleGateway.Update(title);
}
//return await titleGateway.Create(animeTitle);
return animeTitleId;
}
}