use axum::{ extract::{Path, Query, State}, response::{IntoResponse, Response}, routing::get, Json, Router, }; use http::StatusCode; use pasetors::claims::ClaimsValidationRules; use crate::{ db::verify_user, models::ApiResponse, requests::AppState, services::auth_token::verify_token, }; use super::{UserVerifyGetRequest, UserVerifyGetResponse}; pub fn request(app_state: AppState) -> Router { Router::new().route("/:user_id/verify", get(get_handler).with_state(app_state)) } async fn get_handler( State(app_state): State, Path(user_id): Path, Query(request): Query, ) -> Result { let UserVerifyGetRequest { auth_token } = request; let validation_rules = { let mut rules = ClaimsValidationRules::new(); rules.validate_audience_with(format!("/user/{user_id}/verify").as_str()); rules }; let key = app_state.env().token_key(); let response = verify_token(key, auth_token.as_str(), Some(validation_rules)) .map(|_| UserVerifyGetResponse::new(key, user_id)) .map_err(|err| err.into_response())?; verify_user(app_state.pool(), user_id) .await .map_err(|err| err.into_response())?; Ok(( StatusCode::OK, Json(ApiResponse::::new(response)), ) .into_response()) }