Files
ClaudeDo/src/ClaudeDo.Data/Repositories/PrimeScheduleRepository.cs
mika kuns bed4255a5e feat(worker): compute prime due-time from weekday bitmask
Also fixes PrimeScheduleRepository.ListAsync to sort client-side
(SQLite EF Core does not support TimeSpan in ORDER BY clauses).
2026-06-02 16:32:51 +02:00

55 lines
1.9 KiB
C#

// src/ClaudeDo.Data/Repositories/PrimeScheduleRepository.cs
using ClaudeDo.Data.Models;
using Microsoft.EntityFrameworkCore;
namespace ClaudeDo.Data.Repositories;
public sealed class PrimeScheduleRepository
{
private readonly ClaudeDoDbContext _context;
public PrimeScheduleRepository(ClaudeDoDbContext context) => _context = context;
public async Task<IReadOnlyList<PrimeScheduleEntity>> ListAsync(CancellationToken ct = default)
{
var rows = await _context.PrimeSchedules.AsNoTracking().ToListAsync(ct);
return rows.OrderBy(s => s.TimeOfDay).ToList();
}
public async Task<PrimeScheduleEntity?> GetAsync(Guid id, CancellationToken ct = default) =>
await _context.PrimeSchedules.AsNoTracking().FirstOrDefaultAsync(s => s.Id == id, ct);
public async Task UpsertAsync(PrimeScheduleEntity entity, CancellationToken ct = default)
{
var existing = await _context.PrimeSchedules.FirstOrDefaultAsync(s => s.Id == entity.Id, ct);
if (existing is null)
{
_context.PrimeSchedules.Add(entity);
}
else
{
existing.Days = entity.Days;
existing.TimeOfDay = entity.TimeOfDay;
existing.Enabled = entity.Enabled;
existing.PromptOverride = entity.PromptOverride;
}
await _context.SaveChangesAsync(ct);
}
public async Task DeleteAsync(Guid id, CancellationToken ct = default)
{
var row = await _context.PrimeSchedules.FirstOrDefaultAsync(s => s.Id == id, ct);
if (row is null) return;
_context.PrimeSchedules.Remove(row);
await _context.SaveChangesAsync(ct);
}
public async Task UpdateLastRunAsync(Guid id, DateTimeOffset when, CancellationToken ct = default)
{
var row = await _context.PrimeSchedules.FirstOrDefaultAsync(s => s.Id == id, ct);
if (row is null) return;
row.LastRunAt = when;
await _context.SaveChangesAsync(ct);
}
}