use axum::Json; use axum::http::HeaderMap; use axum::routing::get; use axum::{Extension, http::StatusCode}; use serde::Deserialize; use crate::auth::{create_jwt, verify_jwt}; use crate::errors::APIError; #[derive(sqlx::FromRow, serde::Serialize, Deserialize)] pub struct WsAuthQuery { pub token: String, } pub fn routes() -> axum::Router { axum::Router::new().route("/ws/issue-token", get(issue_ws_token)) } pub async fn issue_ws_token( Extension(db): Extension, headers: HeaderMap, ) -> Result<(StatusCode, Json), APIError> { let claims = verify_jwt(headers)?; tracing::debug!("Recieved token issue request from user {}", claims.sub); let token = create_jwt(claims.sub)?; sqlx::query( r#" insert into ws_token_ (token, expires_at) values ($1, now() + interval '30 seconds') "#, ) .bind(&token) .execute(&db) .await?; Ok((StatusCode::CREATED, Json(WsAuthQuery { token }))) }