react-logo/frontend/src/services/api-client.service.js

87 lines
2.2 KiB
JavaScript

import { UnauthorizedError } from '../errors/unauthorized.error.js';
import { APIError } from '../errors/api.error.js';
export const UnauthorizedStatusCode = 401;
export class APIClient {
constructor(baseURL = 'http://localhost:8001/api/v1') {
this.baseURL = baseURL;
this.login = this.login.bind(this);
this.logout = this.logout.bind(this);
this.retrieveSessionUser = this.retrieveSessionUser.bind(this);
this.listUsers = this.listUsers.bind(this);
this.listRequests = this.listRequests.bind(this);
this.createUser = this.createUser.bind(this);
}
login(username, password) {
return this._callAPI('/login', { username, password }, 'POST')
.then(result => result.data);
}
logout() {
return this._callAPI('/logout');
}
retrieveSessionUser() {
return this._callAPI('/me')
.then(result => result.data);
}
listUsers() {
return this._callAPI('/users');
}
listRequests() {
}
createRequest(request) {
}
createUser(username, password) {
return this._callAPI('/users', { username, password }, 'POST')
.then(this._withAPIErrorMiddleware('create_user'))
.then(result => result.data);
}
updateRequestStatus(reqID, newStatus) {
}
_callAPI(path, body, method='GET') {
return fetch(this.baseURL + path, {
method,
headers: {
'Content-Type': 'application/json',
},
mode: 'cors',
credentials: 'include',
body: JSON.stringify(body),
})
.then(this._withUnauthorizedErrorMiddleware())
.then(res => res.json());
}
_withUnauthorizedErrorMiddleware() {
return res => {
if (res.status === UnauthorizedStatusCode) {
throw new UnauthorizedError();
}
return res;
};
}
_withAPIErrorMiddleware(endpoint) {
return result => {
if (result.error) {
const { code, message, data } = result.error;
throw new APIError(endpoint, code, message, data);
}
return result;
};
}
}