Newer
Older
client_dwatch / lib / db / ds-status.ts
/**
 * D-Sec のコード値変換(純粋関数のみ)。
 *
 * ★変換元・変換先はいずれも TeamWorks 第2回回答で確定済み(D-065 Q1-2。
 *   `docs/decisions.md:483-484`)★。ここでの実装は「その表をコードにする」だけであり、
 * 判定ロジックではない。
 *
 * ★1箇所に閉じ込める理由★: `prismaSource.dsDevices()`(正変換。DB→API)と
 * `scripts/seed-local-db.ts`(逆変換。fixtures→DB)の両方が同じ対応表を
 * 必要とする。2箇所に同じ 0/1 の対応をハードコードすると、どちらかだけ直して
 * 食い違う事故が起きうるため、ここ1箇所を正とする。
 *
 * ★一覧に出すかどうか(`controls.status` が 0/1 か)は `isListedControlStatus()`★(指示書BB A1・D-182)—
 *   0/1 以外の制御盤は一覧に出さない(例外にしない)。`connectionStatusFromControlStatus()` の例外は残し、呼ぶ前に外す。
 *
 * ★D-Sec アラートの対応状況(旧 `control_error_histories.status` の変換)はここに無い★ —
 *   D-Sec アラートは `robot_error_reports` から読み、変換は `resolutionStatusFromRobotErrorStatus()`
 *   (`lib/db/precheck-mapping.ts`)の1本(指示書AX D8・D14。D-180)。
 */
import type { DsConnectionStatus } from "@/lib/types";

/** ★一覧に出す制御盤の `controls.status` か(0/1)★(指示書BB A1・D-182)。0/1 以外は一覧に出さない(例外にしない) */
export function isListedControlStatus(status: number): boolean {
  return status === 0 || status === 1;
}

/**
 * `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;
}