From 90c378115dee448d13ea0f318c514cbf7de57c2b Mon Sep 17 00:00:00 2001 From: "ns.potapov" Date: Thu, 21 Dec 2023 11:47:17 +0400 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=D1=8B=20restapi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/ApiClient.js | 40 ++++++++++++++++++++++++++++++++++ src/api/ApiService.js | 34 +++++++++++++++++++++++++++++ src/service/PostsApiService.js | 5 +++++ src/service/UsersApiService.js | 5 +++++ 4 files changed, 84 insertions(+) create mode 100644 src/api/ApiClient.js create mode 100644 src/api/ApiService.js create mode 100644 src/service/PostsApiService.js create mode 100644 src/service/UsersApiService.js 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;