feat(worker): Ticket-Status-Rueckmeldung ueber TaskStateService

This commit is contained in:
mika kuns
2026-08-27 12:53:38 +02:00
parent 1065278021
commit 5aafeb6c3d
7 changed files with 418 additions and 26 deletions
@@ -1,9 +1,11 @@
using ClaudeDo.Data;
using ClaudeDo.Worker.Config;
using ClaudeDo.Worker.Git;
using ClaudeDo.Worker.Hub;
using ClaudeDo.Worker.Planning;
using ClaudeDo.Worker.Queue;
using ClaudeDo.Worker.State;
using ClaudeDo.Worker.Tickets;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging.Abstractions;
@@ -31,6 +33,18 @@ public static class TaskStateServiceBuilder
var waker = new CountingQueueWaker();
var runCancels = new RunCancellationRegistry(NullLogger<RunCancellationRegistry>.Instance);
// Unconfigured on purpose: no base URL, no PAT file at this (unused) path — IsConfigured
// is false, so TicketStatusSync.SyncAsync short-circuits before touching the DB or the
// network. Tests that care about ticket sync build TicketStatusSync themselves.
var ticketConfig = new TicketSystemConfig(
new WorkerConfig(),
new TicketPatStore(new DpapiTokenStore(Path.Combine(Path.GetTempPath(), $"cdo-unused-pat-{Guid.NewGuid():N}"))));
var ticketSync = new TicketStatusSync(
ticketConfig,
new TicketClientFactory(ticketConfig, new NoopHttpClientFactory(), NullLogger<BandelTicketClient>.Instance),
dbFactory,
NullLogger<TicketStatusSync>.Instance);
TaskStateService? state = null;
var chain = new PlanningChainCoordinator(dbFactory, () => state!);
state = new TaskStateService(
@@ -41,7 +55,8 @@ public static class TaskStateServiceBuilder
runCancels,
mergeState ?? (() => NoActiveMergeState.Instance),
baseDirtyChecker ?? new BaseDirtyChecker(new ClaudeDo.Data.Git.GitService(), NullLogger<BaseDirtyChecker>.Instance),
NullLogger<TaskStateService>.Instance);
NullLogger<TaskStateService>.Instance,
ticketSync);
return new Built(state, chain, hub, () => waker.Count, waker, runCancels);
}
@@ -53,6 +68,14 @@ file sealed class NoActiveMergeState : IActiveMergeState
public bool HasActiveMerge(string taskId) => false;
}
// Never actually invoked: TicketSystemConfig.IsConfigured is false in every TaskStateServiceBuilder
// test, so TicketClientFactory.Create() returns null before this factory would be called.
file sealed class NoopHttpClientFactory : IHttpClientFactory
{
public HttpClient CreateClient(string name) => throw new InvalidOperationException(
"Unexpected: ticket sync is not configured in tests built via TaskStateServiceBuilder.");
}
public sealed class CountingQueueWaker : IQueueWaker
{
private int _count;