aboutsummaryrefslogtreecommitdiffhomepage
path: root/typespec/api-server/models.tsp
diff options
context:
space:
mode:
Diffstat (limited to 'typespec/api-server/models.tsp')
-rw-r--r--typespec/api-server/models.tsp119
1 files changed, 119 insertions, 0 deletions
diff --git a/typespec/api-server/models.tsp b/typespec/api-server/models.tsp
new file mode 100644
index 0000000..47519be
--- /dev/null
+++ b/typespec/api-server/models.tsp
@@ -0,0 +1,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;
+}