62 lines
1.5 KiB
TypeScript
62 lines
1.5 KiB
TypeScript
import { User } from '../types/User';
|
|
|
|
const BASE = 'https://khofmann.userpage.fu-berlin.de/phpCourse/exam/api/';
|
|
|
|
let instance: ApiImpl;
|
|
|
|
class ApiImpl {
|
|
private token: string = '';
|
|
|
|
constructor() {
|
|
if (instance) {
|
|
throw new Error('New instance cannot be created!!');
|
|
}
|
|
|
|
instance = this;
|
|
}
|
|
|
|
public logIn = async (email: string, password: string): Promise<User> => {
|
|
const { user, token } = await (await this.post('login', { email, password })).json();
|
|
this.token = token;
|
|
|
|
return user;
|
|
};
|
|
|
|
public logOut = async (): Promise<boolean> => {
|
|
return await (await this.postAuth('logout')).json();
|
|
};
|
|
|
|
private post = async (
|
|
endpoint: string,
|
|
body: Record<string, unknown> | undefined = undefined,
|
|
headers: HeadersInit | undefined = undefined
|
|
) => {
|
|
const response = await fetch(`${BASE}${endpoint}`, {
|
|
mode: 'cors',
|
|
method: 'post',
|
|
headers,
|
|
body: JSON.stringify(body),
|
|
});
|
|
if (response.ok) return response;
|
|
throw await response.json();
|
|
};
|
|
|
|
private postAuth = async (
|
|
endpoint: string,
|
|
body: Record<string, unknown> | undefined = undefined,
|
|
headers: HeadersInit | undefined = undefined
|
|
) => {
|
|
const response = await fetch(`${BASE}${endpoint}`, {
|
|
mode: 'cors',
|
|
method: 'post',
|
|
headers: { token: this.token, ...headers },
|
|
body: JSON.stringify(body),
|
|
});
|
|
if (response.ok) return response;
|
|
throw await response.json();
|
|
};
|
|
}
|
|
|
|
const Api = new ApiImpl();
|
|
export default Api;
|