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
|
using TypeSpec.Http;
using TypeSpec.OpenAPI;
namespace AlbatrossApi;
// ---------- Error ----------
model Error {
message: string;
}
// ---------- Error Responses ----------
@error
model UnauthorizedError {
@statusCode statusCode: 401;
@body body: Error;
}
@error
model ForbiddenError {
@statusCode statusCode: 403;
@body body: Error;
}
@error
model NotFoundError {
@statusCode statusCode: 404;
@body body: Error;
}
// ---------- Enums ----------
enum GameType {
`1v1`,
multiplayer,
}
enum ProblemLanguage {
php,
swift,
}
enum ExecutionStatus {
none,
running,
success,
wrong_answer,
timeout,
compile_error,
runtime_error,
internal_error,
}
// ---------- Models ----------
model User {
user_id: integer;
username: string;
display_name: string;
icon_path?: string;
is_admin: boolean;
label: string | null;
}
model Problem {
problem_id: integer;
title: string;
description: string;
language: ProblemLanguage;
sample_code: string;
}
model Game {
game_id: integer;
game_type: GameType;
is_public: boolean;
display_name: string;
duration_seconds: integer;
@extension("x-go-type", "int64")
started_at?: integer;
problem: Problem;
main_players: User[];
}
model LatestGameState {
code: string;
score: integer | null;
@extension("x-go-type", "int64")
best_score_submitted_at: integer | null;
status: ExecutionStatus;
}
model RankingEntry {
player: User;
score: integer;
@extension("x-go-type", "int64")
submitted_at: integer;
code: string | null;
}
model Tournament {
matches: TournamentMatch[];
}
model TournamentMatch {
game_id: integer;
player1?: User;
player2?: User;
player1_score?: integer;
player2_score?: integer;
winner?: integer;
}
|