/**
* D-Sec のコード値変換(純粋関数のみ)。
*
* ★変換元・変換先はいずれも TeamWorks 第2回回答で確定済み(D-065 Q1-2 / Q1-3。
* `docs/decisions.md:483-484`)★。ここでの実装は「その表をコードにする」だけであり、
* 判定ロジックではない。
*
* ★1箇所に閉じ込める理由★: `prismaSource.dsDevices()` / `dsAlerts()`(正変換。
* DB→API)と `scripts/seed-local-db.ts`(逆変換。fixtures→DB)の両方が同じ対応表を
* 必要とする。2箇所に同じ 0/1/2 の対応をハードコードすると、どちらかだけ直して
* 食い違う事故が起きうるため、ここ1箇所を正とする。
*/
import type { DsAlertStatus, DsConnectionStatus } from "@/lib/types";
/**
* `controls.status`(0/1) → `DsDevice.connection_status`(D-065 Q1-2)
* ★3状態目は存在しない(lib/types/index.ts の DsConnectionStatus 定義)★。
* 0/1 以外が来たら、静かに握りつぶさず例外を投げる。
*/
export function connectionStatusFromControlStatus(status: number): DsConnectionStatus {
if (status === 0) return "ok";
if (status === 1) return "error";
throw new Error(
`[ds-status] controls.status に想定外の値です: ${status}(0=正常/1=異常のみ想定。D-065 Q1-2)`
);
}
/** `DsDevice.connection_status` → `controls.status`(seed 用の逆変換) */
export function controlStatusFromConnectionStatus(status: DsConnectionStatus): number {
return status === "ok" ? 0 : 1;
}
/**
* `control_error_histories.status`(0/1/2) → `DsAlert.resolution_status`(D-065 Q1-3)
*/
export function resolutionStatusFromControlErrorStatus(status: number): DsAlertStatus {
switch (status) {
case 0:
return "pending";
case 1:
return "in_progress";
case 2:
return "done";
default:
throw new Error(
`[ds-status] control_error_histories.status に想定外の値です: ${status}(0=未対応/1=対応中/2=対応済のみ想定。D-065 Q1-3)`
);
}
}
/** `DsAlert.resolution_status` → `control_error_histories.status`(seed 用の逆変換) */
export function controlErrorStatusFromResolutionStatus(status: DsAlertStatus): number {
switch (status) {
case "pending":
return 0;
case "in_progress":
return 1;
case "done":
return 2;
}
}