From 61aac4bd803ec78e2f23a720798778d2e1b280cf Mon Sep 17 00:00:00 2001 From: Ninjdai Date: Sat, 9 Aug 2025 11:03:48 +0200 Subject: [PATCH] feat: add author optional parameter to the BookInstance search payload --- src/entities/bal.rs | 6 ------ src/routes/book_instance.rs | 20 ++++++++++++++------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/entities/bal.rs b/src/entities/bal.rs index 08ceb32..9e7516c 100644 --- a/src/entities/bal.rs +++ b/src/entities/bal.rs @@ -15,12 +15,6 @@ pub struct Model { pub enum Relation { #[sea_orm(has_many = "super::book_instance::Entity")] BookInstance, - #[sea_orm( - belongs_to = "super::user::Entity", - from = "Column::Id", - to = "super::user::Column::CurrentBalId" - )] - User, } impl Related for Entity { diff --git a/src/routes/book_instance.rs b/src/routes/book_instance.rs index f7cec31..3fc3e9b 100644 --- a/src/routes/book_instance.rs +++ b/src/routes/book_instance.rs @@ -332,7 +332,8 @@ pub async fn get_bal_book_instances_by_ean( #[derive(Deserialize, Serialize, utoipa::ToSchema)] pub struct BookInstanceSearchParams { - title: String, + title: Option, + author: Option, } #[derive(Serialize, utoipa::ToSchema)] @@ -360,17 +361,24 @@ pub async fn search_bal_book_instances( State(state): State>, claims: Claims, Path(bal_id): Path, - Json(instance_payload): Json, + Json(payload): Json, ) -> (StatusCode, Json>) { if !user_is_bal_owner(claims.user_id, bal_id, state.db_conn.as_ref()).await { return (StatusCode::FORBIDDEN, Json(None)); } - if let Ok(res) = BookInstance::find() + + let mut search_query = BookInstance::find() .filter(book_instance::Column::BalId.eq(bal_id)) .filter(book_instance::Column::Available.eq(true)) - .join(JoinType::InnerJoin, book_instance::Relation::Book.def()) - .filter(book::Column::Title.like(format!("%{}%", instance_payload.title))) - .all(state.db_conn.as_ref()).await + .join(JoinType::InnerJoin, book_instance::Relation::Book.def()); + if let Some(title) = payload.title { + search_query = search_query.filter(book::Column::Title.like(format!("%{}%", title))) + } + if let Some(author) = payload.author { + search_query = search_query.filter(book::Column::Author.like(format!("%{}%", author))) + } + + if let Ok(res) = search_query.all(state.db_conn.as_ref()).await { let mut book_id_map = HashMap::new(); for instance in &res {