diff --git a/src/api/ApiClient.js b/src/api/ApiClient.js new file mode 100644 index 0000000..9221d15 --- /dev/null +++ b/src/api/ApiClient.js @@ -0,0 +1,40 @@ +import axios from "axios"; +import { Toast } from "react-bootstrap"; + +export class HttpError extends Error { + constructor(message = "") { + super(message); + this.name = "HttpError"; + Object.setPrototypeOf(this, new.target.prototype); + Toast.error(message, { id: "HttpError" }); + } +} + +function responseHandler(response) { + if (response.status === 200 || response.status === 201) { + const data = response?.data; + if (!data) { + throw new HttpError("API Error. No data!"); + } + return data; + } + throw new HttpError(`API Error! Invalid status code ${response.status}!`); +} + +function responseErrorHandler(error) { + if (error === null) { + throw new Error("Unrecoverable error!! Error is null!"); + } + Toast.error(error.message, { id: "AxiosError" }); + return Promise.reject(error.message); +} + +export const ApiClient = axios.create({ + baseURL: "http://localhost:8081/", + timeout: "3000", + headers: { + Accept: "application/json", + }, +}); + +ApiClient.interceptors.response.use(responseHandler, responseErrorHandler); diff --git a/src/api/ApiService.js b/src/api/ApiService.js new file mode 100644 index 0000000..273ea82 --- /dev/null +++ b/src/api/ApiService.js @@ -0,0 +1,34 @@ +import { ApiClient } from "./ApiClient"; + +class ApiService { + constructor(url) { + this.url = url; + } + + async getAll() { + return ApiClient.get(`${this.url}`); + } + + // eslint-disable-next-line no-dupe-class-members + async getAll(expand) { + return ApiClient.get(`${this.url}${expand || ""}`); + } + + async get(id, expand) { + return ApiClient.get(`${this.url}/${id}${expand || ""}`); + } + + async create(body) { + return ApiClient.post(this.url, body); + } + + async update(id, body) { + return ApiClient.put(`${this.url}/${id}`, body); + } + + async delete(id) { + return ApiClient.delete(`${this.url}/${id}`); + } +} + +export default ApiService; diff --git a/src/service/PostsApiService.js b/src/service/PostsApiService.js new file mode 100644 index 0000000..4a71aef --- /dev/null +++ b/src/service/PostsApiService.js @@ -0,0 +1,5 @@ +import ApiService from "../api/ApiService.js"; + +const PostsApiService = new ApiService("posts"); + +export default PostsApiService; diff --git a/src/service/UsersApiService.js b/src/service/UsersApiService.js new file mode 100644 index 0000000..5d53b5b --- /dev/null +++ b/src/service/UsersApiService.js @@ -0,0 +1,5 @@ +import ApiService from "../api/ApiService.js"; + +const UsersApiService = new ApiService("users"); + +export default UsersApiService;