From 1c4abab453bf1f00e546f22eb76d82f676f817bd Mon Sep 17 00:00:00 2001 From: Ninjdai Date: Fri, 1 Aug 2025 14:00:03 +0200 Subject: [PATCH] feat: Owner PATCH route --- src/main.rs | 1 + src/routes/owner.rs | 60 ++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/main.rs b/src/main.rs index b6ba30b..38d7f14 100644 --- a/src/main.rs +++ b/src/main.rs @@ -75,6 +75,7 @@ async fn main() { .routes(routes!(routes::book_instance::create_book_instance)) .routes(routes!(routes::owner::get_owner_by_id)) .routes(routes!(routes::owner::create_owner)) + .routes(routes!(routes::owner::update_owner)) .routes(routes!(routes::owner::get_owners)) .routes(routes!(routes::websocket::ws_handler)) .route("/", get(index)) diff --git a/src/routes/owner.rs b/src/routes/owner.rs index abaf44f..0ba5c6c 100644 --- a/src/routes/owner.rs +++ b/src/routes/owner.rs @@ -2,7 +2,7 @@ use std::sync::Arc; use axum::{extract::{Path, State}, Json}; use reqwest::{StatusCode}; -use sea_orm::{ActiveModelTrait, ActiveValue::{NotSet, Set}, EntityTrait, TryIntoModel}; +use sea_orm::{ActiveModelTrait, ActiveValue::{NotSet, Set, Unchanged}, EntityTrait, TryIntoModel}; use serde::{Deserialize, Serialize}; use utoipa::IntoParams; @@ -83,6 +83,64 @@ pub async fn create_owner( } } +#[derive(Deserialize, Serialize, utoipa::ToSchema)] +pub struct OwnerUpdateParams { + first_name: Option, + last_name: Option, + contact: Option +} + +#[axum::debug_handler] +#[utoipa::path( + patch, + path = "/owner/{id}", + params(OwnerByIdParams), + request_body = OwnerUpdateParams, + responses( + (status = OK, body = owner::Model, description = "Successfully updated owner"), + (status = NOT_FOUND, description = "No owner with this id exists in the database") + ), + summary = "Update an owner", + description = "Update an owner", + tag = "owner-api", +)] +pub async fn update_owner( + State(state): State>, + Path(id): Path, + Json(instance_payload): Json, +) -> (StatusCode, Json>) { + + if let Ok(Some(owner)) = Owner::find_by_id(id).one(state.db_conn.as_ref()).await { + let mut owner: owner::ActiveModel = owner.into(); + owner.first_name = match instance_payload.first_name { + None => owner.first_name, + Some(v) => Set(v) + }; + owner.last_name = match instance_payload.last_name { + None => owner.last_name, + Some(v) => Set(v) + }; + owner.contact = match instance_payload.contact { + None => owner.contact, + Some(v) => Set(v) + }; + + match owner.update(state.db_conn.as_ref()).await { + Err(e) => { + log::error!(target: "api", "Error while updating owner from api: {:#?}", e); + (StatusCode::INTERNAL_SERVER_ERROR, Json(None)) + }, + Ok(res) => { + let model = res.try_into_model().expect("All fields should be set once the owner is saved"); + let _ = state.event_bus.send(Event::WebsocketBroadcast(WebsocketMessage::NewOwner(Arc::new(model.clone())))); + (StatusCode::OK, Json(Some(model))) + } + } + } else { + (StatusCode::NOT_FOUND, Json(None)) + } +} + #[axum::debug_handler] #[utoipa::path( get,