LiteDbCombatSessionStore.cs
1 using GUNRPG.Application.Sessions; 2 using LiteDB; 3 4 namespace GUNRPG.Infrastructure.Persistence; 5 6 /// <summary> 7 /// LiteDB-backed implementation of ICombatSessionStore. 8 /// Persists combat session snapshots in an embedded document database. 9 /// Thread-safe for concurrent requests. 10 /// </summary> 11 public sealed class LiteDbCombatSessionStore : ICombatSessionStore 12 { 13 private readonly ILiteCollection<CombatSessionSnapshot> _sessions; 14 15 public LiteDbCombatSessionStore(LiteDatabase database) 16 { 17 _sessions = (database ?? throw new ArgumentNullException(nameof(database))) 18 .GetCollection<CombatSessionSnapshot>("combat_sessions"); 19 20 // Ensure index on Id for fast lookups 21 _sessions.EnsureIndex(x => x.Id); 22 } 23 24 public Task SaveAsync(CombatSessionSnapshot snapshot) 25 { 26 if (snapshot == null) 27 throw new ArgumentNullException(nameof(snapshot)); 28 29 _sessions.Upsert(snapshot.Id, snapshot); 30 return Task.CompletedTask; 31 } 32 33 public Task<CombatSessionSnapshot?> LoadAsync(Guid id) 34 { 35 var snapshot = _sessions.FindById(id); 36 return Task.FromResult<CombatSessionSnapshot?>(snapshot); 37 } 38 39 public Task DeleteAsync(Guid id) 40 { 41 _sessions.Delete(id); 42 return Task.CompletedTask; 43 } 44 45 public Task<IReadOnlyCollection<CombatSessionSnapshot>> ListAsync() 46 { 47 var snapshots = _sessions.FindAll().ToArray(); 48 IReadOnlyCollection<CombatSessionSnapshot> result = snapshots; 49 return Task.FromResult(result); 50 } 51 }