using MongoDB.Driver; using QuestionsApi.Models; namespace QuestionsApi.Services.Flashcards; public sealed class FlashcardSettingsStore { private readonly IMongoCollection _settings; public FlashcardSettingsStore(MongoDatabaseProvider mongo) { _settings = mongo.Database.GetCollection("FlashcardSettings"); _settings.Indexes.CreateOne(new CreateIndexModel( Builders.IndexKeys.Ascending(v => v.UserId), new CreateIndexOptions { Unique = true, Name = "flashcard_settings_unique_user" })); } public async Task GetAsync(string userId) => await _settings.Find(v => v.UserId == userId).FirstOrDefaultAsync() ?? new FlashcardSettings { UserId = userId }; public async Task UpdateAsync(string userId, UpdateFlashcardSettingsRequest request) { var now = DateTime.UtcNow; return await _settings.FindOneAndUpdateAsync( v => v.UserId == userId, Builders.Update .Set(v => v.NewCardsPerDay, Math.Clamp(request.NewCardsPerDay, 0, 2000)) .Set(v => v.ReviewsPerDay, Math.Clamp(request.ReviewsPerDay, 0, 5000)) .Set(v => v.DesiredRetention, FsrsFlashcardScheduler.DesiredRetention) .Set(v => v.UpdatedUtc, now) .Inc(v => v.Revision, 1) .SetOnInsert(v => v.UserId, userId), new FindOneAndUpdateOptions { IsUpsert = true, ReturnDocument = ReturnDocument.After }); } }