/**
* fixtures 版の「アラートの対応状況の上書き表」(指示書AT 段階4-3)。
*
* `PATCH /prechecks/{id}/status` を `USE_FIXTURES=true` でも動かすため、
* ★`lib/fixtures/prechecks.ts` は書き換えず★、モジュール内に id → 4項目の上書きを持つ。
* `fixtureSource.prechecks()` と `fixtureSource.precheckItemById()` は上書きを反映して返す。
*
* ★プロセスを再起動すると消える★(それで良い。fixtures は開発・デモ用。D-045)。
* テストは `resetFixturePrecheckOverrides()` で毎回空に戻すこと。
*
* ★Prisma 版と同じ規則で書く★ — パッチは `robotErrorColumnsFromPatch()`(実行時の歯止め)を通し、
* 4項目(`resolution_status` / `responded_at` / `resolved_at` / `note`)以外は上書きしない。
*/
import { robotErrorColumnsFromPatch } from "@/lib/db/robot-error-write";
import { toJstIso } from "@/lib/format/date";
import type { PrecheckItem, PrecheckStatusPatch } from "@/lib/types";
type PrecheckOverride = Pick<
PrecheckItem,
"resolution_status" | "responded_at" | "resolved_at" | "note"
>;
const overrides = new Map<string, PrecheckOverride>();
/** テスト用: 上書き表を空にする */
export function resetFixturePrecheckOverrides(): void {
overrides.clear();
}
/** 1行に上書きを反映する(上書きが無ければそのまま。★元の配列の要素は書き換えない★) */
export function withFixturePrecheckOverride(row: PrecheckItem): PrecheckItem {
const override = overrides.get(row.id);
return override ? { ...row, ...override } : row;
}
/**
* fixtures 版の書き込み。対象は ★`severity === "precheck"` の行だけ★(§3-3。Prisma 版と同じ判定)。
* 該当が無ければ `matched: 0`。
*/
export function applyFixturePrecheckPatch(
rows: readonly PrecheckItem[],
id: string,
patch: PrecheckStatusPatch
): { matched: number } {
// ★Prisma 版と同じ歯止め★(4つ以外のキー・空パッチは例外)
robotErrorColumnsFromPatch(patch);
const base = rows.find((row) => row.id === id && row.severity === "precheck");
if (!base) return { matched: 0 };
const current = withFixturePrecheckOverride(base);
const next: PrecheckOverride = {
resolution_status: current.resolution_status,
responded_at: current.responded_at,
resolved_at: current.resolved_at,
note: current.note,
};
if (patch.status !== undefined) next.resolution_status = patch.status;
if (patch.note !== undefined) next.note = patch.note;
// ★日時は「真の瞬間」→ API の ISO(+09:00)★(DB を経由しないので `toDbJst()` は通さない)
if (patch.responded_at !== undefined) {
next.responded_at = patch.responded_at === null ? null : toJstIso(patch.responded_at);
}
if (patch.resolved_at !== undefined) {
next.resolved_at = patch.resolved_at === null ? null : toJstIso(patch.resolved_at);
}
overrides.set(id, next);
return { matched: 1 };
}