using AutoMapper; using MediatR; using Microsoft.AspNetCore.Components.Web; using Microsoft.AspNetCore.Mvc; using Modules.Library.WebApi.Models; using Modules.Library.WebApi.Models.Anime; using Modules.Library.WebApi.Models.Anime.CommonProperties; using Modules.Library.WebApi.Models.Views.Anime; namespace Modules.Library.WebApi.Controllers; [ApiController] [ApiExplorerSettings(GroupName = "AnimeTitleV1")] [Route("MediaContent/Anime/Title")] //[Route("[controller]")] public class TitleController : ControllerBase { private readonly IMapper _mapper; private readonly IMediator _mediator; private readonly ILogger _logger; public TitleController(IMapper mapper, IMediator mediator, ILogger logger) { _mapper = mapper; _mediator = mediator; _logger = logger; } [HttpGet("List")] public async Task> List() => _mapper.Map>(await _mediator.Send(new Application.Queries.Anime.AnimeTitle.AnimeTitleListQuery { UserId = new Guid("8393230f-78e3-473b-a5dc-3221917e0aeb") })); [HttpGet] public async Task ById(Guid TitleId) => _mapper.Map<Title>(await _mediator.Send(new Application.Queries.Anime.AnimeTitle.AnimeTitleQuery { Id = TitleId })); [HttpPost("Rate")] public async Task Rate(RateEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.RateTitleCommand { TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), RatePercentage = model.RatePercentage ?? throw new ArgumentNullException(nameof(model.RatePercentage)), }); [HttpPost("Unrate")] public async Task Unrate(RateEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.UnrateTitleCommand { TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), }); [HttpPost("Create")] public async Task<Guid> CreateTitle(TitleCreate model) => await _mediator.Send(new Application.Commands.Anime.Title.CreateAnimeTitleCommand { Preview = model.Preview == null ? null : new Application.Commands.Anime.Title.MediaInfo { Url = model.Preview.Url, Type = (Application.Commands.CommonModels.MediaInfoType)model.Preview.Type, ContentType = model.Preview.ContentType, }, Names = model.Names.Select(q => new Application.Commands.Anime.Title.Name { LanguageId = q.LanguageId, NameType = (Application.Commands.CommonModels.NameType)q.Type, Value = q.Value, }), Descriptions = model.Descriptions.Select(q => new Application.Commands.Anime.Title.Description { LanguageId = q.LanguageId, IsOriginal = q.IsOriginal, Value = q.Value, }), Genres = model.Genres.Select(q => new Application.Commands.Anime.Title.Genre { GenreId = q.GenreId, Proportion = q.Proportion, }), RelatedContent = model.RelatedContent.Select(q => new Application.Commands.Anime.Title.MediaInfo { Type = (Application.Commands.CommonModels.MediaInfoType)q.Type, Url = q.Url, ContentType = q.ContentType, }), AnnouncementDate = model.AnnouncementDate, EstimatedReleaseDate = model.EstimatedReleaseDate, ReleaseDate = model.ReleaseDate, }); [HttpPost("AddSeason")] public async Task<Guid> AddSeason([FromQuery] Guid titleId) => await _mediator.Send(new Application.Commands.Anime.Title.AddSeasonCommand { TitleId = titleId }); [HttpPost("DeleteSeason")] public async Task DeleteSeason([FromQuery] Guid titleId, [FromQuery] Guid itemId) => await _mediator.Send(new Application.Commands.Anime.Title.DeleteSeasonCommand { TitleId = titleId }); [HttpPost("AddEpisode")] public async Task<Guid> AddEpisode([FromQuery] Guid titleId) => await _mediator.Send(new Application.Commands.Anime.Title.AddEpisodeCommand { TitleId = titleId }); [HttpPost("DeleteEpisode")] public async Task DeleteEpisode([FromQuery] Guid titleId, [FromQuery] Guid itemId) => await _mediator.Send(new Application.Commands.Anime.Title.DeleteEpisodeCommand { TitleId = titleId }); [HttpPost("AddName")] public async Task AddName(NameEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Name.AddNameCommand { TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), LanguageId = model.LanguageId, NameType = (Application.Commands.CommonModels.NameType)model.Type, Value = model.Value }); [HttpPost("EditName")] public async Task EditName(NameEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Name.EditNameCommand { TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), LanguageId = model.LanguageId, NameType = (Application.Commands.CommonModels.NameType)model.Type, Value = model.Value, NewLanguageId = model.NewLanguageId, NewValue = model.NewValue, }); [HttpPost("DeleteName")] public async Task DeleteName(NameEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Name.DeleteNameCommand { TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), LanguageId = model.LanguageId, NameType = (Application.Commands.CommonModels.NameType)model.Type, Value = model.Value, }); [HttpPost("SetPreview")] public async Task SetPreview(MediaInfoEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Preview.SetPreviewCommand { TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), Type = (Application.Commands.CommonModels.MediaInfoType)model.Type, Url = model.Url, ContentType = model.ContentType, }); [HttpPost("ClearPreview")] public async Task ClearPreview(MediaInfoEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Preview.DeletePreviewCommand { TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), }); [HttpPost("AddDescription")] public async Task AddDescription(DescriptionEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Description.AddDescriptionCommand { TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), IsOriginal = model.IsOriginal, LanguageId = model.LanguageId, Value = model.Value, }); [HttpPost("EditDescription")] public async Task EditDescription(DescriptionEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Description.EditDescriptionCommand { TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), LanguageId = model.LanguageId, IsOriginal = model.IsOriginal, Value = model.Value, NewLanguageId = model.NewLanguageId, NewValue = model.NewValue, }); [HttpPost("DeleteDescription")] public async Task DeleteDescription(DescriptionEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Description.DeleteDescriptionCommand { TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), LanguageId = model.LanguageId, IsOriginal = model.IsOriginal, Value = model.Value, }); [HttpPost("AddGenre")] public async Task AddDescription(GenreProportionEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Genre.AddGenreCommand { TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), GenreId = model.GenreId, Proportion = model.Proportion, }); [HttpPost("EditGenre")] public async Task EditGenre(GenreProportionEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Genre.SetGenreProportionCommand { TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), GenreId = model.GenreId, Proportion = model.Proportion }); [HttpPost("DeleteGenre")] public async Task DeleteGenre(GenreProportionEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Genre.DeleteGenreCommand { TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), GenreId = model.GenreId, }); //related content [HttpPost("AddRelatedContent")] public async Task AddRelatedContent(MediaInfoEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.RelatedContent.AddRelatedContentCommand { TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), Type = (Application.Commands.CommonModels.MediaInfoType)model.Type, Url = model.Url, ContentType = model.ContentType, }); [HttpPost("EditRelatedContent")] public async Task EditRelatedContent(MediaInfoEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.RelatedContent.EditRelatedContentCommand { TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), Type = (Application.Commands.CommonModels.MediaInfoType)model.Type, Url = model.Url, ContentType = model.ContentType, NewType = (Application.Commands.CommonModels.MediaInfoType?)model.NewType, NewUrl = model.NewUrl, NewContentType = model.ContentType, }); [HttpPost("DeleteRelatedContent")] public async Task DeleteRelatedContent(MediaInfoEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.RelatedContent.DeleteRelatedContentCommand { TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), Type = (Application.Commands.CommonModels.MediaInfoType)model.Type, Url = model.Url, ContentType = model.ContentType, }); [HttpPost("SetCompleted")] public async Task SetCompleted([FromQuery] Guid titleId, [FromQuery] bool completed) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.SetCompletedCommand { TitleId = titleId, Value = completed, }); [HttpPost("SetExpirationTime")] public async Task SetExpirationTime([FromQuery] Guid titleId, [FromQuery] long expirationTimeTicks) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.SetExpirationTimeCommand { TitleId = titleId, ExpirationTime = TimeSpan.FromTicks(expirationTimeTicks), }); [HttpPost("SetAnnouncementDate")] public async Task SetAnnouncementDate(DateEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.SetAnnouncementDateCommand { TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), Value = model.Value.HasValue ? new DateTimeOffset(model.Value.Value.DateTime, TimeSpan.Zero) : null }); [HttpPost("SetEstimatedReleaseDate")] public async Task SetEstimatedReleaseDate(DateEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.SetEstimatedReleaseDateCommand { TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), Value = model.Value.HasValue ? new DateTimeOffset(model.Value.Value.DateTime, TimeSpan.Zero) : null }); [HttpPost("SetReleaseDate")] public async Task SetReleaseDate(DateEdit model) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.SetReleaseDateCommand { TitleId = model.AnimeTitleId ?? throw new ArgumentNullException(nameof(model.AnimeTitleId)), Value = model.Value.HasValue ? new DateTimeOffset(model.Value.Value.DateTime, TimeSpan.Zero) : null, }); }