using Amazon.Runtime.Internal.Endpoints.StandardLibrary; using AutoMapper; using MediatR; using Microsoft.AspNetCore.Mvc; using Modules.Library.WebApi.Models; using Modules.Library.WebApi.Models.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())); [HttpGet] public async Task ById(Guid TitleId) => _mapper.Map<Title>(await _mediator.Send(new Application.Queries.Anime.AnimeTitle.AnimeTitleQuery { Id = TitleId })); [HttpPost("Create")] public async Task<Guid> CreateTitle([FromQuery] Guid nameOriginalLanguageId, [FromQuery] string nameOriginal) => await _mediator.Send(new Application.Commands.Anime.Title.CreateAnimeTitleCommand { NameOriginalLanguageId = nameOriginalLanguageId, NameOriginal = nameOriginal, }); [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([FromQuery] Guid titleId, [FromQuery] Guid languageId, [FromQuery] string name, [FromQuery] NameType type) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Name.AddNameCommand { TitleId = titleId, LanguageId = languageId, NameType = (Application.Commands.CommonModels.NameType)type, Value = name }); [HttpPost("EditName")] public async Task EditName([FromQuery] Guid titleId, [FromQuery] Guid languageId, [FromQuery] string name, [FromQuery] NameType type) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Name.EditNameCommand { TitleId = titleId, LanguageId = languageId, NameType = (Application.Commands.CommonModels.NameType)type, Value = name }); [HttpPost("DeleteName")] public async Task DeleteName([FromQuery] Guid titleId, [FromQuery] Guid languageId, [FromQuery] string name, [FromQuery] NameType type) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Name.DeleteNameCommand { TitleId = titleId, LanguageId = languageId, NameType = (Application.Commands.CommonModels.NameType)type, Value = name, }); [HttpPost("SetPreview")] public async Task SetPreview([FromQuery] Guid titleId, [FromQuery] MediaInfoType type, [FromQuery] string url) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Preview.SetPreviewCommand { TitleId = titleId, Type = (Application.Commands.CommonModels.MediaInfoType)type, Url = url, }); [HttpPost("DeletePreview")] public async Task DeletePreview([FromQuery] Guid titleId) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Preview.DeletePreviewCommand { TitleId = titleId, }); [HttpPost("AddDescription")] public async Task AddDescription([FromQuery] Guid titleId, [FromQuery] bool isOriginal, [FromQuery] Guid languageId, [FromQuery] string value) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Description.AddDescriptionCommand { TitleId = titleId, IsOriginal = isOriginal, LanguageId = languageId, Value = value, }); [HttpPost("EditDescription")] public async Task EditDescription([FromQuery] Guid titleId, bool isOriginal, [FromQuery] Guid languageId, [FromQuery] string value, [FromQuery] string newValue) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Description.EditDescriptionCommand { TitleId = titleId, LanguageId = languageId, IsOriginal = isOriginal, Value = value, NewValue = newValue, }); [HttpPost("DeleteDescription")] public async Task DeleteDescription([FromQuery] Guid titleId, bool isOriginal, [FromQuery] Guid languageId, [FromQuery] string value) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Description.DeleteDescriptionCommand { TitleId = titleId, LanguageId = languageId, IsOriginal = isOriginal, Value = value, }); [HttpPost("AddGenre")] public async Task AddDescription([FromQuery] Guid titleId, [FromQuery] Guid genreId, [FromQuery] decimal? proportion) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Genre.AddGenreCommand { TitleId = titleId, GenreId = genreId, Proportion = proportion, }); [HttpPost("SetGenreProportion")] public async Task SetGenreProportion([FromQuery] Guid titleId, [FromQuery] Guid genreId, [FromQuery] decimal? proportion, [FromQuery] decimal? newProportion) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Genre.SetGenreProportionCommand { TitleId = titleId, GenreId = genreId, Proportion = proportion, NewProportion = newProportion }); [HttpPost("DeleteGenre")] public async Task DeleteGenre([FromQuery] Guid titleId, [FromQuery] Guid genreId) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.Genre.DeleteGenreCommand { TitleId = titleId, GenreId = genreId, }); //related content [HttpPost("AddRelatedContent")] public async Task AddDescription([FromQuery] Guid titleId, [FromQuery] MediaInfoType type, [FromQuery] string url) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.RelatedContent.AddRelatedContentCommand { TitleId = titleId, Type = (Application.Commands.CommonModels.MediaInfoType)type, Url = url, }); [HttpPost("EditRelatedContent")] public async Task EditRelatedContent([FromQuery] Guid titleId, [FromQuery] MediaInfoType type, [FromQuery] string url, [FromQuery] MediaInfoType newType, [FromQuery] string newUrl) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.RelatedContent.EditRelatedContentCommand { TitleId = titleId, Type = (Application.Commands.CommonModels.MediaInfoType)type, Url = url, NewType = (Application.Commands.CommonModels.MediaInfoType)newType, NewUrl = newUrl, }); [HttpPost("DeleteRelatedContent")] public async Task DeleteRelatedContent([FromQuery] Guid titleId, [FromQuery] MediaInfoType type, [FromQuery] string url) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.RelatedContent.DeleteRelatedContentCommand { TitleId = titleId, Type = (Application.Commands.CommonModels.MediaInfoType)type, Url = url, }); [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([FromQuery] Guid titleId, [FromQuery] DateTimeOffset? value) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.SetAnnouncementDateCommand { TitleId = titleId, Value = value, }); [HttpPost("SetEstimatedReleaseDate")] public async Task SetEstimatedReleaseDate([FromQuery] Guid titleId, [FromQuery] DateTimeOffset? value) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.SetEstimatedReleaseDateCommand { TitleId = titleId, Value = value, }); [HttpPost("SetReleaseDate")] public async Task SetReleaseDate([FromQuery] Guid titleId, [FromQuery] DateTimeOffset? value) => await _mediator.Send(new Application.Commands.Anime.Title.Properties.SetReleaseDateCommand { TitleId = titleId, Value = value, }); }