api/ws/tickets/
handlers.rs

1use std::sync::Arc;
2use axum::{
3    extract::{Path, State, WebSocketUpgrade},
4    response::IntoResponse,
5    Extension,
6};
7use util::state::AppState;
8use util::ws::serve::WsServerOptions;
9use util::ws::axum_adapter::ws_route;
10use crate::auth::AuthUser;
11use super::topics::ticket_chat_topic;
12use super::ws_handlers::TicketWsHandler;
13
14pub async fn ticket_chat_handler(
15    ws: WebSocketUpgrade,
16    State(state): State<AppState>,
17    Extension(AuthUser(claims)): Extension<AuthUser>,
18    Path(ticket_id): Path<i64>,
19) -> impl IntoResponse {
20    let uid_opt = Some(claims.sub);              // presence enabled
21    let handler = Arc::new(TicketWsHandler);
22    let topic = move || ticket_chat_topic(ticket_id);
23    let opts = WsServerOptions::default();       // 30s WS ping; auto app-ping → pong enabled
24
25    // Adapter expects Extension<Uid> where Uid: Into<Option<i64>>
26    ws_route(ws, State(state), Extension(uid_opt), topic, handler, opts).await
27}