/* B07 상세 설계 도면 목록·단건 API 클라이언트. */ import { API_BASE_URL, API_TIMEOUT_MS } from "@config/config_frontend"; export interface DesignDrawingItem { id: string; kind: "longitudinal" | "cross"; label: string; chainage_m: number | null; confirmed: boolean; } export interface CadDrawing { entities: Record[]; layers: { id: string; name: string; isVisible: boolean; isLocked: boolean; }[]; } export interface DesignDrawingListResponse { status: string; project_id: string; route_id: number; drawings: DesignDrawingItem[]; } export interface DesignDrawingResponse { status: string; project_id: string; route_id: number; id: string; kind: "longitudinal" | "cross"; label: string; drawing: CadDrawing; confirmed: boolean; } export interface DesignDrawingConfirmResponse { status: string; project_id: string; id: string; confirmed: boolean; all_confirmed: boolean; } async function requestJson(path: string, init: RequestInit = {}): Promise { const controller = new AbortController(); const timeoutId = window.setTimeout(() => controller.abort(), API_TIMEOUT_MS); try { const response = await fetch(`${API_BASE_URL}${path}`, { ...init, credentials: "include", headers: { "Content-Type": "application/json" }, signal: controller.signal, }); const payload = (await response.json()) as T & { message?: string }; if (!response.ok) throw new Error(payload.message ?? `HTTP ${response.status}`); return payload; } finally { window.clearTimeout(timeoutId); } } export function fetchDesignDrawingList(projectId: string): Promise { return requestJson(`/projects/${projectId}/design-drawings`); } export function fetchDesignDrawing( projectId: string, drawingId: string, ): Promise { return requestJson(`/projects/${projectId}/design-drawings/${encodeURIComponent(drawingId)}`); } export function confirmDesignDrawing( projectId: string, drawingId: string, drawing: CadDrawing, ): Promise { return requestJson( `/projects/${projectId}/design-drawings/${encodeURIComponent(drawingId)}/confirm`, { method: "PUT", body: JSON.stringify({ drawing }) }, ); } export function invalidateDesignDrawing(projectId: string, drawingId: string): Promise { return requestJson( `/projects/${projectId}/design-drawings/${encodeURIComponent(drawingId)}/invalidate`, { method: "POST" }, ); }