Newer
Older
client_dwatch / lib / db / local-guard.ts
/**
 * シード(`scripts/seed-local-db.ts`)が `dwatch_local` 以外に書き込むことを
 * 構造的に防ぐガード(指示書M 段階2-4)。
 *
 * ★参照用アカウントはSELECTのみなので実際には書き込みに失敗するが、
 *   「失敗に頼らない」ためにコードでも止める★
 * ★呼び出し側はエラーメッセージに DATABASE_URL の値を出さないこと★
 *   (CLAUDE.md §9.3。パスワードがログに残るため、この関数自身も受け取った url を返さない)
 */
export function isLocalDwatchDatabaseUrl(url: string): boolean {
  let parsed: URL;
  try {
    parsed = new URL(url);
  } catch {
    return false;
  }
  const isLocalHost = parsed.hostname === "localhost" || parsed.hostname === "127.0.0.1";
  const databaseName = parsed.pathname.replace(/^\//, "");
  return isLocalHost && databaseName === "dwatch_local";
}

/** ローカル `dwatch_local` を指していなければ例外を投げる */
export function assertLocalDwatchDatabaseUrl(url: string): void {
  if (!isLocalDwatchDatabaseUrl(url)) {
    throw new Error(
      "[seed-local-db] DATABASE_URL がローカルの dwatch_local を指していません。" +
        "書き込み先を間違えている可能性があるため中断しました。" +
        "環境変数 DATABASE_URL(.env.local など)を確認してください(値はこのエラーには出しません)。"
    );
  }
}