feat: add author optional parameter to the BookInstance search payload

This commit is contained in:
Ninjdai 2025-08-09 11:03:48 +02:00
parent 9bbdb9decb
commit 61aac4bd80
2 changed files with 14 additions and 12 deletions

View file

@ -15,12 +15,6 @@ pub struct Model {
pub enum Relation { pub enum Relation {
#[sea_orm(has_many = "super::book_instance::Entity")] #[sea_orm(has_many = "super::book_instance::Entity")]
BookInstance, BookInstance,
#[sea_orm(
belongs_to = "super::user::Entity",
from = "Column::Id",
to = "super::user::Column::CurrentBalId"
)]
User,
} }
impl Related<super::book_instance::Entity> for Entity { impl Related<super::book_instance::Entity> for Entity {

View file

@ -332,7 +332,8 @@ pub async fn get_bal_book_instances_by_ean(
#[derive(Deserialize, Serialize, utoipa::ToSchema)] #[derive(Deserialize, Serialize, utoipa::ToSchema)]
pub struct BookInstanceSearchParams { pub struct BookInstanceSearchParams {
title: String, title: Option<String>,
author: Option<String>,
} }
#[derive(Serialize, utoipa::ToSchema)] #[derive(Serialize, utoipa::ToSchema)]
@ -360,17 +361,24 @@ pub async fn search_bal_book_instances(
State(state): State<Arc<AppState>>, State(state): State<Arc<AppState>>,
claims: Claims, claims: Claims,
Path(bal_id): Path<u32>, Path(bal_id): Path<u32>,
Json(instance_payload): Json<BookInstanceSearchParams>, Json(payload): Json<BookInstanceSearchParams>,
) -> (StatusCode, Json<Option<BookInstanceSearchResults>>) { ) -> (StatusCode, Json<Option<BookInstanceSearchResults>>) {
if !user_is_bal_owner(claims.user_id, bal_id, state.db_conn.as_ref()).await { if !user_is_bal_owner(claims.user_id, bal_id, state.db_conn.as_ref()).await {
return (StatusCode::FORBIDDEN, Json(None)); 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::BalId.eq(bal_id))
.filter(book_instance::Column::Available.eq(true)) .filter(book_instance::Column::Available.eq(true))
.join(JoinType::InnerJoin, book_instance::Relation::Book.def()) .join(JoinType::InnerJoin, book_instance::Relation::Book.def());
.filter(book::Column::Title.like(format!("%{}%", instance_payload.title))) if let Some(title) = payload.title {
.all(state.db_conn.as_ref()).await 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(); let mut book_id_map = HashMap::new();
for instance in &res { for instance in &res {