/
afanasevn
/
PdfEncoder
Обзор
Документация
Войти
/
afanasevn
/
PdfEncoder
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
client/src/lib/api.ts
113 строк
3 KB
IBS\NAfanasev
Field validation, integration tests, UI polish
06 июл 2026, 17:18
06 июл 2026, 17:18
0e936b0
Код
Авторство
О чём код?
import type { DocumentJobResponse, DocumentListResponse, ListParams, ParseOptions, } from "@/types/api"; import { getJobErrorSummary, normalizeJobStatus } from "@/lib/document-job"; const defaultHeaders = { Accept: "application/json", }; function normalizeJobResponse(data: DocumentJobResponse): DocumentJobResponse { return { ...data, status: normalizeJobStatus(data.status), }; } function normalizeListItem( item: DocumentListItem & { ErrorSummary?: string | null; errorCode?: string | null; ErrorCode?: string | null; }, ): DocumentListItem { const status = normalizeJobStatus(item.status); const errorSummary = item.errorSummary ?? item.ErrorSummary ?? null; const errorCode = item.errorCode ?? item.ErrorCode ?? null; return { ...item, status, errorSummary: getJobErrorSummary(status, errorSummary, errorCode), errorCode, }; } function normalizeListResponse(data: DocumentListResponse): DocumentListResponse { return { ...data, items: data.items.map((item) => normalizeListItem(item)), }; } async function handleResponse<T>(response: Response): Promise<T> { if (!response.ok) { const problem = await response.json().catch(() => null); const message = problem?.detail ?? problem?.title ?? `HTTP ${response.status}`; throw new Error(message); } return response.json() as Promise<T>; } export async function parseDocument( file: File, options?: ParseOptions, ): Promise<DocumentJobResponse> { const formData = new FormData(); formData.append("file", file); formData.append("documentType", options?.documentType ?? "auto"); formData.append("language", options?.language ?? "ru"); formData.append("async", String(options?.async ?? true)); const response = await fetch("/api/documents/parse", { method: "POST", body: formData, }); return normalizeJobResponse(await handleResponse<DocumentJobResponse>(response)); } export async function getDocument(id: string): Promise<DocumentJobResponse> { const response = await fetch(`/api/documents/${id}`, { headers: defaultHeaders, }); return normalizeJobResponse(await handleResponse<DocumentJobResponse>(response)); } export async function listDocuments( params?: ListParams, ): Promise<DocumentListResponse> { const search = new URLSearchParams(); if (params?.limit) search.set("limit", String(params.limit)); if (params?.offset) search.set("offset", String(params.offset)); if (params?.status) search.set("status", params.status); const query = search.toString(); const response = await fetch(`/api/documents${query ? `?${query}` : ""}`, { headers: defaultHeaders, }); return normalizeListResponse(await handleResponse<DocumentListResponse>(response)); } export async function getRawContext(id: string): Promise<unknown> { const response = await fetch(`/api/documents/${id}/raw-context`, { headers: defaultHeaders, }); return handleResponse<unknown>(response); } export async function getHealth(): Promise<unknown> { const response = await fetch("/health", { headers: defaultHeaders, }); return handleResponse<unknown>(response); }