feat: implement game creation with a new frontend form, backend API endpoint, and protobuf definition.
This commit is contained in:
+38
-7
@@ -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],
|
||||
|
||||
Reference in New Issue
Block a user