2024-08-06 11:08:15 -04:00
|
|
|
use axum::{
|
2024-10-03 15:27:30 -04:00
|
|
|
debug_handler,
|
2024-08-06 11:08:15 -04:00
|
|
|
extract::{Path, Query, State},
|
|
|
|
response::{IntoResponse, Response},
|
2024-10-03 15:27:30 -04:00
|
|
|
Json,
|
2024-08-06 11:08:15 -04:00
|
|
|
};
|
|
|
|
use http::StatusCode;
|
2024-10-03 15:27:30 -04:00
|
|
|
use pasetors::{claims::ClaimsValidationRules, keys::SymmetricKey, version4::V4};
|
|
|
|
use tracing::{debug, error};
|
2024-08-06 11:08:15 -04:00
|
|
|
|
|
|
|
use crate::{
|
2024-10-03 15:27:30 -04:00
|
|
|
db::{verify_user, DbPool},
|
|
|
|
models::ApiResponse,
|
|
|
|
requests::AppState,
|
|
|
|
services::auth_token::verify_token,
|
2024-08-06 11:08:15 -04:00
|
|
|
};
|
|
|
|
|
2024-10-03 15:27:30 -04:00
|
|
|
use super::{UserVerifyGetParams, UserVerifyGetResponse};
|
2024-08-06 11:08:15 -04:00
|
|
|
|
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, Response> {
|
|
|
|
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-08-06 11:08:15 -04:00
|
|
|
}
|
|
|
|
|
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>,
|
2024-08-06 11:08:15 -04:00
|
|
|
) -> Result<Response, Response> {
|
2024-10-03 15:27:30 -04:00
|
|
|
debug!(user_id);
|
2024-08-06 11:08:15 -04:00
|
|
|
|
|
|
|
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))
|
|
|
|
.map_err(|err| err.into_response())?;
|
2024-08-06 11:08:15 -04:00
|
|
|
|
2024-10-03 15:27:30 -04:00
|
|
|
verify_user(pool, user_id)
|
2024-08-06 11:08:15 -04:00
|
|
|
.await
|
2024-10-03 15:27:30 -04:00
|
|
|
.inspect_err(|err| error!(?err))
|
2024-08-06 11:08:15 -04:00
|
|
|
.map_err(|err| err.into_response())?;
|
|
|
|
|
|
|
|
Ok((
|
|
|
|
StatusCode::OK,
|
|
|
|
Json(ApiResponse::<UserVerifyGetResponse>::new(response)),
|
|
|
|
)
|
|
|
|
.into_response())
|
|
|
|
}
|