/
afanasevn
/
MaxSystems
Обзор
Документация
Войти
/
afanasevn
/
MaxSystems
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
client/src/api/http.ts
106 строк
3 KB
IBS\NAfanasev
Production tests added
30 июн 2026, 13:52
30 июн 2026, 13:52
919fb54
Код
Авторство
О чём код?
import { clearToken, getToken } from '../auth/session' const API_ERROR = 'API недоступен. Запустите MaxSystems.Api (dotnet run).' const apiBaseUrl = (import.meta.env.VITE_API_BASE_URL ?? '').replace(/\/$/, '') /** Собирает URL API: относительный путь в dev (Vite proxy) или абсолютный в production. */ function resolveApiUrl(path: string): string { return `${apiBaseUrl}${path}` } async function parseError(response: Response): Promise<string> { try { const data = (await response.json()) as { error?: string } return data.error ?? API_ERROR } catch { return API_ERROR } } function buildHeaders(extra?: HeadersInit): HeadersInit { const headers = new Headers(extra) const token = getToken() if (token) { headers.set('Authorization', `Bearer ${token}`) } return headers } async function handleUnauthorized(response: Response): Promise<void> { if (response.status === 401 && getToken()) { clearToken() if (!window.location.pathname.startsWith('/login')) { window.location.href = '/login' } throw new Error('Сессия истекла. Войдите снова.') } } async function parseJsonResponse<T>(response: Response): Promise<T> { await handleUnauthorized(response) if (!response.ok) { throw new Error(await parseError(response)) } if (response.status === 204) { return undefined as T } const text = await response.text() if (!text) { return undefined as T } return JSON.parse(text) as T } export async function apiGet<T>(path: string): Promise<T> { const response = await fetch(resolveApiUrl(path), { headers: buildHeaders() }) return parseJsonResponse<T>(response) } export async function apiPatch<T>(path: string, body: unknown): Promise<T> { const response = await fetch(resolveApiUrl(path), { method: 'PATCH', headers: buildHeaders({ 'Content-Type': 'application/json' }), body: JSON.stringify(body), }) return parseJsonResponse<T>(response) } export async function apiPost<T>(path: string, body: unknown = {}): Promise<T> { const response = await fetch(resolveApiUrl(path), { method: 'POST', headers: buildHeaders({ 'Content-Type': 'application/json' }), body: JSON.stringify(body), }) return parseJsonResponse<T>(response) } export async function apiPut<T>(path: string, body: unknown): Promise<T> { const response = await fetch(resolveApiUrl(path), { method: 'PUT', headers: buildHeaders({ 'Content-Type': 'application/json' }), body: JSON.stringify(body), }) return parseJsonResponse<T>(response) } export async function apiDelete(path: string): Promise<void> { const response = await fetch(resolveApiUrl(path), { method: 'DELETE', headers: buildHeaders(), }) return parseJsonResponse<void>(response) } export async function apiUploadForm<T>(path: string, formData: FormData): Promise<T> { const response = await fetch(resolveApiUrl(path), { method: 'POST', headers: buildHeaders(), body: formData, }) return parseJsonResponse<T>(response) } export { API_ERROR }