Skip to main content

api/services/stream/
user_game_stream.rs

1#[cfg(feature = "server")]
2use dioxus::fullstack::extract::State;
3use dioxus::{
4    fullstack::{JsonEncoding, Streaming},
5    prelude::*,
6};
7
8#[cfg(feature = "server")]
9use crate::ServerStateExtractor;
10use crate::dto::{GameIdDTO, UserGameDTO, UserIdDTO};
11
12#[get("/api/{user_id}/game/{game_id}/stream", State(server_state): State<ServerStateExtractor>)]
13pub async fn user_game_stream(
14    user_id: UserIdDTO,
15    game_id: GameIdDTO,
16) -> Result<Streaming<UserGameDTO, JsonEncoding>> {
17    use futures::StreamExt;
18    use server::{
19        domain::{GameId, UserId},
20        stream::game_stream,
21    };
22
23    let user_id = UserId::from(user_id.value());
24    let game_id = GameId::from(game_id.value());
25
26    let stream = game_stream(server_state.0, game_id).await?;
27    let stream = stream.filter_map(move |game| async move {
28        game.validate_user(user_id)
29            .map(|_| UserGameDTO::from((user_id, &game)))
30    });
31
32    Ok(Streaming::new(stream))
33}