aboutsummaryrefslogtreecommitdiffhomepage
path: root/frontend/app/api/client.ts
blob: 6b7ce80293e002fbc67981d08ec21bc64b1356cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import createClient from "openapi-fetch";
import { createContext } from "react";
import { API_BASE_PATH } from "../config";
import type { paths } from "./schema";

const client = createClient<paths>({
	baseUrl:
		process.env.NODE_ENV === "development"
			? `http://localhost:8004${API_BASE_PATH}`
			: `https://t.nil.ninja${API_BASE_PATH}`,
});

export async function apiLogin(username: string, password: string) {
	const { data, error } = await client.POST("/login", {
		body: {
			username,
			password,
		},
	});
	if (error) throw new Error(error.message);
	return data;
}

class AuthenticatedApiClient {
	constructor(public readonly token: string) {}

	async getGames() {
		const { data, error } = await client.GET("/games", {
			params: {
				header: this._getAuthorizationHeader(),
			},
		});
		if (error) throw new Error(error.message);
		return data;
	}

	async getGame(gameId: number) {
		const { data, error } = await client.GET("/games/{game_id}", {
			params: {
				header: this._getAuthorizationHeader(),
				path: { game_id: gameId },
			},
		});
		if (error) throw new Error(error.message);
		return data;
	}

	async getGamePlayLatestState(gameId: number) {
		const { data, error } = await client.GET(
			"/games/{game_id}/play/latest_state",
			{
				params: {
					header: this._getAuthorizationHeader(),
					path: { game_id: gameId },
				},
			},
		);
		if (error) throw new Error(error.message);
		return data;
	}

	async postGamePlayCode(gameId: number, code: string) {
		const { error } = await client.POST("/games/{game_id}/play/code", {
			params: {
				header: this._getAuthorizationHeader(),
				path: { game_id: gameId },
			},
			body: { code },
		});
		if (error) throw new Error(error.message);
	}

	async postGamePlaySubmit(gameId: number, code: string) {
		const { data, error } = await client.POST("/games/{game_id}/play/submit", {
			params: {
				header: this._getAuthorizationHeader(),
				path: { game_id: gameId },
			},
			body: { code },
		});
		if (error) throw new Error(error.message);
		return data;
	}

	async getGameWatchRanking(gameId: number) {
		const { data, error } = await client.GET("/games/{game_id}/watch/ranking", {
			params: {
				header: this._getAuthorizationHeader(),
				path: { game_id: gameId },
			},
		});
		if (error) throw new Error(error.message);
		return data;
	}

	async getGameWatchLatestStates(gameId: number) {
		const { data, error } = await client.GET(
			"/games/{game_id}/watch/latest_states",
			{
				params: {
					header: this._getAuthorizationHeader(),
					path: { game_id: gameId },
				},
			},
		);
		if (error) throw new Error(error.message);
		return data;
	}

	async getTournament(
		game1: number,
		game2: number,
		game3: number,
		game4: number,
		game5: number,
	) {
		const { data, error } = await client.GET("/tournament", {
			params: {
				header: this._getAuthorizationHeader(),
				query: { game1, game2, game3, game4, game5 },
			},
		});
		if (error) throw new Error(error.message);
		return data;
	}

	_getAuthorizationHeader() {
		return { Authorization: `Bearer ${this.token}` };
	}
}

export function createApiClient(token: string) {
	return new AuthenticatedApiClient(token);
}

export const ApiClientContext = createContext<AuthenticatedApiClient | null>(
	null,
);