using ClaudeDo.Data.Models; using Microsoft.EntityFrameworkCore; namespace ClaudeDo.Data.Repositories; public sealed class ListRepository { private readonly ClaudeDoDbContext _context; public ListRepository(ClaudeDoDbContext context) => _context = context; public async Task AddAsync(ListEntity entity, CancellationToken ct = default) { _context.Lists.Add(entity); await _context.SaveChangesAsync(ct); } public async Task UpdateAsync(ListEntity entity, CancellationToken ct = default) { _context.Lists.Update(entity); await _context.SaveChangesAsync(ct); } public async Task DeleteAsync(string listId, CancellationToken ct = default) { await _context.Lists.Where(l => l.Id == listId).ExecuteDeleteAsync(ct); } public async Task GetByIdAsync(string listId, CancellationToken ct = default) { return await _context.Lists.FirstOrDefaultAsync(l => l.Id == listId, ct); } public async Task> GetAllAsync(CancellationToken ct = default) { return await _context.Lists.OrderBy(l => l.SortOrder).ThenBy(l => l.CreatedAt).ToListAsync(ct); } public async Task ReorderAsync(IReadOnlyList orderedListIds, CancellationToken ct = default) { var idSet = orderedListIds.ToHashSet(); var entities = await _context.Lists.Where(l => idSet.Contains(l.Id)).ToListAsync(ct); for (int i = 0; i < orderedListIds.Count; i++) { var e = entities.FirstOrDefault(x => x.Id == orderedListIds[i]); if (e is not null) e.SortOrder = i; } await _context.SaveChangesAsync(ct); } public async Task GetConfigAsync(string listId, CancellationToken ct = default) { return await _context.ListConfigs.FirstOrDefaultAsync(c => c.ListId == listId, ct); } public async Task SetConfigAsync(ListConfigEntity config, CancellationToken ct = default) { var existing = await _context.ListConfigs.FirstOrDefaultAsync(c => c.ListId == config.ListId, ct); if (existing is null) { _context.ListConfigs.Add(config); } else { existing.Model = config.Model; existing.SystemPrompt = config.SystemPrompt; existing.AgentPath = config.AgentPath; existing.MaxTurns = config.MaxTurns; } await _context.SaveChangesAsync(ct); } public async Task DeleteConfigAsync(string listId, CancellationToken ct = default) { var affected = await _context.ListConfigs .Where(c => c.ListId == listId) .ExecuteDeleteAsync(ct); return affected > 0; } }