feat(worker): hub methods for week report and daily notes

This commit is contained in:
mika kuns
2026-06-03 09:44:45 +02:00
parent 4aa4353d11
commit d7558ef451
2 changed files with 44 additions and 1 deletions

View File

@@ -1,3 +1,4 @@
using System.Globalization;
using System.Reflection; using System.Reflection;
using ClaudeDo.Data; using ClaudeDo.Data;
using ClaudeDo.Data.Models; using ClaudeDo.Data.Models;
@@ -7,6 +8,8 @@ using ClaudeDo.Worker.Lifecycle;
using ClaudeDo.Worker.Planning; using ClaudeDo.Worker.Planning;
using ClaudeDo.Worker.Prime; using ClaudeDo.Worker.Prime;
using ClaudeDo.Worker.Queue; using ClaudeDo.Worker.Queue;
using ClaudeDo.Worker.Report;
using ClaudeDo.Worker.Report.Interfaces;
using ClaudeDo.Worker.State; using ClaudeDo.Worker.State;
using ClaudeDo.Worker.Worktrees; using ClaudeDo.Worker.Worktrees;
using TaskStatus = ClaudeDo.Data.Models.TaskStatus; using TaskStatus = ClaudeDo.Data.Models.TaskStatus;
@@ -75,6 +78,7 @@ public sealed class WorkerHub : Microsoft.AspNetCore.SignalR.Hub
private readonly PlanningChainCoordinator _planningChain; private readonly PlanningChainCoordinator _planningChain;
private readonly IPrimeScheduleSignal _primeSignal; private readonly IPrimeScheduleSignal _primeSignal;
private readonly ITaskStateService _state; private readonly ITaskStateService _state;
private readonly IWeekReportService _report;
public WorkerHub( public WorkerHub(
QueueService queue, QueueService queue,
@@ -92,7 +96,8 @@ public sealed class WorkerHub : Microsoft.AspNetCore.SignalR.Hub
PlanningMergeOrchestrator planningMergeOrchestrator, PlanningMergeOrchestrator planningMergeOrchestrator,
PlanningChainCoordinator planningChain, PlanningChainCoordinator planningChain,
IPrimeScheduleSignal primeSignal, IPrimeScheduleSignal primeSignal,
ITaskStateService state) ITaskStateService state,
IWeekReportService report)
{ {
_queue = queue; _queue = queue;
_waker = waker; _waker = waker;
@@ -110,6 +115,7 @@ public sealed class WorkerHub : Microsoft.AspNetCore.SignalR.Hub
_planningChain = planningChain; _planningChain = planningChain;
_primeSignal = primeSignal; _primeSignal = primeSignal;
_state = state; _state = state;
_report = report;
} }
// Maps the two exceptions service methods throw into client-facing HubExceptions: // Maps the two exceptions service methods throw into client-facing HubExceptions:
@@ -520,4 +526,38 @@ public sealed class WorkerHub : Microsoft.AspNetCore.SignalR.Hub
await new PrimeScheduleRepository(ctx).DeleteAsync(id); await new PrimeScheduleRepository(ctx).DeleteAsync(id);
_primeSignal.Signal(); _primeSignal.Signal();
} }
private static DateOnly Day(string iso) => DateOnly.ParseExact(iso, "yyyy-MM-dd", CultureInfo.InvariantCulture);
public Task<string?> GetWeekReport(string startIso, string endIso) =>
_report.GetStoredAsync(Day(startIso), Day(endIso));
public Task<string> GenerateWeekReport(string startIso, string endIso) =>
HubGuard(() => _report.GenerateAsync(Day(startIso), Day(endIso)), "report generation failed");
public async Task<List<DailyNoteDto>> GetDailyNotes(string dayIso)
{
using var ctx = _dbFactory.CreateDbContext();
var notes = await new DailyNoteRepository(ctx).ListByDayAsync(Day(dayIso));
return notes.Select(n => new DailyNoteDto(n.Id, n.Date.ToString("yyyy-MM-dd"), n.Text, n.SortOrder)).ToList();
}
public async Task<DailyNoteDto> AddDailyNote(string dayIso, string text)
{
using var ctx = _dbFactory.CreateDbContext();
var n = await new DailyNoteRepository(ctx).AddAsync(Day(dayIso), text);
return new DailyNoteDto(n.Id, n.Date.ToString("yyyy-MM-dd"), n.Text, n.SortOrder);
}
public async Task UpdateDailyNote(string id, string text)
{
using var ctx = _dbFactory.CreateDbContext();
await new DailyNoteRepository(ctx).UpdateAsync(id, text);
}
public async Task DeleteDailyNote(string id)
{
using var ctx = _dbFactory.CreateDbContext();
await new DailyNoteRepository(ctx).DeleteAsync(id);
}
} }

View File

@@ -0,0 +1,3 @@
namespace ClaudeDo.Worker.Report;
public sealed record DailyNoteDto(string Id, string Date, string Text, int SortOrder);