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);
|
||
}
|
||
}
|