using System; using System.Threading.Tasks; using API.Data; using API.Data.Repositories; using API.DTOs; using API.Extensions; using API.Services; using API.Services.Plus; using Microsoft.AspNetCore.Mvc; namespace API.Controllers; #nullable enable /// /// Responsible for providing external ratings for Series /// public class RatingController : BaseApiController { private readonly IUnitOfWork _unitOfWork; private readonly IRatingService _ratingService; private readonly ILocalizationService _localizationService; public RatingController(IUnitOfWork unitOfWork, IRatingService ratingService, ILocalizationService localizationService) { _unitOfWork = unitOfWork; _ratingService = ratingService; _localizationService = localizationService; } /// /// Update the users' rating of the given series /// /// /// /// [HttpPost("series")] public async Task UpdateSeriesRating(UpdateRatingDto updateRating) { var user = await _unitOfWork.UserRepository.GetUserByIdAsync(User.GetUserId(), AppUserIncludes.Ratings | AppUserIncludes.ChapterRatings); if (user == null) throw new UnauthorizedAccessException(); if (await _ratingService.UpdateSeriesRating(user, updateRating)) { return Ok(); } return BadRequest(await _localizationService.Translate(User.GetUserId(), "generic-error")); } /// /// Update the users' rating of the given chapter /// /// chapterId must be set /// /// [HttpPost("chapter")] public async Task UpdateChapterRating(UpdateRatingDto updateRating) { var user = await _unitOfWork.UserRepository.GetUserByIdAsync(User.GetUserId(), AppUserIncludes.Ratings | AppUserIncludes.ChapterRatings); if (user == null) throw new UnauthorizedAccessException(); if (await _ratingService.UpdateChapterRating(user, updateRating)) { return Ok(); } return BadRequest(await _localizationService.Translate(User.GetUserId(), "generic-error")); } /// /// Overall rating from all Kavita users for a given Series /// /// /// [HttpGet("overall-series")] public async Task> GetOverallSeriesRating(int seriesId) { return Ok(new RatingDto() { Provider = ScrobbleProvider.Kavita, AverageScore = await _unitOfWork.SeriesRepository.GetAverageUserRating(seriesId, User.GetUserId()), FavoriteCount = 0, }); } /// /// Overall rating from all Kavita users for a given Chapter /// /// /// [HttpGet("overall-chapter")] public async Task> GetOverallChapterRating(int chapterId) { return Ok(new RatingDto() { Provider = ScrobbleProvider.Kavita, AverageScore = await _unitOfWork.ChapterRepository.GetAverageUserRating(chapterId, User.GetUserId()), FavoriteCount = 0, }); } }