using MediatR; using Microsoft.AspNetCore.Components.Forms; using Modules.Library.Application.Commands.CommonModels; using Modules.Library.Application.Gateways; using Modules.Library.Domain.Entities.MediaContent.Items.Anime; using Modules.Media.Api.Commands; namespace Modules.Library.Application.Commands.Anime.Title; public class CreateAnimeTitleCommand : IRequest { public IEnumerable Names { get; set; } = []; public MediaInfo? Preview { get; set; } public IEnumerable Descriptions { get; set; } = []; public IEnumerable Genres { get; set; } = []; public List RelatedContent { get; set; } = []; public DateTime? AnnouncementDate { get; set; } public DateTime? EstimatedReleaseDate { get; set; } public DateTime? ReleaseDate { get; set; } } public class MediaInfo { public MediaInfoType Type { get; set; } public Stream Data { get; set; } = default!; public string ContentType { get; set; } = default!; } 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, IMediator mediator) : IRequestHandler { public async Task 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) { var objectId = await mediator.Send(new AddObjectCommand { //ObjectName = !string.IsNullOrWhiteSpace(user.AvatarId) ? user.AvatarId : null, BusketName = "my-bookmark.library", ObjectPrefix = "related_content", //ObjectExtension = relatedContentItem.ex, //get extension from mime-type ObjectExtension = "png", ContentType = relatedContentItem.ContentType, Data = relatedContentItem.Data, }, cancellationToken); animeTitle.CommonProperties.AddRelatedContent(objectId, (Domain.Entities.MediaInfoType)relatedContentItem.Type, relatedContentItem.ContentType); } } animeTitle.CommonProperties.SetAnnouncementDate(request.AnnouncementDate); animeTitle.CommonProperties.SetEstimatedReleaseDate(request.EstimatedReleaseDate); animeTitle.CommonProperties.SetReleaseDate(request.ReleaseDate); if (request.Preview != null) { var previewObjectId = await mediator.Send(new AddObjectCommand { //ObjectName = !string.IsNullOrWhiteSpace(user.AvatarId) ? user.AvatarId : null, BusketName = "my-bookmark.library", ObjectPrefix = "related_content", //ObjectExtension = relatedContentItem.ex, //get extension from mime-type ObjectExtension = "png", ContentType = request.Preview.ContentType, Data = request.Preview.Data, }, cancellationToken); animeTitle.CommonProperties.SetPreview(previewObjectId, (Domain.Entities.MediaInfoType)request.Preview.Type, request.Preview.ContentType); } return await titleGateway.Create(animeTitle); } }