| |
| |
| |
| |
| |
| |
| import { ENV } from "./env"; |
|
|
| export type DataApiCallOptions = { |
| query?: Record<string, unknown>; |
| body?: Record<string, unknown>; |
| pathParams?: Record<string, unknown>; |
| formData?: Record<string, unknown>; |
| }; |
|
|
| export async function callDataApi( |
| apiId: string, |
| options: DataApiCallOptions = {} |
| ): Promise<unknown> { |
| if (!ENV.forgeApiUrl) { |
| throw new Error("BUILT_IN_FORGE_API_URL is not configured"); |
| } |
| if (!ENV.forgeApiKey) { |
| throw new Error("BUILT_IN_FORGE_API_KEY is not configured"); |
| } |
|
|
| |
| const baseUrl = ENV.forgeApiUrl.endsWith("/") ? ENV.forgeApiUrl : `${ENV.forgeApiUrl}/`; |
| const fullUrl = new URL("webdevtoken.v1.WebDevService/CallApi", baseUrl).toString(); |
|
|
| const response = await fetch(fullUrl, { |
| method: "POST", |
| headers: { |
| accept: "application/json", |
| "content-type": "application/json", |
| "connect-protocol-version": "1", |
| authorization: `Bearer ${ENV.forgeApiKey}`, |
| }, |
| body: JSON.stringify({ |
| apiId, |
| query: options.query, |
| body: options.body, |
| path_params: options.pathParams, |
| multipart_form_data: options.formData, |
| }), |
| }); |
|
|
| if (!response.ok) { |
| const detail = await response.text().catch(() => ""); |
| throw new Error( |
| `Data API request failed (${response.status} ${response.statusText})${detail ? `: ${detail}` : ""}` |
| ); |
| } |
|
|
| const payload = await response.json().catch(() => ({})); |
| if (payload && typeof payload === "object" && "jsonData" in payload) { |
| try { |
| return JSON.parse((payload as Record<string, string>).jsonData ?? "{}"); |
| } catch { |
| return (payload as Record<string, unknown>).jsonData; |
| } |
| } |
| return payload; |
| } |
|
|