feat: implement game creation with a new frontend form, backend API endpoint, and protobuf definition.

This commit is contained in:
2025-12-03 18:50:52 +01:00
parent 434eef5e1c
commit e192829fdd
4 changed files with 181 additions and 8 deletions
+38 -7
View File
@@ -85,23 +85,51 @@ fn get_users(
#[get("/game/<title>")]
fn get_game(
_token: auth::Token,
game_list: &rocket::State<Vec<Game>>,
game_list: &rocket::State<Mutex<Vec<Game>>>,
title: &str,
) -> Option<items::Game> {
game_list.iter().find(|g| g.title == title).cloned()
let games = game_list.lock().unwrap();
games.iter().find(|g| g.title == title).cloned()
}
#[post("/game", data = "<game>")]
fn add_game(
_token: auth::Token,
game_list: &rocket::State<Mutex<Vec<Game>>>,
user_list: &rocket::State<Mutex<Vec<User>>>,
game: proto_utils::Proto<items::Game>,
) -> Option<items::Game> {
let mut games = game_list.lock().unwrap();
let game = game.into_inner();
if games.iter().any(|g| g.title == game.title) {
return None;
}
games.push(game.clone());
let users = user_list.lock().unwrap();
save_state(&games, &users);
Some(game)
}
#[post("/opinion", data = "<req>")]
fn add_opinion(
token: auth::Token,
user_list: &rocket::State<Mutex<Vec<User>>>,
game_list: &rocket::State<Vec<Game>>,
game_list: &rocket::State<Mutex<Vec<Game>>>,
req: proto_utils::Proto<items::AddOpinionRequest>,
) -> Option<items::Person> {
let mut users = user_list.lock().unwrap();
let games = game_list.lock().unwrap();
let mut result = None;
// Validate game exists
if !games.iter().any(|g| g.title == req.game_title) {
return None;
}
if let Some(user) = users.iter_mut().find(|u| u.person.name == token.username) {
let req = req.into_inner();
let opinion = items::Opinion {
@@ -123,7 +151,7 @@ fn add_opinion(
}
if result.is_some() {
save_state(game_list, &users);
save_state(&games, &users);
}
result
}
@@ -172,8 +200,11 @@ async fn main() -> Result<(), std::io::Error> {
rocket::build()
.manage(Mutex::new(user_list))
.manage(auth::AuthState::new())
.manage(game_list)
.mount("/api", routes![get_users, get_user, get_game, add_opinion])
.manage(Mutex::new(game_list))
.mount(
"/api",
routes![get_users, get_user, get_game, add_opinion, add_game],
)
.mount(
"/auth",
routes![auth::login, auth::logout, auth::get_auth_status],