aboutsummaryrefslogtreecommitdiffhomepage
path: root/typespec/api-server/models.tsp
blob: 47519be0d220e93c6c8a771abfe6284dd364795d (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
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;
}