1
0
mirror of https://github.com/XFox111/bonch-calendar.git synced 2026-06-30 10:52:41 +03:00
Files
bonch-calendar/app/src/utils/api.ts
T

65 lines
1.4 KiB
TypeScript

const timeout: number = 5000;
export const fetchFaculties = (): Promise<Record<string, string>> =>
fetchApi("/faculties", {});
export const fetchGroups = (facultyId: string, year: number): Promise<Record<string, string>> =>
fetchApi(`/groups?facultyId=${facultyId}&year=${year}`, {});
export const fetchStats = async (): Promise<StatsResponse> =>
fetchApi("/stats", {
activeUsers: 0
});
export const fetchHealth = async (): Promise<HealthResponse> =>
fetchApi("/health", {} as HealthResponse, true);
async function fetchApi<T>(path: string, defaultValue: T, alwaysReturnResponse: boolean = false): Promise<T>
{
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[];
};
};