Files
lti-web-client/src/services/api/base.ts
T

93 lines
2.6 KiB
TypeScript

import axios from 'axios';
import { httpClient, httpClientFetcher } from '@/services/http/client';
import { BaseApiResponse } from '@/types/api/api-general';
export class BaseApiService<T, CreatePayloadGeneric, UpdatePayloadGeneric> {
basePath: string;
header?: Record<string, string>;
constructor(basePath: string, header?: Record<string, string>) {
this.basePath = basePath;
this.header = header;
}
async getAllFetcher(endpoint: string): Promise<BaseApiResponse<T[]>> {
return await httpClientFetcher<BaseApiResponse<T[]>>(endpoint);
}
async getSingle(id: number) {
try {
const getSinglePath = `${this.basePath}/${id}`;
const getSingleRes = await httpClient<BaseApiResponse<T>>(getSinglePath);
return getSingleRes;
} catch (error) {
if (axios.isAxiosError<BaseApiResponse<T>>(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<BaseApiResponse<T>>(this.basePath, {
method: 'POST',
body: payload,
headers,
});
return createRes;
} catch (error: unknown) {
if (axios.isAxiosError<BaseApiResponse<T>>(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<BaseApiResponse<T>>(updatePath, {
method: 'PATCH',
body: payload,
headers,
});
return updateRes;
} catch (error: unknown) {
if (axios.isAxiosError<BaseApiResponse<T>>(error)) {
return error.response?.data;
}
return undefined;
}
}
async delete(id: number) {
try {
const deletePath = `${this.basePath}/${id}`;
const deleteRes = await httpClient<BaseApiResponse>(deletePath, {
method: 'DELETE',
});
return deleteRes;
} catch (error) {
if (axios.isAxiosError<BaseApiResponse>(error)) {
return error.response?.data;
}
return undefined;
}
}
}