57 lines
3.0 KiB
C#
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 });
|
|
}
|
|
}
|