41 lines
1.3 KiB
C#
41 lines
1.3 KiB
C#
using System;
|
|
using System.Linq;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using Nashel.Modules.Reputation.Domain.Repositories;
|
|
|
|
namespace Nashel.Modules.Reputation.Domain.Services;
|
|
|
|
/// <summary>
|
|
/// Сервис для расчета рейтинга пользователей.
|
|
/// </summary>
|
|
public class RatingCalculator
|
|
{
|
|
private readonly IReviewRepository _reviewRepository;
|
|
|
|
public RatingCalculator(IReviewRepository reviewRepository)
|
|
{
|
|
_reviewRepository = reviewRepository;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Вычисляет средний рейтинг пользователя на основе всех его отзывов.
|
|
/// </summary>
|
|
/// <returns>Средний рейтинг (double) или 0, если отзывов нет.</returns>
|
|
public async Task<double> CalculateAverage(Guid targetId, CancellationToken cancellationToken = default)
|
|
{
|
|
var reviews = await _reviewRepository.GetByTargetIdAsync(targetId, cancellationToken);
|
|
|
|
if (reviews == null || !reviews.Any())
|
|
{
|
|
return 0.0;
|
|
}
|
|
|
|
// Простое среднее арифметическое
|
|
double avg = reviews.Average(r => r.Rating);
|
|
|
|
// Округлим до 1 знака (опционально)
|
|
return Math.Round(avg, 1);
|
|
}
|
|
}
|