using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using API.Constants; using API.Data; using API.DTOs; using API.Services.Plus; using EasyCaching.Core; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; namespace API.Controllers; /// /// Responsible for providing external ratings for Series /// public class RatingController : BaseApiController { private readonly ILicenseService _licenseService; private readonly IRatingService _ratingService; private readonly ILogger _logger; private readonly IUnitOfWork _unitOfWork; private readonly IEasyCachingProvider _cacheProvider; public const string CacheKey = "rating_"; public RatingController(ILicenseService licenseService, IRatingService ratingService, ILogger logger, IEasyCachingProviderFactory cachingProviderFactory, IUnitOfWork unitOfWork) { _licenseService = licenseService; _ratingService = ratingService; _logger = logger; _unitOfWork = unitOfWork; _cacheProvider = cachingProviderFactory.GetCachingProvider(EasyCacheProfiles.KavitaPlusRatings); } /// /// Get the external ratings for a given series /// /// /// [HttpGet] [ResponseCache(CacheProfileName = ResponseCacheProfiles.KavitaPlus, VaryByQueryKeys = new []{"seriesId"})] public async Task>> GetRating(int seriesId) { if (!await _licenseService.HasActiveLicense()) { return Ok(Enumerable.Empty()); } var cacheKey = CacheKey + seriesId; var results = await _cacheProvider.GetAsync>(cacheKey); if (results.HasValue) { return Ok(results.Value); } var ratings = await _ratingService.GetRatings(seriesId); await _cacheProvider.SetAsync(cacheKey, ratings, TimeSpan.FromHours(24)); _logger.LogDebug("Caching external rating for {Key}", cacheKey); return Ok(ratings); } [HttpGet("overall")] public async Task> GetOverallRating(int seriesId) { return Ok(new RatingDto() { Provider = ScrobbleProvider.Kavita, AverageScore = await _unitOfWork.SeriesRepository.GetAverageUserRating(seriesId), FavoriteCount = 0 }); } }