diff --git a/server/src/bin/letterbox-server.rs b/server/src/bin/letterbox-server.rs index a780ff4..b6611ba 100644 --- a/server/src/bin/letterbox-server.rs +++ b/server/src/bin/letterbox-server.rs @@ -8,10 +8,10 @@ use async_graphql_axum::{GraphQL, GraphQLSubscription}; //allows to extract the IP of connecting user use axum::extract::connect_info::ConnectInfo; use axum::{ - extract::{self, ws::WebSocketUpgrade, State}, + extract::{self, ws::WebSocketUpgrade, Query, State}, http::{header, StatusCode}, response::{self, IntoResponse, Response}, - routing::{any, get}, + routing::{any, get, post}, Router, }; use cacher::FilesystemCacher; @@ -25,6 +25,7 @@ use letterbox_server::{ ws::ConnectionTracker, }; use letterbox_shared::WebsocketMessage; +use serde::Deserialize; use sqlx::postgres::PgPool; use tokio::{net::TcpListener, sync::Mutex}; use tower_http::trace::{DefaultMakeSpan, TraceLayer}; @@ -159,18 +160,29 @@ async fn start_ws( ) -> impl IntoResponse { ws.on_upgrade(async move |socket| connection_tracker.lock().await.add_peer(socket, addr).await) } -#[axum_macros::debug_handler] -async fn test_handler( + +#[derive(Debug, Deserialize)] +struct NotificationParams { + delay_ms: Option, +} +async fn send_refresh_websocket_handler( State(AppState { connection_tracker, .. }): State, + params: Query, ) -> impl IntoResponse { + info!("send_refresh_websocket_handler params {params:?}"); + if let Some(delay_ms) = params.delay_ms { + let delay = Duration::from_millis(delay_ms); + info!("sleeping {delay:?}"); + tokio::time::sleep(delay).await; + } connection_tracker .lock() .await .send_message_all(WebsocketMessage::RefreshMessages) .await; - "test triggered" + "refresh triggered" } async fn watch_new( @@ -240,23 +252,26 @@ async fn main() -> Result<(), Box> { let poll_time = Duration::from_secs(10); let _h = tokio::spawn(watch_new(nm.clone(), pool, ct, poll_time)); - let app = Router::new() - .route("/test", get(test_handler)) + let api_routes = Router::new() .route( - "/api/download/attachment/{id}/{idx}/{*rest}", + "/download/attachment/{id}/{idx}/{*rest}", get(download_attachment), ) + .route("/view/attachment/{id}/{idx}/{*rest}", get(view_attachment)) + .route("/cid/{id}/{cid}", get(view_cid)) + .route("/ws", any(start_ws)) + .route_service("/graphql/ws", GraphQLSubscription::new(schema.clone())) .route( - "/api/view/attachment/{id}/{idx}/{*rest}", - get(view_attachment), - ) - .route("/api/cid/{id}/{cid}", get(view_cid)) - .route("/api/ws", any(start_ws)) - .route_service("/api/graphql/ws", GraphQLSubscription::new(schema.clone())) - .route( - "/api/graphql/", + "/graphql/", get(graphiql).post_service(GraphQL::new(schema.clone())), - ) + ); + + let notification_routes = Router::new() + .route("/mail", post(send_refresh_websocket_handler)) + .route("/news", post(send_refresh_websocket_handler)); + let app = Router::new() + .nest("/api", api_routes) + .nest("/notification", notification_routes) .with_state(AppState { nm, connection_tracker,