api/services/stream/
user_game_stream.rs1#[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}