|
@@ -2,7 +2,14 @@ use uuid::Uuid;
|
|
|
use chrono::{DateTime, Utc};
|
|
use chrono::{DateTime, Utc};
|
|
|
use sqlx::{PgPool, FromRow};
|
|
use sqlx::{PgPool, FromRow};
|
|
|
use serde::Serialize;
|
|
use serde::Serialize;
|
|
|
-use crate::http_error::HttpError;
|
|
|
|
|
|
|
+use tokio;
|
|
|
|
|
+use crate::{
|
|
|
|
|
+ http_error::HttpError,
|
|
|
|
|
+ models::{
|
|
|
|
|
+ character::Character,
|
|
|
|
|
+ session::Session
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
#[derive(Serialize, FromRow)]
|
|
#[derive(Serialize, FromRow)]
|
|
|
pub struct Game {
|
|
pub struct Game {
|
|
@@ -57,4 +64,43 @@ impl Game {
|
|
|
None => Err(HttpError::NotFound("Game not found".into()))
|
|
None => Err(HttpError::NotFound("Game not found".into()))
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ pub async fn get_full_game(
|
|
|
|
|
+ db: &PgPool,
|
|
|
|
|
+ id: Uuid,
|
|
|
|
|
+ user_id: Option<Uuid>
|
|
|
|
|
+ ) -> Result<(Game, Vec<Character>, Vec<Session>), HttpError> {
|
|
|
|
|
+ let game = sqlx::query_as::<_, Game>(
|
|
|
|
|
+ "SELECT *
|
|
|
|
|
+ FROM games
|
|
|
|
|
+ WHERE id = $1
|
|
|
|
|
+ AND ($2::uuid IS NULL OR user_id = $2)"
|
|
|
|
|
+ )
|
|
|
|
|
+ .bind(id)
|
|
|
|
|
+ .bind(user_id)
|
|
|
|
|
+ .fetch_optional(db);
|
|
|
|
|
+
|
|
|
|
|
+ let characters = sqlx::query_as::<_, Character>(
|
|
|
|
|
+ "SELECT *
|
|
|
|
|
+ FROM characters
|
|
|
|
|
+ WHERE game_id = $1"
|
|
|
|
|
+ )
|
|
|
|
|
+ .bind(id)
|
|
|
|
|
+ .fetch_all(db);
|
|
|
|
|
+
|
|
|
|
|
+ let sessions = sqlx::query_as::<_, Session>(
|
|
|
|
|
+ "SELECT *
|
|
|
|
|
+ FROM sessions
|
|
|
|
|
+ WHERE game_id = $1"
|
|
|
|
|
+ )
|
|
|
|
|
+ .bind(id)
|
|
|
|
|
+ .fetch_all(db);
|
|
|
|
|
+
|
|
|
|
|
+ let (game, characters, sessions) = tokio::try_join!(game, characters, sessions)?;
|
|
|
|
|
+
|
|
|
|
|
+ match game {
|
|
|
|
|
+ Some(g) => Ok((g, characters, sessions)),
|
|
|
|
|
+ None => Err(HttpError::NotFound("Game not found".into()))
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|