using MediatR; using Modules.Library.Application.Gateways; using Modules.Rating.Api.Commands; using Modules.User.Application; namespace Modules.Library.Application.Commands.Anime.Title; public class VoteTitleCommand : IRequest { public Guid TitleId { get; set; } public ushort RatingPercentage { get; set; } } public class VoteTitleCommandHandler(IAnimeTitleGateway titleGateway, UserContext userContext, IMediator mediator) : IRequestHandler { public async Task Handle(VoteTitleCommand request, CancellationToken cancellationToken) { var user = await userContext.GetUserInfo(cancellationToken); if (!user.IsAuthenticated || (!user.Id.HasValue || user.Id == Guid.Empty)) { throw new Exception("User is not authenticated"); } var subjectId = user.Id.Value; var title = await titleGateway.GetById(request.TitleId); if (!title.Deleted) { await mediator.Send(new VoteForObjectCommand { ObjectId = title.Id, SubjectId = subjectId, RatingPercentage = request.RatingPercentage }, cancellationToken); } return Unit.Value; } }