Skip to main content

api/services/stream/
available_games_events.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::{AvailableGameEventDTO, UserIdDTO};
11
12#[get("/api/{user_id}/available_games/events", State(server_state): State<ServerStateExtractor>)]
13pub async fn available_games_events(
14    user_id: UserIdDTO,
15) -> Result<Streaming<AvailableGameEventDTO, JsonEncoding>> {
16    use futures::StreamExt;
17    use server::{
18        domain::UserId,
19        stream::{AvailableGameEvent, available_game_events},
20    };
21
22    use crate::dto::GameIdDTO;
23
24    let user_id = UserId::from(user_id.value());
25
26    let game_event_to_dto = |event| match event {
27        AvailableGameEvent::Created { game_id, name } => {
28            let game_id = GameIdDTO::from(game_id.value());
29            AvailableGameEventDTO::Created { game_id, name }
30        }
31    };
32
33    let stream = available_game_events(server_state.0, user_id).await?;
34    let stream = stream.map(game_event_to_dto);
35
36    Ok(Streaming::new(stream))
37}