← 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}` : ""}`);
  },
};