using System; using System.Threading.Tasks; using Kavita.API.Database; using Kavita.API.Repositories; using Kavita.API.Services; using Kavita.Models.DTOs; using Kavita.Models.Entities.Enums; using Kavita.Server.Attributes; using Microsoft.AspNetCore.Mvc; namespace Kavita.Server.Controllers; /// /// Responsible for providing external ratings for Series /// public class RatingController( IUnitOfWork unitOfWork, IRatingService ratingService, ILocalizationService localizationService) : BaseApiController { /// /// Update the users' rating of the given series /// /// /// /// [HttpPost("series")] public async Task UpdateSeriesRating(UpdateRatingDto updateRating) { var user = await unitOfWork.UserRepository.GetUserByIdAsync(UserId, AppUserIncludes.Ratings | AppUserIncludes.ChapterRatings); if (user == null) throw new UnauthorizedAccessException(); if (!await unitOfWork.UserRepository.HasAccessToSeries(UserId, updateRating.SeriesId)) return NotFound(); if (await ratingService.UpdateSeriesRating(user, updateRating)) { return Ok(); } return BadRequest(await localizationService.Translate(UserId, "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(UserId, AppUserIncludes.Ratings | AppUserIncludes.ChapterRatings); if (user == null) throw new UnauthorizedAccessException(); if (!await unitOfWork.UserRepository.HasAccessToSeries(UserId, updateRating.SeriesId)) return NotFound(); if (await ratingService.UpdateChapterRating(user, updateRating)) { return Ok(); } return BadRequest(await localizationService.Translate(UserId, "generic-error")); } /// /// Overall rating from all Kavita users for a given Series /// /// /// [SeriesAccess] [HttpGet("overall-series")] public async Task> GetOverallSeriesRating(int seriesId) { return Ok(new RatingDto() { Provider = ScrobbleProvider.Kavita, AverageScore = await unitOfWork.SeriesRepository.GetAverageUserRating(seriesId, UserId), FavoriteCount = 0, }); } /// /// Overall rating from all Kavita users for a given Chapter /// /// /// [ChapterAccess] [HttpGet("overall-chapter")] public async Task> GetOverallChapterRating(int chapterId) { return Ok(new RatingDto() { Provider = ScrobbleProvider.Kavita, AverageScore = await unitOfWork.ChapterRepository.GetAverageUserRating(chapterId, UserId), FavoriteCount = 0, }); } }