using backend.Data; using backend.DTOs; using backend.Email; using backend.Entities; using Microsoft.EntityFrameworkCore; namespace backend.Services { public interface IReviewService { public Task AddReview(CreateReviewRequest review, int userId); public Task> GetReviews(int page, int pageSize); public Task GetCount(); } public class ReviewService : IReviewService { private readonly DataContext _context = null; private readonly IEmailSender _emailSender; public ReviewService(DataContext context, IEmailSender emailSender) { _context = context; _emailSender = emailSender; } public async Task AddReview(CreateReviewRequest review, int userId) { var user = await _context.Users.FindAsync(userId); var res = await _context.Restoraunts.Include(x => x.Reviews).FirstOrDefaultAsync(); if(res.Reviews == null) { res.Reviews = new List(); } res.Reviews.Add(new Review() { Title = review.Title, Description = review.Description, Stars = review.Stars, CreatedAt = DateTime.UtcNow, User = user }); _context.Restoraunts.Update(res); await _context.SaveChangesAsync(); if (review.Stars < 3) { var adminUser = await _context.Users.FirstOrDefaultAsync(x => x.IsAdmin); await _emailSender.SendEmailAsync("Добивте лоша оценка", $"

{review.Title}

{review.Description}

", adminUser.Email); } } public async Task GetCount() { return await _context.Reviews.CountAsync(); } public async Task> GetReviews(int page, int pageSize) { return await _context.Reviews .Include(x => x.User) .OrderByDescending(x => x.CreatedAt) .Skip(page * pageSize) .Take(pageSize) .Select(x => new ReviewResponse() { CreatedAt = x.CreatedAt, Description = x.Description, Id = x.Id, Stars = x.Stars, Title = x.Title, Username = x.User == null ? "Anonymous" : x.User.Email }) .ToListAsync(); } } }