Slice 6 of the worker state and queue consolidation refactor. * Drop Manual, Planning, Planned, Draft, Waiting from the TaskStatus enum and from the EF value converter; only the lifecycle values remain (Idle, Queued, Running, Done, Failed, Cancelled). * Add migration RetireLegacyTaskStatus that rewrites existing rows: manual/draft -> idle, planning -> idle+planning_phase=active, planned -> idle+planning_phase=finalized, waiting -> queued+blocked_by derived from sort_order via a CTE with LAG(). * Reroute every call site that compared/set legacy values to the new three-field model (Status + PlanningPhase + BlockedByTaskId), including the planning repo helpers, MCP services, the planning chain coordinator, and the UI view-models. TaskRowViewModel now exposes PlanningPhase to drive the planning badge. * Refresh Worker/CLAUDE.md and Data/CLAUDE.md, the docs/plan.md status section, and the planning verification notes in docs/open.md.
41 lines
1.3 KiB
C#
41 lines
1.3 KiB
C#
using ClaudeDo.Data.Repositories;
|
|
using Microsoft.AspNetCore.Http;
|
|
|
|
namespace ClaudeDo.Worker.Planning;
|
|
|
|
public sealed class PlanningTokenAuthMiddleware
|
|
{
|
|
private readonly RequestDelegate _next;
|
|
|
|
public PlanningTokenAuthMiddleware(RequestDelegate next) => _next = next;
|
|
|
|
public async Task InvokeAsync(HttpContext ctx, TaskRepository tasks)
|
|
{
|
|
if (!ctx.Request.Path.StartsWithSegments("/mcp"))
|
|
{
|
|
await _next(ctx);
|
|
return;
|
|
}
|
|
|
|
var auth = ctx.Request.Headers["Authorization"].ToString();
|
|
if (!auth.StartsWith("Bearer ", StringComparison.OrdinalIgnoreCase))
|
|
{
|
|
ctx.Response.StatusCode = 401;
|
|
await ctx.Response.WriteAsync("Missing bearer token");
|
|
return;
|
|
}
|
|
|
|
var token = auth.Substring("Bearer ".Length).Trim();
|
|
var parent = await tasks.FindByPlanningTokenAsync(token, ctx.RequestAborted);
|
|
if (parent is null || parent.PlanningPhase != ClaudeDo.Data.Models.PlanningPhase.Active)
|
|
{
|
|
ctx.Response.StatusCode = 401;
|
|
await ctx.Response.WriteAsync("Invalid or expired planning token");
|
|
return;
|
|
}
|
|
|
|
ctx.Items["PlanningContext"] = new PlanningMcpContext { ParentTaskId = parent.Id };
|
|
await _next(ctx);
|
|
}
|
|
}
|