49 lines
1.4 KiB
Rust
49 lines
1.4 KiB
Rust
|
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())
|
||
|
}
|