debt-pirate/api/src/requests/user/verify/request.rs

49 lines
1.4 KiB
Rust
Raw Normal View History

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<AppState>,
Path(user_id): Path<i32>,
Query(request): Query<UserVerifyGetRequest>,
) -> Result<Response, Response> {
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::<UserVerifyGetResponse>::new(response)),
)
.into_response())
}