MyBookmark/Modules.Library.WebApi/Controllers/AnimeTitleController.cs
THE_KONDRAT 7b16d72329 ui and login
mongo => postgres
2024-11-03 16:08:39 +03:00

304 lines
13 KiB
C#

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<TitleController> logger)
{
_mapper = mapper;
_mediator = mediator;
_logger = logger;
}
[HttpGet("List")]
public async Task<List<Title>> List() =>
_mapper.Map<List<Title>>(await _mediator.Send(new Application.Queries.Anime.AnimeTitle.AnimeTitleListQuery { UserId = new Guid("8393230f-78e3-473b-a5dc-3221917e0aeb") }));
[HttpGet]
public async Task<Title> 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,
});
}