using BCards.Web.Areas.Support.Models; using MongoDB.Driver; namespace BCards.Web.Areas.Support.Repositories; public class RatingRepository : IRatingRepository { private readonly IMongoCollection _ratings; private readonly ILogger _logger; public RatingRepository(IMongoDatabase database, ILogger logger) { _ratings = database.GetCollection("ratings"); _logger = logger; // Criar índices CreateIndexes(); } private void CreateIndexes() { try { var indexKeysDefinition = Builders.IndexKeys.Descending(r => r.CreatedAt); var indexModel = new CreateIndexModel(indexKeysDefinition); _ratings.Indexes.CreateOne(indexModel); var userIdIndexKeys = Builders.IndexKeys.Ascending(r => r.UserId); var userIdIndexModel = new CreateIndexModel(userIdIndexKeys); _ratings.Indexes.CreateOne(userIdIndexModel); var ratingValueIndexKeys = Builders.IndexKeys.Ascending(r => r.RatingValue); var ratingValueIndexModel = new CreateIndexModel(ratingValueIndexKeys); _ratings.Indexes.CreateOne(ratingValueIndexModel); var cultureIndexKeys = Builders.IndexKeys.Ascending(r => r.Culture); var cultureIndexModel = new CreateIndexModel(cultureIndexKeys); _ratings.Indexes.CreateOne(cultureIndexModel); } catch (Exception ex) { _logger.LogWarning(ex, "Não foi possível criar índices para a collection ratings"); } } public async Task CreateAsync(Rating rating) { try { await _ratings.InsertOneAsync(rating); _logger.LogInformation("Rating criado com sucesso: {RatingId}", rating.Id); return rating; } catch (Exception ex) { _logger.LogError(ex, "Erro ao criar rating"); throw; } } public async Task> GetRecentAsync(int limit = 10) { try { return await _ratings .Find(_ => true) .SortByDescending(r => r.CreatedAt) .Limit(limit) .ToListAsync(); } catch (Exception ex) { _logger.LogError(ex, "Erro ao buscar ratings recentes"); return new List(); } } public async Task GetAverageRatingAsync() { try { var ratings = await _ratings.Find(_ => true).ToListAsync(); if (ratings.Count == 0) return 0; return ratings.Average(r => r.RatingValue); } catch (Exception ex) { _logger.LogError(ex, "Erro ao calcular média de ratings"); return 0; } } public async Task GetTotalCountAsync() { try { return (int)await _ratings.CountDocumentsAsync(_ => true); } catch (Exception ex) { _logger.LogError(ex, "Erro ao contar ratings"); return 0; } } public async Task> GetByUserIdAsync(string userId) { try { return await _ratings .Find(r => r.UserId == userId) .SortByDescending(r => r.CreatedAt) .ToListAsync(); } catch (Exception ex) { _logger.LogError(ex, "Erro ao buscar ratings do usuário {UserId}", userId); return new List(); } } }