You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
54 lines
1.5 KiB
54 lines
1.5 KiB
7 years ago
|
import { TokenStore } from "@app/state/TokenStore";
|
||
|
|
||
|
export class HttpApiError extends Error {
|
||
|
name = "HttpApiError";
|
||
|
status: number;
|
||
|
|
||
|
constructor(message: string, status: number = 500) {
|
||
|
super(message);
|
||
|
this.status = status;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export default class HttpApi {
|
||
|
baseUrl: string;
|
||
|
|
||
|
tokenStore: TokenStore;
|
||
|
|
||
|
private get authorizationHeader(): {} | { "Authorization": string } {
|
||
|
if (!this.tokenStore.accessToken) {
|
||
|
return {};
|
||
|
}
|
||
|
return { Authorization: `Bearer ${this.tokenStore.accessToken.token}` };
|
||
|
}
|
||
|
|
||
|
constructor(baseUrl: string = `http://${location.hostname}:${location.port}/api`) {
|
||
|
while (baseUrl.charAt(baseUrl.length - 1) === "/") {
|
||
|
baseUrl = baseUrl.substring(0, baseUrl.length - 1);
|
||
|
}
|
||
|
this.baseUrl = baseUrl;
|
||
|
|
||
|
this.tokenStore = new TokenStore(this);
|
||
|
}
|
||
|
|
||
|
async makeRequest(url: string, options?: RequestInit, body?: any): Promise<any> {
|
||
|
options = options || {};
|
||
|
options = {
|
||
|
headers: {
|
||
|
"Content-Type": "application/json",
|
||
|
...this.authorizationHeader,
|
||
|
...options.headers || {},
|
||
|
},
|
||
|
body: JSON.stringify(body),
|
||
|
...options,
|
||
|
};
|
||
|
const response = await fetch(this.baseUrl + url, options);
|
||
|
const responseBody = await response.json() || {};
|
||
|
if (!response.ok) {
|
||
|
throw new HttpApiError(responseBody.message || response.statusText, response.status);
|
||
|
}
|
||
|
return responseBody;
|
||
|
}
|
||
|
|
||
|
}
|