117 lines
5.0 KiB
C#
117 lines
5.0 KiB
C#
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<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 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<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)
|
|
{
|
|
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);
|
|
}
|
|
} |