From 9a30f1ff8acab0bd2179481b11627775fc0b820a Mon Sep 17 00:00:00 2001 From: Sebastian Pravda Date: Mon, 21 Nov 2022 21:03:22 +0100 Subject: [PATCH] feat: list candidates improvements - sorting - pagination --- api/src/routes/admin.rs | 5 +++-- core/src/database/query/candidate.rs | 18 +++++++++++++----- core/src/services/candidate_service.rs | 12 +++++++++--- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/api/src/routes/admin.rs b/api/src/routes/admin.rs index 1e9daaa..a9348ba 100644 --- a/api/src/routes/admin.rs +++ b/api/src/routes/admin.rs @@ -86,11 +86,12 @@ pub async fn create_candidate( Ok(plain_text_password) } -#[get("/candidates?")] +#[get("/candidates?&")] pub async fn list_candidates( conn: Connection<'_, Db>, session: AdminAuth, field: Option, + page: Option, ) -> Result>, Custom> { let db = conn.into_inner(); let private_key = session.get_private_key(); @@ -101,7 +102,7 @@ pub async fn list_candidates( } - let candidates = CandidateService::list_candidates(private_key, db, field) + let candidates = CandidateService::list_candidates(private_key, db, field, page) .await .map_err(|e| Custom(Status::from_code(e.code()).unwrap(), e.to_string()))?; diff --git a/core/src/database/query/candidate.rs b/core/src/database/query/candidate.rs index b57ce51..64b8559 100644 --- a/core/src/database/query/candidate.rs +++ b/core/src/database/query/candidate.rs @@ -24,26 +24,34 @@ impl Query { db: &DbConn, id: i32, ) -> Result, DbErr> { - Candidate::find_by_id(id).one(db).await + Candidate::find_by_id(id) + .one(db) + .await } pub async fn list_candidates( db: &DbConn, field_of_study_opt: Option, + page: Option, ) -> Result, DbErr> { let select = Candidate::find(); - if let Some(study) = field_of_study_opt { + let query = if let Some(study) = field_of_study_opt { select.filter(candidate::Column::Study.eq(study)) } else { select } + .order_by(candidate::Column::Application, Order::Asc) .join(JoinType::InnerJoin, candidate::Relation::Parent.def()) .column_as(parent::Column::Name, "parent_name") .column_as(parent::Column::Surname, "parent_surname") .into_model::() - .paginate(db, PAGE_SIZE) - .fetch() - .await + .paginate(db, PAGE_SIZE); + + if let Some(page) = page { + query.fetch_page(page).await + } else { + query.fetch().await + } } } diff --git a/core/src/services/candidate_service.rs b/core/src/services/candidate_service.rs index b5ca5e0..264535a 100644 --- a/core/src/services/candidate_service.rs +++ b/core/src/services/candidate_service.rs @@ -144,9 +144,15 @@ impl CandidateService { private_key: String, db: &DbConn, field_of_study: Option, + page: Option, ) -> Result, ServiceError> { - let candidates = Query::list_candidates(db, field_of_study).await?; + let candidates = Query::list_candidates( + db, + field_of_study, + page + ).await?; + let mut result: Vec = vec![]; for candidate in candidates { @@ -288,12 +294,12 @@ pub mod tests { let db = get_memory_sqlite_connection().await; let admin = create_admin(&db).await; let private_key = crypto::decrypt_password(admin.private_key, "admin".to_string()).await.unwrap(); - let candidates = CandidateService::list_candidates(private_key.clone(), &db, None).await.unwrap(); + let candidates = CandidateService::list_candidates(private_key.clone(), &db, None, None).await.unwrap(); assert_eq!(candidates.len(), 0); put_user_data(&db).await; - let candidates = CandidateService::list_candidates(private_key.clone(), &db, None).await.unwrap(); + let candidates = CandidateService::list_candidates(private_key.clone(), &db, None, None).await.unwrap(); assert_eq!(candidates.len(), 1); }