const DEFAULT_GANTT_API_BASE_URL = "http://localhost:3000/api"; function normalizeBaseUrl(url: string): string { return url.replace(/\/+$/, ""); } export function getGanttApiBaseUrl(): string { const configured = process.env.GANTT_API_BASE_URL || process.env.NEXT_PUBLIC_GANTT_API_BASE_URL || DEFAULT_GANTT_API_BASE_URL; return normalizeBaseUrl(configured); } function buildAuthHeaders(): HeadersInit { const headers: Record = {}; if (process.env.GANTT_API_BEARER_TOKEN) { headers.Authorization = `Bearer ${process.env.GANTT_API_BEARER_TOKEN}`; } if (process.env.GANTT_API_COOKIE) { headers.Cookie = process.env.GANTT_API_COOKIE; } return headers; } export async function fetchGanttApi(endpoint: string): Promise { const baseUrl = getGanttApiBaseUrl(); const response = await fetch(`${baseUrl}${endpoint}`, { method: "GET", cache: "no-store", headers: { Accept: "application/json", ...buildAuthHeaders(), }, }); const payload = (await response.json().catch(() => null)) as | { error?: string; message?: string } | null; if (!response.ok) { const details = payload?.error || payload?.message || response.statusText; throw new Error(`gantt-board API request failed (${response.status} ${endpoint}): ${details}`); } return payload as T; }