42 lines
1.1 KiB
TypeScript
42 lines
1.1 KiB
TypeScript
import { fail, type HousekeepingResult, ok } from "../contracts";
|
|
import {
|
|
normalizeHousekeepingReason,
|
|
requiresHousekeepingReason,
|
|
} from "./reason-policy";
|
|
import type { HousekeepingCommand } from "./registry";
|
|
|
|
export interface HousekeepingCommandConfirmation {
|
|
commandId: string;
|
|
risk: "safe" | "sensitive";
|
|
requiresReason: boolean;
|
|
reason?: string;
|
|
}
|
|
|
|
export function confirmHousekeepingCommand<I, O>(
|
|
command: HousekeepingCommand<I, O>,
|
|
reason: string | undefined,
|
|
correlationId: string,
|
|
input?: I,
|
|
): HousekeepingResult<HousekeepingCommandConfirmation> {
|
|
const normalizedReason = normalizeHousekeepingReason(reason);
|
|
const reasonRequired = requiresHousekeepingReason(
|
|
command.requiresReason,
|
|
input,
|
|
);
|
|
if (reasonRequired && !normalizedReason) {
|
|
return fail("VALIDATION", "errors.housekeeping.validation", correlationId, {
|
|
reason: ["errors.validation.required"],
|
|
});
|
|
}
|
|
|
|
return ok(
|
|
{
|
|
commandId: command.id,
|
|
risk: command.risk,
|
|
requiresReason: reasonRequired,
|
|
...(normalizedReason === undefined ? {} : { reason: normalizedReason }),
|
|
},
|
|
correlationId,
|
|
);
|
|
}
|