import axios from 'axios'; import { httpClient, httpClientFetcher } from '@/services/http/client'; import { BaseApiResponse } from '@/types/api/api-general'; export class BaseApiService { basePath: string; header?: Record; constructor(basePath: string, header?: Record) { this.basePath = basePath; this.header = header; } async getAllFetcher(endpoint: string): Promise> { return await httpClientFetcher>(endpoint); } async getAll(query?: Record) { try { const getAllPath = this.basePath; const getAllRes = await httpClient>(getAllPath, { query, }); return getAllRes; } catch (error) { if (axios.isAxiosError>(error)) { return error.response?.data; } return undefined; } } async getSingle(id: number) { try { const getSinglePath = `${this.basePath}/${id}`; const getSingleRes = await httpClient>(getSinglePath); return getSingleRes; } catch (error) { if (axios.isAxiosError>(error)) { return error.response?.data; } return undefined; } } async create(payload: CreatePayloadGeneric) { const isFormData = typeof FormData !== 'undefined' && payload instanceof FormData; try { const headers = isFormData ? { ...(this.header ?? {}) } : { 'Content-Type': 'application/json', ...(this.header ?? {}) }; const createRes = await httpClient>(this.basePath, { method: 'POST', body: payload, headers, }); return createRes; } catch (error: unknown) { if (axios.isAxiosError>(error)) { return error.response?.data; } return undefined; } } async update(id: number, payload: UpdatePayloadGeneric) { const isFormData = typeof FormData !== 'undefined' && payload instanceof FormData; try { const updatePath = `${this.basePath}/${id}`; const headers = isFormData ? { ...(this.header ?? {}) } : { 'Content-Type': 'application/json', ...(this.header ?? {}) }; const updateRes = await httpClient>(updatePath, { method: 'PATCH', body: payload, headers, }); return updateRes; } catch (error: unknown) { if (axios.isAxiosError>(error)) { return error.response?.data; } return undefined; } } async delete(id: number) { try { const deletePath = `${this.basePath}/${id}`; const deleteRes = await httpClient(deletePath, { method: 'DELETE', }); return deleteRes; } catch (error) { if (axios.isAxiosError(error)) { return error.response?.data; } return undefined; } } async customRequest( endpoint: string, options?: { method?: 'GET' | 'POST' | 'PATCH' | 'PUT' | 'DELETE'; payload?: PayloadType; params?: Record; } ): Promise { try { const urlBase = endpoint.startsWith('http') ? endpoint : `${this.basePath.replace(/\/$/, '')}/${endpoint.replace(/^\//, '')}`; const url = options?.params ? `${urlBase}?${new URLSearchParams( Object.entries(options.params).reduce( (acc, [key, value]) => { if (value !== undefined) acc[key] = String(value); return acc; }, {} as Record ) )}` : urlBase; const res = await httpClient(url, { method: options?.method || 'GET', body: options?.payload, }); return res; } catch (error: unknown) { if (axios.isAxiosError(error)) { return error.response?.data; } return undefined; } } }