Files
2026-07-15 20:55:13 -05:00

57 lines
3.0 KiB
C#

using MongoDB.Bson;
using MongoDB.Driver;
using QuestionsApi.Models;
namespace QuestionsApi.Services;
public sealed class AppFeedbackStore
{
private readonly IMongoCollection<AppFeedback> _feedback;
public AppFeedbackStore(MongoDatabaseProvider mongo)
{
_feedback = mongo.Database.GetCollection<AppFeedback>("AppFeedback");
_feedback.Indexes.CreateMany([
new CreateIndexModel<AppFeedback>(Builders<AppFeedback>.IndexKeys.Ascending(value => value.Status).Descending(value => value.CreatedUtc)),
new CreateIndexModel<AppFeedback>(Builders<AppFeedback>.IndexKeys.Ascending(value => value.Category).Descending(value => value.CreatedUtc)),
new CreateIndexModel<AppFeedback>(Builders<AppFeedback>.IndexKeys.Ascending(value => value.UserId).Descending(value => value.CreatedUtc))
]);
}
public async Task<AppFeedback> CreateAsync(string userId, CreateAppFeedbackRequest request)
{
var now = DateTime.UtcNow;
var report = new AppFeedback {
UserId = userId, Category = request.Category.Trim().ToLowerInvariant(), Details = request.Details.Trim(),
Context = request.Context ?? new AppFeedbackContext(), CreatedUtc = now, UpdatedUtc = now
};
await _feedback.InsertOneAsync(report);
return report;
}
public async Task<AppFeedback?> GetAsync(string id) => ObjectId.TryParse(id, out _)
? await _feedback.Find(value => value.Id == id).FirstOrDefaultAsync() : null;
public async Task<AppFeedbackListResponse> SearchAsync(string status, string category, string userId, int skip, int limit)
{
var filter = Builders<AppFeedback>.Filter.Empty;
if (status != "all") filter &= Builders<AppFeedback>.Filter.Eq(value => value.Status, status);
if (category.Length > 0) filter &= Builders<AppFeedback>.Filter.Eq(value => value.Category, category);
if (userId.Length > 0) filter &= Builders<AppFeedback>.Filter.Eq(value => value.UserId, userId);
var total = await _feedback.CountDocumentsAsync(filter);
var items = await _feedback.Find(filter).SortByDescending(value => value.CreatedUtc).Skip(skip).Limit(limit).ToListAsync();
return new AppFeedbackListResponse { Items = items, Total = total, Skip = skip, Limit = limit };
}
public async Task<AppFeedback?> CloseAsync(string id, string status, string reviewer, string note)
{
if (!ObjectId.TryParse(id, out _)) return null;
var now = DateTime.UtcNow;
return await _feedback.FindOneAndUpdateAsync(
value => value.Id == id && value.Status == QuestionReportStatus.Open,
Builders<AppFeedback>.Update.Set(value => value.Status, status).Set(value => value.ReviewerNote, note)
.Set(value => value.ReviewedByUserId, reviewer).Set(value => value.ReviewedUtc, now).Set(value => value.UpdatedUtc, now),
new FindOneAndUpdateOptions<AppFeedback> { ReturnDocument = ReturnDocument.After });
}
}