|
|
@@ -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
|
|
|
+ }))
|
|
|
+}
|