import apiClient from "@/services/api-client/api-client.ts"; import type { AxiosResponse, ResponseType } from "axios"; import { HttpErrorResponseException } from "@/exception/http-error-response-exception.ts"; export abstract class BaseController { protected basePath: string; protected constructor(basePath: string) { this.basePath = basePath; } private static assertSuccessResponse(response: AxiosResponse): void { if (response.status / 100 !== 2) { throw new HttpErrorResponseException(response); } } protected async get(path: string, queryParams?: QueryParams, responseType?: ResponseType): Promise { const response = await apiClient.get(this.absolutePathFor(path), { params: queryParams, responseType }); BaseController.assertSuccessResponse(response); return response.data; } protected async post(path: string, body: unknown): Promise { const response = await apiClient.post(this.absolutePathFor(path), body); BaseController.assertSuccessResponse(response); return response.data; } protected async delete(path: string): Promise { const response = await apiClient.delete(this.absolutePathFor(path)); BaseController.assertSuccessResponse(response); return response.data; } protected async put(path: string, body: unknown): Promise { const response = await apiClient.put(this.absolutePathFor(path), body); BaseController.assertSuccessResponse(response); return response.data; } private absolutePathFor(path: string): string { return "/" + this.basePath + path; } } type QueryParams = Record;