/
sunchise
/
Test
Обзор
Документация
Войти
/
sunchise
/
Test
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
frontend/src/api/client.ts
109 строк
3 KB
sunchise
Запрос на слияние 'frontend2' (
#1
) из frontend2 в master
26 мар 2026, 18:24
Верифицирован
26 мар 2026, 18:24
761ae63
Код
Авторство
О чём код?
// src/api/client.ts import type { Project, ProjectCreate, ProjectUpdate, Material, MaterialCreate, MaterialUpdate, Supplier, SupplierCreate, SupplierAIConfig, SupplierAIConfigCreate, ProjectCategory, MaterialCategory, PriceStats, DeleteResponse, } from '../types'; const API_BASE_URL = 'http://localhost:8000/api'; // 🔴 Замени на свой порт async function request<T>(endpoint: string, options?: RequestInit): Promise<T> { const response = await fetch(`${API_BASE_URL}${endpoint}`, { headers: { 'Content-Type': 'application/json' }, ...options, }); if (!response.ok) { const error = await response.json().catch(() => ({})); throw new Error(error.detail || `API Error: ${response.status}`); } return response.json(); } // === Projects === export const projectsApi = { getAll: (skip = 0, limit = 100) => request<Project[]>(`/projects?skip=${skip}&limit=${limit}`), getById: (id: number) => request<Project>(`/projects/${id}`), create: (data: ProjectCreate) => request<Project>('/projects', { method: 'POST', body: JSON.stringify(data), }), update: (id: number, data: ProjectUpdate) => request<Project>(`/projects/${id}`, { method: 'PUT', body: JSON.stringify(data), }), delete: (id: number) => request<DeleteResponse>(`/projects/${id}`, { method: 'DELETE' }), }; // === Materials === export const materialsApi = { getAll: (skip = 0, limit = 100) => request<Material[]>(`/materials?skip=${skip}&limit=${limit}`), getById: (id: number) => request<Material>(`/materials/${id}`), create: (data: MaterialCreate) => request<Material>('/materials', { method: 'POST', body: JSON.stringify(data), }), update: (id: number, data: MaterialUpdate) => request<Material>(`/materials/${id}`, { method: 'PUT', body: JSON.stringify(data), }), delete: (id: number) => request<DeleteResponse>(`/materials/${id}`, { method: 'DELETE' }), }; // === Suppliers === export const suppliersApi = { getAll: (skip = 0, limit = 100) => request<Supplier[]>(`/suppliers?skip=${skip}&limit=${limit}`), getById: (id: number) => request<Supplier>(`/suppliers/${id}`), create: (data: SupplierCreate) => request<Supplier>('/suppliers', { method: 'POST', body: JSON.stringify(data), }), update: (id: number, data: SupplierCreate) => request<Supplier>(`/suppliers/${id}`, { method: 'PUT', body: JSON.stringify(data), }), delete: (id: number) => request<DeleteResponse>(`/suppliers/${id}`, { method: 'DELETE' }), createAIConfig: (supplierId: number, config: SupplierAIConfigCreate) => request<SupplierAIConfig>(`/suppliers/${supplierId}/ai-config`, { method: 'POST', body: JSON.stringify(config), }), }; // === Pricing === export const pricingApi = { updatePrices: () => request<{ message: string; status: string }>('/pricing/update-prices', { method: 'POST', }), getStats: () => request<PriceStats>('/pricing/price-stats'), }; // === Categories === export const categoriesApi = { getProjectCategories: () => request<ProjectCategory[]>('/categories/project'), getMaterialCategories: () => request<MaterialCategory[]>('/categories/material'), };