/**
* POST /ds-agent/commands/{command_id}/complete — zip の送信完了(指示書AY 段階7-3。D15・D25 ①・D-179)
*
* 仕様の正は `d-watch-api.yaml` の同パス。★URL の command_id は export の指示の id★。
* 受け取った合計・SHA-256 を prepared と照合し、違えば 400 `result_invalid`(ブラウザ側のダウンロードは失敗になる)。
*/
import { NextResponse } from "next/server";
import { agentCommandPreamble, commandNotFound, jsonError, noContent } from "@/lib/ds-agent/agent-request";
import { getRelay } from "@/lib/ds-agent/relay";
import { ensureDsAgentLogging } from "@/lib/ds-agent/relay-log";
import { parseAgentComplete } from "@/lib/ds-logs/validate";
import { withRequestId } from "@/lib/logger";
export async function POST(request: Request, { params }: { params: Promise<{ command_id: string }> }) {
return withRequestId(request, async () => {
ensureDsAgentLogging();
const pre = await agentCommandPreamble(request, (await params).command_id);
if (!pre.ok) return pre.response;
const parsed = parseAgentComplete(await request.text());
if (!parsed.ok) return NextResponse.json(parsed.error, { status: parsed.status });
switch (getRelay().completeExport(pre.serial, pre.commandId, parsed.query.total_bytes, parsed.query.sha256)) {
case "ok":
return noContent();
case "invalid":
return jsonError(400, "result_invalid", "合計の大きさか SHA-256 が一致しません");
case "cancelled":
return jsonError(410, "export_cancelled", "エクスポートは取り消されました");
case "not_found":
return commandNotFound();
}
});
}