import { inject, injectable } from "@codemation/core"; import type { Hono } from "hono"; import { ApplicationTokens } from "../applicationTokens"; import type { QueryBus } from "../application/bus/QueryBus"; import type { CreateRunRequest } from "../application/contracts/RunContracts"; import { ListWorkflowRunsQuery } from "../application/queries/ListWorkflowRunsQuery"; import { GetWorkflowRunDetailQuery } from "../application/queries/GetWorkflowRunDetailQuery"; import { InternalHmacAuthMiddleware } from "../pairing/InternalHmacAuthMiddleware"; import { RunHttpRouteHandler } from "../presentation/http/routeHandlers/RunHttpRouteHandler"; import type { InternalHonoApiRouteRegistrar } from "../presentation/http/hono/InternalHonoApiRouteRegistrar"; @injectable() export class InternalRunsRegistrar implements InternalHonoApiRouteRegistrar { constructor( @inject(InternalHmacAuthMiddleware) private readonly hmacMiddleware: InternalHmacAuthMiddleware, @inject(ApplicationTokens.QueryBus) private readonly queryBus: QueryBus, @inject(RunHttpRouteHandler) private readonly runHttpRouteHandler: RunHttpRouteHandler, ) {} register(app: Hono): void { app.post("/internal/runs", this.hmacMiddleware.handle(), async (c) => { const rawBody = c.get("body" as never) as string | undefined; const body = (rawBody ? JSON.parse(rawBody) : await c.req.json()) as CreateRunRequest & { workflowId?: string; }; if (!body.workflowId || typeof body.workflowId !== "string") { return c.json({ error: "workflowId is required" }, 400); } const acceptsSse = (c.req.header("accept") ?? "").includes("text/event-stream"); return this.runHttpRouteHandler.runOrStream(body as CreateRunRequest, acceptsSse); }); app.get("/internal/workflows/:workflowId/runs", this.hmacMiddleware.handle(), async (c) => { const runs = await this.queryBus.execute(new ListWorkflowRunsQuery(c.req.param("workflowId"))); return c.json(runs as never); }); app.get("/internal/runs/:runId/detail", this.hmacMiddleware.handle(), async (c) => { const detail = await this.queryBus.execute(new GetWorkflowRunDetailQuery(c.req.param("runId"))); return c.json(detail as never); }); } }