diff --git a/moneymgr_backend/src/controllers/accounts_controller.rs b/moneymgr_backend/src/controllers/accounts_controller.rs index 0f4f4c3..b23db52 100644 --- a/moneymgr_backend/src/controllers/accounts_controller.rs +++ b/moneymgr_backend/src/controllers/accounts_controller.rs @@ -1,31 +1,17 @@ use crate::controllers::HttpResult; -use crate::controllers::server_controller::ServerConstraints; use crate::extractors::account_extractor::AccountInPath; use crate::extractors::auth_extractor::AuthExtractor; use crate::services::accounts_service; use crate::services::accounts_service::UpdateAccountQuery; use actix_web::{HttpResponse, web}; -#[derive(serde::Deserialize)] -pub struct CreateAccountRequest { - name: String, -} - /// Create a new account -pub async fn create(auth: AuthExtractor, req: web::Json) -> HttpResult { - let constraints = ServerConstraints::default(); - - if !constraints.account_name.check_str(&req.name) { - return Ok(HttpResponse::BadRequest().json("Invalid account name length!")); +pub async fn create(auth: AuthExtractor, req: web::Json) -> HttpResult { + if let Some(err) = req.check_error() { + return Ok(HttpResponse::BadRequest().json(err)); } - accounts_service::create( - auth.user_id(), - &UpdateAccountQuery { - name: req.name.clone(), - }, - ) - .await?; + accounts_service::create(auth.user_id(), &req).await?; Ok(HttpResponse::Created().finish()) } @@ -40,6 +26,17 @@ pub async fn get_single(account: AccountInPath) -> HttpResult { Ok(HttpResponse::Ok().json(account.as_ref())) } +/// Update an account information +pub async fn update(account: AccountInPath, req: web::Json) -> HttpResult { + if let Some(err) = req.check_error() { + return Ok(HttpResponse::BadRequest().json(err)); + } + + accounts_service::update(account.as_ref().id(), &req).await?; + + Ok(HttpResponse::Accepted().finish()) +} + /// Delete an account pub async fn delete(account: AccountInPath) -> HttpResult { accounts_service::delete(account.as_ref().id()).await?; diff --git a/moneymgr_backend/src/main.rs b/moneymgr_backend/src/main.rs index f852cdf..e2af597 100644 --- a/moneymgr_backend/src/main.rs +++ b/moneymgr_backend/src/main.rs @@ -107,7 +107,10 @@ async fn main() -> std::io::Result<()> { "/api/account/{account_id}", web::get().to(accounts_controller::get_single), ) - // TODO : update account + .route( + "/api/account/{account_id}", + web::put().to(accounts_controller::update), + ) .route( "/api/account/{account_id}", web::delete().to(accounts_controller::delete), diff --git a/moneymgr_backend/src/services/accounts_service.rs b/moneymgr_backend/src/services/accounts_service.rs index 8884904..e53e6cf 100644 --- a/moneymgr_backend/src/services/accounts_service.rs +++ b/moneymgr_backend/src/services/accounts_service.rs @@ -1,4 +1,5 @@ use crate::connections::db_connection::db; +use crate::controllers::server_controller::ServerConstraints; use crate::models::accounts::{Account, AccountID, NewAccount}; use crate::models::users::UserID; use crate::schema::accounts; @@ -11,6 +12,18 @@ pub struct UpdateAccountQuery { pub name: String, } +impl UpdateAccountQuery { + pub fn check_error(&self) -> Option<&'static str> { + let constraints = ServerConstraints::default(); + + if !constraints.account_name.check_str(&self.name) { + return Some("Invalid account name length!"); + } + + None + } +} + /// Create a new account pub async fn create(user_id: UserID, query: &UpdateAccountQuery) -> anyhow::Result { let new_account = NewAccount {