algohub_server/models/
contest.rs

1use 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}