From d1b634a5992cb0c1f18bba4d994e5c9536d0eeba Mon Sep 17 00:00:00 2001 From: mftee Date: Wed, 18 Feb 2026 09:58:30 +0100 Subject: [PATCH] ... --- frontend/lib/api/assets.ts | 105 +++++++++++++++++++++++++++++++++++++ frontend/lib/api/client.ts | 50 ++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 frontend/lib/api/assets.ts create mode 100644 frontend/lib/api/client.ts diff --git a/frontend/lib/api/assets.ts b/frontend/lib/api/assets.ts new file mode 100644 index 0000000..17515cb --- /dev/null +++ b/frontend/lib/api/assets.ts @@ -0,0 +1,105 @@ +import { apiClient } from '@/lib/api/client'; +import { + Asset, + AssetDocument, + AssetHistoryEvent, + AssetHistoryFilters, + AssetNote, + AssetUser, + CreateMaintenanceInput, + CreateNoteInput, + Department, + MaintenanceRecord, + TransferAssetInput, + UpdateAssetStatusInput, +} from '@/lib/query/types/asset'; + +export const assetApiClient = { + getAsset(id: string): Promise { + return apiClient.request(`/assets/${id}`); + }, + + getAssetHistory(id: string, filters?: AssetHistoryFilters): Promise { + const params = new URLSearchParams(); + if (filters) { + Object.entries(filters).forEach(([key, value]) => { + if (value !== undefined && value !== null) { + params.append(key, String(value)); + } + }); + } + const qs = params.toString(); + return apiClient.request( + `/assets/${id}/history${qs ? `?${qs}` : ''}` + ); + }, + + getAssetDocuments(id: string): Promise { + return apiClient.request(`/assets/${id}/documents`); + }, + + getMaintenanceRecords(id: string): Promise { + return apiClient.request(`/assets/${id}/maintenance`); + }, + + getAssetNotes(id: string): Promise { + return apiClient.request(`/assets/${id}/notes`); + }, + + getDepartments(): Promise { + return apiClient.request('/departments'); + }, + + getUsers(): Promise { + return apiClient.request('/users'); + }, + + updateAssetStatus(id: string, data: UpdateAssetStatusInput): Promise { + return apiClient.request(`/assets/${id}/status`, { + method: 'PATCH', + body: JSON.stringify(data), + }); + }, + + transferAsset(id: string, data: TransferAssetInput): Promise { + return apiClient.request(`/assets/${id}/transfer`, { + method: 'POST', + body: JSON.stringify(data), + }); + }, + + deleteAsset(id: string): Promise { + return apiClient.request(`/assets/${id}`, { method: 'DELETE' }); + }, + + uploadDocument(assetId: string, file: File, name?: string): Promise { + const form = new FormData(); + form.append('file', file); + if (name) form.append('name', name); + return apiClient.request(`/assets/${assetId}/documents`, { + method: 'POST', + body: form, + headers: {}, + }); + }, + + deleteDocument(assetId: string, documentId: string): Promise { + return apiClient.request(`/assets/${assetId}/documents/${documentId}`, { + method: 'DELETE', + }); + }, + + createMaintenanceRecord(assetId: string, data: CreateMaintenanceInput): Promise { + return apiClient.request(`/assets/${assetId}/maintenance`, { + method: 'POST', + body: JSON.stringify(data), + }); + }, + + createNote(assetId: string, data: CreateNoteInput): Promise { + return apiClient.request(`/assets/${assetId}/notes`, { + method: 'POST', + body: JSON.stringify(data), + }); + }, +}; diff --git a/frontend/lib/api/client.ts b/frontend/lib/api/client.ts new file mode 100644 index 0000000..dd8aa06 --- /dev/null +++ b/frontend/lib/api/client.ts @@ -0,0 +1,50 @@ +import { RegisterInput, LoginInput, AuthResponse } from '@/lib/query/types'; + +const BASE_URL = process.env.NEXT_PUBLIC_API_URL || 'http://localhost:8000'; + +async function request(path: string, options: RequestInit = {}): Promise { + const url = `${BASE_URL}${path}`; + + const token = + typeof window !== 'undefined' ? localStorage.getItem('token') : null; + + const headers: Record = { + 'Content-Type': 'application/json', + ...(options.headers as Record), + }; + + if (token) { + headers['Authorization'] = `Bearer ${token}`; + } + + const res = await fetch(url, { ...options, headers }); + + if (!res.ok) { + const error = await res.json().catch(() => ({ message: res.statusText })); + throw { message: error.message ?? res.statusText, statusCode: res.status }; + } + + if (res.status === 204) { + return undefined as T; + } + + return res.json() as Promise; +} + +export const apiClient = { + request, + + register(data: RegisterInput): Promise { + return request('/auth/register', { + method: 'POST', + body: JSON.stringify(data), + }); + }, + + login(data: LoginInput): Promise { + return request('/auth/login', { + method: 'POST', + body: JSON.stringify(data), + }); + }, +};