const timeout: number = 5000; export const fetchFaculties = (): Promise> => fetchApi("/faculties", {}); export const fetchGroups = (facultyId: string, year: number): Promise> => fetchApi(`/groups?facultyId=${facultyId}&year=${year}`, {}); export const fetchStats = async (): Promise => fetchApi("/stats", { activeUsers: 0 }); export const fetchHealth = async (): Promise => fetchApi("/health", {} as HealthResponse, true); async function fetchApi(path: string, defaultValue: T, alwaysReturnResponse: boolean = false): Promise { try { const res = await fetch(import.meta.env.VITE_BACKEND_HOST + path, { signal: AbortSignal.timeout(timeout) }); if (!res.ok && !alwaysReturnResponse) return defaultValue; return await res.json() } catch { return defaultValue; } } export type StatsResponse = { activeUsers: number; }; export type HealthResponse = { status: ServiceStatus; totalDuration: string; entries: { ["timetable_website"]: TimetableHealth; }; }; export type ServiceStatus = "Healthy" | "Unhealthy" | "Degraded"; export type TimetableHealth = { description?: string; duration: string; status: "Healthy" | "Unhealthy", tags: unknown[], data: { "/faculties"?: false, "/groups"?: string[], "/timetable"?: string[]; }; };