devaanand's picture
feat(ui): "Cite this platform" in the landing-page footer
61bbb51
Raw History Blame Contribute Delete
2.83 kB
// Thin API client. Same-origin in production (FastAPI serves the build);
// the Vite dev server proxies /api to :8000.
async function request(path, options = {}) {
const resp = await fetch(path, options);
if (!resp.ok) {
let detail = resp.statusText;
try {
const body = await resp.json();
detail = body.detail || detail;
} catch {
/* non-JSON error body */
}
throw new Error(detail);
}
return resp.json();
}
const json = (method, body) => ({
method,
headers: { "Content-Type": "application/json" },
body: JSON.stringify(body),
});
export const api = {
health: () => request("/api/health"),
models: () => request("/api/models"),
languages: () => request("/api/languages"),
citation: () => request("/api/citation"),
listProjects: () => request("/api/projects"),
createProject: (body) => request("/api/projects", json("POST", body)),
patchProject: (projectId, body) => request(`/api/projects/${projectId}`, json("PATCH", body)),
deleteProject: (projectId) => fetch(`/api/projects/${projectId}`, { method: "DELETE" }),
authMe: () => request("/api/auth/me"),
register: (body) => request("/api/auth/register", json("POST", body)),
login: (body) => request("/api/auth/login", json("POST", body)),
logout: () => request("/api/auth/logout", { method: "POST" }),
listCorpora: (projectId) => request(`/api/projects/${projectId}/corpora`),
exampleCorpora: () => request("/api/example-corpora"),
addExampleCorpus: (projectId, exampleId) =>
request(`/api/projects/${projectId}/corpora/from-example`,
json("POST", { example_id: exampleId })),
uploadCorpus: (projectId, file) => {
const form = new FormData();
form.append("file", file);
return request(`/api/projects/${projectId}/corpora`, { method: "POST", body: form });
},
listConstructs: () => request("/api/constructs"),
createConstruct: (body) => request("/api/constructs", json("POST", body)),
deleteConstruct: (id) =>
request(`/api/constructs/${id}`, { method: "DELETE" }),
generateConstructItems: (body) =>
request("/api/constructs/generate-items", json("POST", body)),
parseConstructFile: (file) => {
const form = new FormData();
form.append("file", file);
return request("/api/constructs/parse-file", { method: "POST", body: form });
},
createJob: (body) => request("/api/jobs", json("POST", body)),
listJobs: (projectId) => request(`/api/jobs?project_id=${projectId}`),
getJob: (jobId) => request(`/api/jobs/${jobId}`),
jobResults: (jobId) => request(`/api/jobs/${jobId}/results`),
exportUrl: (jobId) => `/api/jobs/${jobId}/export`,
metadataUrl: (jobId) => `/api/jobs/${jobId}/metadata`,
scriptUrl: (jobId) => `/api/jobs/${jobId}/script`,
scriptRequirementsUrl: (jobId) => `/api/jobs/${jobId}/script-requirements`,
};