feat: изменил логику анализа отзывов
Backend CI / build-and-test (push) Failing after 14m19s
🚀 Create and publish a Docker image / Detect changes in backend and frontend (push) Failing after 12m5s
Frontend CI / build-and-check (push) Failing after 17m58s
🚀 Create and publish a Docker image / Build & publish frontend image (push) Failing after 10m11s
🚀 Create and publish a Docker image / Build & publish backend image (push) Failing after 11m3s
🚀 Create and publish a Docker image / Update stack on Portainer (push) Failing after 14m58s

This commit is contained in:
2026-05-22 01:30:41 +03:00
parent 168d6af860
commit 8ac593d36f
36 changed files with 858 additions and 457 deletions
@@ -14,11 +14,16 @@ public class ReviewService : IReviewService
{
private readonly AppDbContext _db;
private readonly IGamificationService _gamification;
private readonly IReviewAnalysisQueue _reviewAnalysisQueue;
public ReviewService(AppDbContext db, IGamificationService gamification)
public ReviewService(
AppDbContext db,
IGamificationService gamification,
IReviewAnalysisQueue reviewAnalysisQueue)
{
_db = db;
_gamification = gamification;
_reviewAnalysisQueue = reviewAnalysisQueue;
}
private IQueryable<Review> BaseQuery() => _db.Reviews
@@ -38,6 +43,7 @@ public class ReviewService : IReviewService
_db.Reviews.Add(review);
await _db.SaveChangesAsync();
await _gamification.CheckAndAwardAchievementsAsync(userId);
await _reviewAnalysisQueue.EnqueueAsync(review.Id);
var full = await BaseQuery().FirstAsync(r => r.Id == review.Id);
return full.ToDto();
}
@@ -54,9 +60,10 @@ public class ReviewService : IReviewService
var review = await _db.Reviews.FindAsync(id) ?? throw new NotFoundException("Review", id);
if (review.UserId != userId) throw new ForbiddenException();
review.Rating = req.Rating; review.Text = req.Text;
review.LlmStatus = ReviewLlmStatus.Pending;
ResetLlmAnalysis(review);
review.UpdatedAt = DateTime.UtcNow;
await _db.SaveChangesAsync();
await _reviewAnalysisQueue.EnqueueAsync(review.Id);
return await GetByIdAsync(id);
}
@@ -86,29 +93,34 @@ public class ReviewService : IReviewService
return PagedResult<ReviewDto>.Create(items.Select(r => r.ToDto()).ToList(), total, pagination.Page, pagination.PageSize);
}
public async Task<PagedResult<ReviewDto>> GetAllAsync(PaginationRequest pagination)
public async Task<PagedResult<ReviewDto>> GetAllAsync(ReviewFilterRequest filter)
{
var query = BaseQuery();
if (filter.LlmStatus.HasValue)
query = query.Where(r => r.LlmStatus == filter.LlmStatus.Value);
var total = await query.CountAsync();
var items = await query.OrderByDescending(r => r.CreatedAt)
.Skip((pagination.Page - 1) * pagination.PageSize).Take(pagination.PageSize).ToListAsync();
return PagedResult<ReviewDto>.Create(items.Select(r => r.ToDto()).ToList(), total, pagination.Page, pagination.PageSize);
}
public async Task<PagedResult<ReviewDto>> GetPendingAsync(PaginationRequest pagination)
{
var query = BaseQuery().Where(r => r.LlmStatus == ReviewLlmStatus.Pending);
var total = await query.CountAsync();
var items = await query.OrderBy(r => r.CreatedAt)
.Skip((pagination.Page - 1) * pagination.PageSize).Take(pagination.PageSize).ToListAsync();
return PagedResult<ReviewDto>.Create(items.Select(r => r.ToDto()).ToList(), total, pagination.Page, pagination.PageSize);
.Skip((filter.Page - 1) * filter.PageSize).Take(filter.PageSize).ToListAsync();
return PagedResult<ReviewDto>.Create(items.Select(r => r.ToDto()).ToList(), total, filter.Page, filter.PageSize);
}
public async Task ReanalyzeAsync(int id)
{
var review = await _db.Reviews.FindAsync(id) ?? throw new NotFoundException("Review", id);
review.LlmStatus = ReviewLlmStatus.Pending;
ResetLlmAnalysis(review);
review.UpdatedAt = DateTime.UtcNow;
await _db.SaveChangesAsync();
await _reviewAnalysisQueue.EnqueueAsync(review.Id);
}
private static void ResetLlmAnalysis(Review review)
{
review.LlmStatus = ReviewLlmStatus.Pending;
review.Sentiment = null;
review.QualityScore = null;
review.IsInformative = null;
review.LlmTags = null;
review.LlmRawOutput = null;
}
}