using ClaudeDo.Data.Models; using Microsoft.EntityFrameworkCore; namespace ClaudeDo.Data.Repositories; /// Reads and writes mission_control_sessions. public sealed class MissionControlSessionRepository { private readonly ClaudeDoDbContext _context; public MissionControlSessionRepository(ClaudeDoDbContext context) => _context = context; /// Inserts the session unless it is already recorded — a resumed task session keeps /// its original row and start time. public async Task RecordAsync(MissionControlSessionEntity session, CancellationToken ct = default) { if (await _context.MissionControlSessions.AnyAsync(s => s.SessionId == session.SessionId, ct)) return; _context.MissionControlSessions.Add(session); await _context.SaveChangesAsync(ct); } /// The recorded session, or null. public async Task GetAsync(string sessionId, CancellationToken ct = default) => await _context.MissionControlSessions.AsNoTracking().FirstOrDefaultAsync(s => s.SessionId == sessionId, ct); /// Sessions started since , newest first, at most . public async Task> ListRecentAsync( DateTime sinceUtc, int max, CancellationToken ct = default) => await _context.MissionControlSessions.AsNoTracking() .Where(s => s.StartedAt >= sinceUtc) .OrderByDescending(s => s.StartedAt) .Take(max) .ToListAsync(ct); }