Files
frangipane-backend/src/routes/ws.rs
T

41 lines
994 B
Rust

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<sqlx::PgPool>,
headers: HeaderMap,
) -> Result<(StatusCode, Json<WsAuthQuery>), 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 })))
}