algohub_server/models/
contest.rs1use serde::{Deserialize, Serialize};
2use surrealdb::sql::Thing;
3
4use super::{OwnedCredentials, UserRecordId};
5
6#[derive(Serialize, Deserialize)]
7#[serde(rename_all = "lowercase")]
8pub enum Visibility {
9 Public,
10 Internal,
11 Private,
12}
13
14#[derive(Debug, Default, Clone, Serialize, Deserialize)]
15pub enum Mode {
16 #[default]
17 ICPC,
18 OI,
19}
20
21#[derive(Serialize, Deserialize)]
22pub struct Contest {
23 pub id: Option<Thing>,
24
25 pub name: String,
26 pub mode: Mode,
27 pub visibility: Visibility,
28 pub description: String,
29 pub announcement: Option<String>,
30
31 pub start_time: chrono::NaiveDateTime,
32 pub end_time: chrono::NaiveDateTime,
33
34 pub owner: Thing,
35 pub creator: Thing,
36 pub updaters: Vec<Thing>,
37 pub participants: Vec<Thing>,
38
39 pub created_at: chrono::NaiveDateTime,
40 pub updated_at: chrono::NaiveDateTime,
41}
42
43#[derive(Serialize, Deserialize)]
44pub struct ContestData {
45 pub name: String,
46 pub mode: Mode,
47 pub visibility: Visibility,
48 pub description: String,
49 pub start_time: chrono::NaiveDateTime,
50 pub end_time: chrono::NaiveDateTime,
51 pub owner: UserRecordId,
52}
53
54#[derive(Serialize, Deserialize)]
55pub struct CreateContest {
56 pub auth: OwnedCredentials,
57 pub data: ContestData,
58}
59
60#[derive(Serialize, Deserialize)]
61pub struct AddProblems<'a> {
62 pub auth: OwnedCredentials,
63 pub contest_id: &'a str,
64 pub problem_ids: Vec<&'a str>,
65}
66
67#[derive(Serialize, Deserialize)]
68pub struct RemoveProblem {
69 pub auth: OwnedCredentials,
70 pub contest_id: Thing,
71 pub problem_id: Thing,
72}
73
74#[derive(Serialize, Deserialize)]
75pub struct UserContest {
76 pub id: String,
77
78 pub name: String,
79 pub mode: Mode,
80 pub visibility: Visibility,
81 pub description: String,
82 pub announcement: Option<String>,
83
84 pub start_time: chrono::NaiveDateTime,
85 pub end_time: chrono::NaiveDateTime,
86
87 pub owner: UserRecordId,
88 pub creator: String,
89 pub updaters: Vec<String>,
90 pub participants: Vec<String>,
91
92 pub created_at: chrono::NaiveDateTime,
93 pub updated_at: chrono::NaiveDateTime,
94}
95
96impl From<Contest> for UserContest {
97 fn from(value: Contest) -> Self {
98 UserContest {
99 id: value.id.unwrap().id.to_string(),
100 name: value.name,
101 mode: value.mode,
102 visibility: value.visibility,
103 description: value.description,
104 announcement: value.announcement,
105 start_time: value.start_time,
106 end_time: value.end_time,
107 owner: value.owner.into(),
108 creator: value.creator.to_string(),
109 updaters: value.updaters.iter().map(|x| x.id.to_string()).collect(),
110 participants: value
111 .participants
112 .iter()
113 .map(|x| x.id.to_string())
114 .collect(),
115 created_at: value.created_at,
116 updated_at: value.updated_at,
117 }
118 }
119}
120
121#[derive(Serialize, Deserialize, Debug)]
122#[serde(rename_all = "camelCase")]
123pub struct ContestProblem {
124 pub id: String,
125 pub title: String,
126 pub solved: bool,
127 pub submitted_count: u32,
128 pub accepted_count: u32,
129}