← back to Omega Watches 2
src/lib/api-client.ts
120 lines
const BASE_URL = "";
function getToken(): string | null {
if (typeof window === "undefined") return null;
return localStorage.getItem("omega_token");
}
async function fetchAPI<T>(
endpoint: string,
options: RequestInit = {}
): Promise<T> {
const token = getToken();
const headers: Record<string, string> = {
"Content-Type": "application/json",
...(options.headers as Record<string, string>),
};
if (token) {
headers["Authorization"] = `Bearer ${token}`;
}
const res = await fetch(`${BASE_URL}${endpoint}`, {
...options,
headers,
});
if (res.status === 401) {
if (typeof window !== "undefined") {
localStorage.removeItem("omega_token");
window.location.href = "/login";
}
throw new Error("Unauthorized");
}
const data = await res.json();
if (!data.success) {
throw new Error(data.error?.message || "API Error");
}
return data.data;
}
export const api = {
// Health
health: () => fetchAPI<any>("/api/health"),
// Auth
login: (username: string, password: string) =>
fetchAPI<any>("/api/auth/login", {
method: "POST",
body: JSON.stringify({ username, password }),
}),
// Sources
getSources: () => fetchAPI<any[]>("/api/sources"),
getSourceStatus: (name: string) =>
fetchAPI<any>(`/api/sources/${name}/status`),
// Jobs
getJobs: (params?: { date?: string; status?: string; limit?: number }) => {
const qs = new URLSearchParams(params as any).toString();
return fetchAPI<any[]>(`/api/jobs${qs ? `?${qs}` : ""}`);
},
runJob: (source_name: string, job_type?: string) =>
fetchAPI<any>("/api/jobs/run", {
method: "POST",
body: JSON.stringify({ source_name, job_type }),
}),
backfill: (source_name: string, date_from: string, date_to: string) =>
fetchAPI<any>("/api/jobs/backfill", {
method: "POST",
body: JSON.stringify({ source_name, date_from, date_to }),
}),
// Models
getTimeseries: (reference: string, params?: Record<string, string>) => {
const qs = new URLSearchParams(params).toString();
return fetchAPI<any>(
`/api/models/${encodeURIComponent(reference)}/timeseries${qs ? `?${qs}` : ""}`
);
},
getDistributions: (reference: string) =>
fetchAPI<any>(
`/api/models/${encodeURIComponent(reference)}/distributions`
),
// MSRP
getMSRP: (reference: string, region?: string) =>
fetchAPI<any>(
`/api/msrp/${encodeURIComponent(reference)}${region ? `?region=${region}` : ""}`
),
// Quarantine
getQuarantine: (params?: { resolved?: boolean; severity?: string }) => {
const qs = new URLSearchParams(params as any).toString();
return fetchAPI<any>(`/api/quarantine${qs ? `?${qs}` : ""}`);
},
resolveQuarantine: (id: string, resolution_notes: string, action?: string) =>
fetchAPI<any>(`/api/quarantine/${id}/resolve`, {
method: "POST",
body: JSON.stringify({ resolution_notes, action }),
}),
// Audit
getAuditLog: (params?: { table?: string; operation?: string }) => {
const qs = new URLSearchParams(params as any).toString();
return fetchAPI<any>(`/api/auditlog${qs ? `?${qs}` : ""}`);
},
// Dashboard chart data
getDashboardChartData: () => fetchAPI<any>("/api/dashboard/chart-data"),
// Jobs daily stats
getJobsDailyStats: () => fetchAPI<any>("/api/jobs/daily-stats"),
// References
getReferences: (params?: { collection?: string; q?: string }) => {
const qs = new URLSearchParams(params as any).toString();
return fetchAPI<any>(`/api/references${qs ? `?${qs}` : ""}`);
},
};