瀏覽代碼

Create route to retrieve a single game.

Lee Morgan 1 月之前
父節點
當前提交
7b29a78b26
共有 4 個文件被更改,包括 50 次插入2 次删除
  1. 1 1
      docs/paths/game/get_one.yaml
  2. 44 0
      src/controllers/game/get_one.rs
  3. 2 0
      src/controllers/game/mod.rs
  4. 3 1
      src/routes/game/game.rs

+ 1 - 1
docs/paths/game/get_one.yaml

@@ -34,7 +34,7 @@ responses:
               type: array
               items:
                 $ref: "#/components/schemas/Turn"
-            remaining_tokens:
+            tokens_remaining:
               type: number
               description: Number of tokens remaining for user
               example: 873042

+ 44 - 0
src/controllers/game/get_one.rs

@@ -0,0 +1,44 @@
+use actix_web::{HttpResponse, HttpRequest, web, get};
+use sqlx::PgPool;
+use uuid::Uuid;
+use serde::Serialize;
+use crate::{
+    http_error::HttpError,
+    auth::user_auth,
+    models::{
+        game::Game,
+        character::Character,
+        session::Session,
+        turn::Turn
+    }
+};
+
+#[derive(Serialize)]
+struct Response {
+    game: Game,
+    character: Character,
+    sessions: Vec<Session>,
+    turns: Vec<Turn>,
+    tokens_remaining: i32
+}
+
+#[get("/game/{game_id}")]
+pub async fn route(
+    db: web::Data<PgPool>,
+    path: web::Path<String>,
+    req: HttpRequest
+) -> Result<HttpResponse, HttpError> {
+    let user = user_auth(&db, &req, false).await?;
+    let game_id = Uuid::parse_str(&path.into_inner())?;
+    let (game, mut characters, sessions) = Game::get_full_game(&db, game_id, Some(user.id)).await?;
+    let recent_session = sessions.iter().max_by_key(|s| s.started_at).unwrap();
+    let turns = Turn::find_by_session(&db, recent_session.id).await?;
+
+    Ok(HttpResponse::Ok().json(Response {
+        game: game,
+        character: characters.remove(0),
+        sessions: sessions,
+        turns: turns,
+        tokens_remaining: user.tokens
+    }))
+}

+ 2 - 0
src/controllers/game/mod.rs

@@ -1,3 +1,5 @@
 pub mod create;
+pub mod get_one;
+
 pub mod character;
 pub mod session;

+ 3 - 1
src/routes/game/game.rs

@@ -1,8 +1,10 @@
 use actix_web::web::ServiceConfig;
 use crate::controllers::game::{
-    create
+    create,
+    get_one
 };
 
 pub fn config(cfg: &mut ServiceConfig) {
     cfg.service(create::route);
+    cfg.service(get_one::route);
 }