Skip to main content

hvz/endpoints/
settings.rs

1use actix_web::{HttpRequest, HttpResponse, Responder, get, post, web};
2
3use crate::{
4    player::Player, settings::{CHECKPOINT, HAS_STARTED, MAINTENANCE, Settings}, token::Token,
5};
6
7/// **POST /settings/set_maintenance/{url_id}** - Set maintenance mode
8#[post("/settings/set_maintenance/{url_id}")]
9async fn set_maintenance(
10    url_id: web::Path<String>,
11    req: HttpRequest,
12    form: web::Json<bool>,
13) -> impl Responder {
14    if let Err(e) = Token::check_token(&req, &url_id).await {
15        return HttpResponse::Forbidden().body(e);
16    }
17
18    let admin = match Player::get_player(url_id.into_inner()).await {
19        Ok(Some(player)) => {
20            if let Err(err) = player.ensure_admin().await {
21                return HttpResponse::Unauthorized().body(err);
22            };
23            player
24        }
25        Ok(None) => return HttpResponse::NotFound().body("Player not found"),
26        Err(err) => return HttpResponse::InternalServerError().body(err),
27    };
28
29    let result = Settings::set_settings(MAINTENANCE, if form.0 { "true" } else { "false" }).await;
30
31    match result {
32        Ok(_) => HttpResponse::Ok().body("Maintenance mode enabled"),
33        Err(err) => HttpResponse::InternalServerError().body(err),
34    }
35}
36
37/// **GET /settings/get_maintenance** - Get maintenance mode
38#[get("/settings/get_maintenance")]
39async fn get_maintenance(req: HttpRequest) -> impl Responder {
40    let maintenance: Result<String, _> = Settings::get_settings(MAINTENANCE).await;
41
42    match maintenance {
43        Ok(maintenance) => HttpResponse::Ok().body(maintenance),
44        Err(err) => HttpResponse::InternalServerError().body(err),
45    }
46}
47
48/// **POST /settings/start_edition/{url_id}** - Start the edition
49#[post("/settings/start_edition/{url_id}")]
50async fn start_edition(
51    url_id: web::Path<String>,
52    req: HttpRequest,
53    form: web::Json<bool>,
54) -> impl Responder {
55    if let Err(e) = Token::check_token(&req, &url_id).await {
56        return HttpResponse::Forbidden().body(e);
57    }
58
59    let admin = match Player::get_player(url_id.into_inner()).await {
60        Ok(Some(player)) => {
61            if let Err(err) = player.ensure_admin().await {
62                return HttpResponse::Unauthorized().body(err);
63            };
64            player
65        }
66        Ok(None) => return HttpResponse::NotFound().body("Player not found"),
67        Err(err) => return HttpResponse::InternalServerError().body(err),
68    };
69
70    let result = Settings::set_settings(HAS_STARTED, "true").await;
71
72    match result {
73        Ok(_) => HttpResponse::Ok().body("Edition started"),
74        Err(err) => HttpResponse::InternalServerError().body(err),
75    }
76}
77
78/// **POST /settings/stop_edition/{url_id}** - Stop the edition
79#[post("/settings/stop_edition/{url_id}")]
80async fn stop_edition(
81    url_id: web::Path<String>,
82    req: HttpRequest,
83) -> impl Responder {
84    if let Err(e) = Token::check_token(&req, &url_id).await {
85        return HttpResponse::Forbidden().body(e);
86    }
87
88    let admin = match Player::get_player(url_id.into_inner()).await {
89        Ok(Some(player)) => {
90            if let Err(err) = player.ensure_admin().await {
91                return HttpResponse::Unauthorized().body(err);
92            };
93            player
94        }
95        Ok(None) => return HttpResponse::NotFound().body("Player not found"),
96        Err(err) => return HttpResponse::InternalServerError().body(err),
97    };
98
99    let result = Settings::set_settings(HAS_STARTED, "false").await;
100
101    match result {
102        Ok(_) => HttpResponse::Ok().body("Edition stopped"),
103        Err(err) => HttpResponse::InternalServerError().body(err),
104    }
105}
106
107/// **GET /settings/edition** - Get the current edition
108#[get("/settings/edition")]
109async fn get_edition() -> impl Responder {
110    let edition: Result<String, _> = Settings::get_settings(HAS_STARTED).await;
111    
112    match edition {
113        Ok(edition) => HttpResponse::Ok().body(edition),
114        Err(err) => HttpResponse::InternalServerError().body(err),
115    }
116}
117
118/// **POST /settings/set_checkpoint/{url_id}** - Set the checkpoint for the current edition
119#[post("/settings/set_checkpoint/{url_id}")]
120async fn set_checkpoint(url_id: web::Path<String>, req: HttpRequest, form: web::Json<String>) -> impl Responder {
121    if let Err(e) = Token::check_token(&req, &url_id).await {
122        return HttpResponse::Unauthorized().body(e);
123    }
124
125    let admin = match Player::get_player(url_id.into_inner()).await {
126        Ok(Some(player)) => {
127            if let Err(err) = player.ensure_admin().await {
128                return HttpResponse::Unauthorized().body(err);
129            }
130            player
131        }
132        Ok(None) => return HttpResponse::NotFound().body("Player not found"),
133        Err(err) => return HttpResponse::InternalServerError().body(err),
134    };
135    
136    let result = Settings::set_settings(CHECKPOINT, form.into_inner()).await;
137
138    match result {
139        Ok(_) => HttpResponse::Ok().body("Checkpoint set"),
140        Err(err) => HttpResponse::InternalServerError().body(err),
141    }
142}
143
144/// **GET /settings/get_checkpoint** - Get the current checkpoint
145#[get("/settings/get_checkpoint")]
146async fn get_checkpoint() -> impl Responder {
147    let checkpoint: Result<String, _> = Settings::get_settings(CHECKPOINT).await;
148    
149    match checkpoint {
150        Ok(checkpoint) => HttpResponse::Ok().body(checkpoint),
151        Err(err) => HttpResponse::InternalServerError().body(err),
152    }
153}