/ GUNRPG.Infrastructure / Persistence / LiteDbCombatSessionStore.cs
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  }