Newer
Older
client_dwatch / app / api / error-lists / route.ts
/**
 * GET /error-lists — エラー内容の選択肢(`error_lists`。エラー一覧のセレクトリスト用。指示書BD §3-1。D-184。読み取り専用)
 *
 * 形は `app/api/groups/route.ts` と同じ。仕様の正は `d-watch-api.yaml` の /error-lists。
 *
 * ★GET だけ★ — `error_lists` は先方が管理する表(管理側UIなし。ユーザー回答① 2026-10-27)。
 *   アプリが書くのは `robot_error_reports.error_list_id`(`PATCH /errors/{error_id}/status`)だけ。
 *
 * ★有効な行だけ・id の昇順★ — データ層(`db.errorLists()`。規則の正は `activeErrorListItems()`)が済ませて返す。
 *   ★`GET /groups` と違い `inactive` でも絞る★(無効化した選択肢を新たに選ばせない)。
 * ★文字列は DB の値のまま★(`t()` に通さない・変換しない。D-077 と同じ)。
 *
 * ★認証はここに書かない★ — `proxy.ts` が全ルートを横断して判定する。
 * ★ページングしない★(`GET /groups` と同じ。`meta` は `masterListResponse()`)。
 */
import { NextResponse } from "next/server";
import { db } from "@/lib/db";
import { masterListResponse } from "@/lib/masters/query";
import { withRequestId } from "@/lib/logger";
import { logApiError } from "@/lib/logger/api";
import type { ApiError, ErrorListItem, ErrorListsResponse } from "@/lib/types";

const ROUTE = "/api/error-lists";

export async function GET(request: Request) {
  return withRequestId(request, async () => {
    // ★クエリパラメータを持たないので 422 の分岐が無い★(`app/api/groups/route.ts` と同じ)
    let items: ErrorListItem[];
    try {
      items = await db.errorLists();
    } catch (e) {
      const body: ApiError = {
        error: {
          code: "internal_error",
          message: "データの取得に失敗しました",
          details: null,
        },
      };
      logApiError({ route: ROUTE, method: "GET", body, status: 500, err: e });
      return NextResponse.json(body, { status: 500 });
    }

    const body: ErrorListsResponse = masterListResponse(items);
    return NextResponse.json(body);
  });
}