Add tokens routes
This commit is contained in:
87
moneymgr_backend/src/controllers/tokens_controller.rs
Normal file
87
moneymgr_backend/src/controllers/tokens_controller.rs
Normal file
@ -0,0 +1,87 @@
|
||||
use crate::controllers::HttpResult;
|
||||
use crate::controllers::server_controller::ServerConstraints;
|
||||
use crate::extractors::auth_extractor::{AuthExtractor, AuthenticatedMethod};
|
||||
use crate::models::tokens::{Token, TokenID};
|
||||
use crate::services::tokens_service;
|
||||
use crate::services::tokens_service::NewTokenInfo;
|
||||
use actix_web::{HttpResponse, web};
|
||||
|
||||
#[derive(serde::Deserialize)]
|
||||
pub struct CreateTokenBody {
|
||||
name: String,
|
||||
ip_net: Option<ipnet::IpNet>,
|
||||
max_inactivity: u32,
|
||||
read_only: bool,
|
||||
right_account: bool,
|
||||
right_movement: bool,
|
||||
right_inbox: bool,
|
||||
right_attachment: bool,
|
||||
right_auth: bool,
|
||||
}
|
||||
|
||||
#[derive(serde::Serialize)]
|
||||
pub struct CreateTokenResult {
|
||||
#[serde(flatten)]
|
||||
info: Token,
|
||||
token: String,
|
||||
}
|
||||
|
||||
/// Create a new token
|
||||
pub async fn create(auth: AuthExtractor, req: web::Json<CreateTokenBody>) -> HttpResult {
|
||||
if matches!(auth.method, AuthenticatedMethod::Token(_)) {
|
||||
return Ok(HttpResponse::Forbidden()
|
||||
.json("It is not allowed to create a token using another token!"));
|
||||
}
|
||||
|
||||
let constraints = ServerConstraints::default();
|
||||
|
||||
if !lazy_regex::regex!("^[a-zA-Z0-9 :-]+$").is_match(&req.name) {
|
||||
return Ok(HttpResponse::BadRequest().json("Token name contains invalid characters!"));
|
||||
}
|
||||
|
||||
if !constraints.token_name.check_str(&req.name) {
|
||||
return Ok(HttpResponse::BadRequest().json("Invalid token name length!"));
|
||||
}
|
||||
|
||||
if !constraints
|
||||
.token_max_inactivity
|
||||
.check_u32(req.max_inactivity)
|
||||
{
|
||||
return Ok(HttpResponse::BadRequest().json("Invalid token max inactivity!"));
|
||||
}
|
||||
|
||||
let token = tokens_service::create(NewTokenInfo {
|
||||
user_id: auth.user_id(),
|
||||
max_inactivity: req.max_inactivity,
|
||||
ip_net: req.ip_net,
|
||||
name: req.name.clone(),
|
||||
read_only: req.read_only,
|
||||
right_account: req.right_account,
|
||||
right_movement: req.right_movement,
|
||||
right_inbox: req.right_inbox,
|
||||
right_attachment: req.right_attachment,
|
||||
right_auth: req.right_auth,
|
||||
})
|
||||
.await?;
|
||||
|
||||
Ok(HttpResponse::Created().json(CreateTokenResult {
|
||||
token: token.token_value.to_string(),
|
||||
info: token,
|
||||
}))
|
||||
}
|
||||
|
||||
/// Get the list of tokens of the user
|
||||
pub async fn get_list(auth: AuthExtractor) -> HttpResult {
|
||||
Ok(HttpResponse::Ok().json(tokens_service::get_list_user(auth.user_id()).await?))
|
||||
}
|
||||
|
||||
#[derive(serde::Deserialize)]
|
||||
pub struct TokenIDInPath {
|
||||
id: TokenID,
|
||||
}
|
||||
|
||||
/// Delete an API access token
|
||||
pub async fn delete(auth: AuthExtractor, path: web::Path<TokenIDInPath>) -> HttpResult {
|
||||
tokens_service::delete(auth.user_id(), path.id).await?;
|
||||
Ok(HttpResponse::Accepted().finish())
|
||||
}
|
Reference in New Issue
Block a user