mirror of
https://github.com/FJurmanovic/wallet-web.git
synced 2026-02-06 06:08:10 +00:00
create http client and base service
This commit is contained in:
0
src/common/index.ts
Normal file
0
src/common/index.ts
Normal file
0
src/components/index.ts
Normal file
0
src/components/index.ts
Normal file
5
src/configs/development/app-settings.json
Normal file
5
src/configs/development/app-settings.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"apiUrl": "localhost:4000",
|
||||
"apiVersion": "v1",
|
||||
"ssl": false
|
||||
}
|
||||
0
src/core/index.ts
Normal file
0
src/core/index.ts
Normal file
30
src/core/services/base-service/BaseService.ts
Normal file
30
src/core/services/base-service/BaseService.ts
Normal file
@@ -0,0 +1,30 @@
|
||||
import { HttpClient } from "core/services";
|
||||
|
||||
class BaseService {
|
||||
private httpClient: HttpClient;
|
||||
constructor(private endpoint: string) {
|
||||
this.httpClient = new HttpClient();
|
||||
}
|
||||
|
||||
getAll = (headers: HeadersInit) => {
|
||||
return this.httpClient.get(this.endpoint, null, headers);
|
||||
};
|
||||
|
||||
get = (params: Object, headers: HeadersInit) => {
|
||||
return this.httpClient.get(this.endpoint, params, headers);
|
||||
};
|
||||
|
||||
put = (data: Object, headers: HeadersInit) => {
|
||||
return this.httpClient.put(this.endpoint, data, headers);
|
||||
};
|
||||
|
||||
post = (data: Object, headers: HeadersInit) => {
|
||||
return this.httpClient.post(this.endpoint, data, headers);
|
||||
};
|
||||
|
||||
delete = (data: Object, headers: HeadersInit) => {
|
||||
return this.httpClient.delete(this.endpoint, data, headers);
|
||||
};
|
||||
}
|
||||
|
||||
export default BaseService;
|
||||
117
src/core/services/http-service/HttpClient.ts
Normal file
117
src/core/services/http-service/HttpClient.ts
Normal file
@@ -0,0 +1,117 @@
|
||||
import settings from "configs/development/app-settings.json";
|
||||
|
||||
class HttpClient {
|
||||
private url: string;
|
||||
constructor() {
|
||||
this.url = `${settings.ssl ? "https" : "http"}://${settings.apiUrl}/${
|
||||
settings.apiVersion
|
||||
}`;
|
||||
}
|
||||
|
||||
post(url: string, data: Object, headersParam: HeadersInit): Promise<any> {
|
||||
let headers: Headers = new Headers(headersParam);
|
||||
let body: BodyType = null;
|
||||
if (data instanceof FormData) {
|
||||
body = data;
|
||||
} else {
|
||||
body = JSON.stringify(data);
|
||||
headers.append("Content-Type", "application/json");
|
||||
}
|
||||
let options: OptionsType = {
|
||||
method: "POST",
|
||||
headers: headers,
|
||||
body: body,
|
||||
};
|
||||
const req: Request = new Request(resolveUrl(this.url, url), options);
|
||||
|
||||
return createRequest(req);
|
||||
}
|
||||
|
||||
put(url: string, data: Object, headersParam: HeadersInit): Promise<any> {
|
||||
let headers: Headers = new Headers(headersParam);
|
||||
headers.append("Content-Type", "application/json");
|
||||
let options: OptionsType = {
|
||||
method: "PUT",
|
||||
headers: headers,
|
||||
body: JSON.stringify(data),
|
||||
};
|
||||
const req: Request = new Request(resolveUrl(this.url, url), options);
|
||||
|
||||
return createRequest(req);
|
||||
}
|
||||
|
||||
delete(url: string, data: Object, headersParam: HeadersInit): Promise<any> {
|
||||
let headers: Headers = new Headers(headersParam);
|
||||
headers.append("Content-Type", "application/json");
|
||||
let options: OptionsType = {
|
||||
method: "DELETE",
|
||||
headers: headers,
|
||||
body: JSON.stringify(data),
|
||||
};
|
||||
const req: Request = new Request(resolveUrl(this.url, url), options);
|
||||
|
||||
return createRequest(req);
|
||||
}
|
||||
|
||||
get(url: string, params: Object, headersParam: HeadersInit): Promise<any> {
|
||||
let headers: Headers = new Headers(headersParam);
|
||||
let options: OptionsType = {
|
||||
method: "GET",
|
||||
headers: headers,
|
||||
};
|
||||
let paramsPath: string = "";
|
||||
if (params) {
|
||||
let urlParams = new URLSearchParams(Object.entries(params));
|
||||
paramsPath = "?" + urlParams;
|
||||
}
|
||||
const req: Request = new Request(
|
||||
resolveUrl(this.url, url + paramsPath),
|
||||
options
|
||||
);
|
||||
|
||||
return createRequest(req);
|
||||
}
|
||||
}
|
||||
|
||||
export default HttpClient;
|
||||
|
||||
async function createRequest(request: Request): Promise<Response> {
|
||||
let response: Response = await fetch(request);
|
||||
if (!response.ok && response.status !== 403 && response.status !== 400) {
|
||||
throw new Error(`HTTP error! status: ${response.status}`);
|
||||
} else {
|
||||
if (response.headers.get("Content-Type") !== null) {
|
||||
let newResponse: Response = await createResponse(response);
|
||||
return newResponse;
|
||||
}
|
||||
return response;
|
||||
}
|
||||
}
|
||||
|
||||
async function createResponse(response: Response): Promise<any> {
|
||||
const type: string = response.headers.get("Content-Type");
|
||||
const body = (): Promise<any> => {
|
||||
if (type.indexOf("application/json") !== -1) {
|
||||
return response.json();
|
||||
}
|
||||
return response.text();
|
||||
};
|
||||
|
||||
return body();
|
||||
}
|
||||
|
||||
function resolveUrl(url: string, path: string): string {
|
||||
if (path.includes("http") || path.includes("://")) {
|
||||
return path;
|
||||
}
|
||||
const fixedPath = path.split("/").join("/");
|
||||
const urlWithPath = `${url.endsWith("/") ? url : `${url}/`}${path}`;
|
||||
return urlWithPath;
|
||||
}
|
||||
|
||||
type BodyType = string | FormData;
|
||||
type OptionsType = {
|
||||
method: string;
|
||||
headers?: Headers;
|
||||
body?: BodyType;
|
||||
};
|
||||
2
src/core/services/index.ts
Normal file
2
src/core/services/index.ts
Normal file
@@ -0,0 +1,2 @@
|
||||
export { default as HttpClient } from "./http-service/HttpClient";
|
||||
export { default as BaseService } from "./base-service/BaseService";
|
||||
0
src/pages/index.ts
Normal file
0
src/pages/index.ts
Normal file
Reference in New Issue
Block a user