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

67 lines
1.7 KiB
Rust
Raw Normal View History

use axum::{
2024-10-03 15:27:30 -04:00
debug_handler,
extract::{Path, Query, State},
response::{IntoResponse, Response},
2024-10-03 15:27:30 -04:00
Json,
};
use http::StatusCode;
2024-10-03 15:27:30 -04:00
use pasetors::{claims::ClaimsValidationRules, keys::SymmetricKey, version4::V4};
use tracing::{debug, error};
use crate::{
2024-10-03 15:27:30 -04:00
db::{verify_user, DbPool},
models::{ApiResponse, AppError},
2024-10-03 15:27:30 -04:00
requests::AppState,
services::auth_token::verify_token,
};
2024-10-03 15:27:30 -04:00
use super::{UserVerifyGetParams, UserVerifyGetResponse};
2024-10-03 15:27:30 -04:00
#[debug_handler]
pub async fn user_verification_get_handler(
State(state): State<AppState>,
Path(user_id): Path<i32>,
Query(query): Query<UserVerifyGetParams>,
) -> Result<Response, AppError> {
2024-10-03 15:27:30 -04:00
let pool = state.pool();
let env = state.env();
let UserVerifyGetParams { verification_token } = query;
let token_key = env.token_key();
verify_new_user_request(pool, user_id, verification_token, token_key).await
}
2024-10-03 15:27:30 -04:00
async fn verify_new_user_request(
pool: &DbPool,
user_id: i32,
verification_token: String,
token_key: &SymmetricKey<V4>,
) -> Result<Response, AppError> {
2024-10-03 15:27:30 -04:00
debug!(user_id);
let validation_rules = {
let mut rules = ClaimsValidationRules::new();
rules.validate_audience_with(format!("/user/{user_id}/verify").as_str());
rules
};
2024-10-03 15:27:30 -04:00
let response = verify_token(
token_key,
verification_token.as_str(),
Some(validation_rules),
)
.map(|_| UserVerifyGetResponse::new(token_key, user_id))
.inspect_err(|err| error!(?err))?;
2024-10-03 15:27:30 -04:00
verify_user(pool, user_id)
.await
.inspect_err(|err| error!(?err))?;
Ok((
StatusCode::OK,
Json(ApiResponse::<UserVerifyGetResponse>::new(response)),
)
.into_response())
}