Spaces:
Runtime error
Runtime error
| const BASE_URL = import.meta.env.VITE_API_URL || "http://localhost:8000"; | |
| /** | |
| * Helper to process fetch responses, parsing JSON and raising errors with detailed messages if available. | |
| */ | |
| async function handleResponse(response) { | |
| if (!response.ok) { | |
| let errMsg = `Request failed with status ${response.status}`; | |
| try { | |
| const data = await response.json(); | |
| if (data && data.detail) { | |
| if (typeof data.detail === "string") { | |
| errMsg = data.detail; | |
| } else if (Array.isArray(data.detail)) { | |
| // Parse FastAPI validation errors | |
| errMsg = data.detail.map(err => `${err.loc.join(".")}: ${err.msg}`).join(", "); | |
| } | |
| } | |
| } catch (e) { | |
| // Fallback to text if parsing fails | |
| try { | |
| const text = await response.text(); | |
| if (text) errMsg = text; | |
| } catch (innerErr) {} | |
| } | |
| throw new Error(errMsg); | |
| } | |
| // Return parsed data and preserve headers if needed | |
| const jsonData = await response.json(); | |
| // If we have custom headers like X-Process-Time, we can attach it to the returned data structure | |
| if (response.headers.has("X-Process-Time")) { | |
| jsonData._processTime = response.headers.get("X-Process-Time"); | |
| } | |
| return jsonData; | |
| } | |
| export async function getDatasets() { | |
| console.log("[API] Fetching datasets..."); | |
| const response = await fetch(`${BASE_URL}/datasets`); | |
| return handleResponse(response); | |
| } | |
| export async function getSchema(dbName) { | |
| console.log(`[API] Fetching schema for database: ${dbName}...`); | |
| const response = await fetch(`${BASE_URL}/datasets/${encodeURIComponent(dbName)}/schema`); | |
| return handleResponse(response); | |
| } | |
| export async function getPreview(dbName) { | |
| console.log(`[API] Fetching preview for database: ${dbName}...`); | |
| const response = await fetch(`${BASE_URL}/datasets/${encodeURIComponent(dbName)}/preview`); | |
| return handleResponse(response); | |
| } | |
| export async function uploadCSV(file) { | |
| console.log(`[API] Uploading CSV file: ${file.name}...`); | |
| const formData = new FormData(); | |
| formData.append("file", file); | |
| const response = await fetch(`${BASE_URL}/upload`, { | |
| method: "POST", | |
| body: formData | |
| // Note: Do not set Content-Type header manually. The browser will auto-set it with boundary. | |
| }); | |
| return handleResponse(response); | |
| } | |
| export async function deleteDataset(dbName) { | |
| console.log(`[API] Deleting database: ${dbName}...`); | |
| const response = await fetch(`${BASE_URL}/datasets/${encodeURIComponent(dbName)}`, { | |
| method: "DELETE" | |
| }); | |
| return handleResponse(response); | |
| } | |
| export async function queryDataset(question, dbName) { | |
| console.log(`[API] Querying database: ${dbName} with question: '${question}'...`); | |
| const response = await fetch(`${BASE_URL}/query`, { | |
| method: "POST", | |
| headers: { | |
| "Content-Type": "application/json" | |
| }, | |
| body: JSON.stringify({ question, db_name: dbName }) | |
| }); | |
| return handleResponse(response); | |
| } | |
| export async function getSuggestions(dbName) { | |
| console.log(`[API] Fetching suggestions for database: ${dbName}...`); | |
| const response = await fetch(`${BASE_URL}/datasets/${encodeURIComponent(dbName)}/suggestions`); | |
| return handleResponse(response); | |
| } | |
| export async function getQueryHistory(dbName) { | |
| console.log(`[API] Fetching history for database: ${dbName}...`); | |
| const response = await fetch(`${BASE_URL}/query/history?db_name=${encodeURIComponent(dbName)}`); | |
| return handleResponse(response); | |
| } | |
| export async function getSchemaDatasets() { | |
| console.log("[API] Fetching schema datasets..."); | |
| const response = await fetch(`${BASE_URL}/schema-datasets`); | |
| return handleResponse(response); | |
| } | |
| export async function getSchemaInfo(dbName) { | |
| console.log(`[API] Fetching schema details for database: ${dbName}...`); | |
| const response = await fetch(`${BASE_URL}/schema-datasets/${encodeURIComponent(dbName)}/schema`); | |
| return handleResponse(response); | |
| } | |
| export async function getSchemaPreview(dbName) { | |
| console.log(`[API] Fetching schema preview for database: ${dbName}...`); | |
| const response = await fetch(`${BASE_URL}/schema-datasets/${encodeURIComponent(dbName)}/preview`); | |
| return handleResponse(response); | |
| } | |
| export async function uploadSchemaDB(sqlFile, erdImage = null) { | |
| console.log(`[API] Uploading schema files...`); | |
| const formData = new FormData(); | |
| if (sqlFile) { | |
| formData.append("schema_file", sqlFile); | |
| } | |
| if (erdImage) { | |
| formData.append("erd_image", erdImage); | |
| } | |
| const response = await fetch(`${BASE_URL}/upload/schema`, { | |
| method: "POST", | |
| body: formData | |
| }); | |
| return handleResponse(response); | |
| } | |
| export async function deleteSchemaDataset(dbName) { | |
| console.log(`[API] Deleting schema database: ${dbName}...`); | |
| const response = await fetch(`${BASE_URL}/schema-datasets/${encodeURIComponent(dbName)}`, { | |
| method: "DELETE" | |
| }); | |
| return handleResponse(response); | |
| } | |
| export async function querySchema(question, dbName) { | |
| console.log(`[API] Querying schema database: ${dbName} with question: '${question}'...`); | |
| const response = await fetch(`${BASE_URL}/schema-query`, { | |
| method: "POST", | |
| headers: { | |
| "Content-Type": "application/json" | |
| }, | |
| body: JSON.stringify({ question, db_name: dbName }) | |
| }); | |
| return handleResponse(response); | |
| } | |