Newer
Older
client_dwatch / lib / db / ds-status.ts
/**
 * 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;
  }
}