diff --git a/htykc/src/ws_course_package.rs b/htykc/src/ws_course_package.rs index ab7d82a..d85532e 100644 --- a/htykc/src/ws_course_package.rs +++ b/htykc/src/ws_course_package.rs @@ -235,8 +235,8 @@ pub async fn find_public_course_packages( let page_size = get_some_from_query_params::("page_size", ¶ms).unwrap_or(20); let keyword = get_some_from_query_params::("keyword", ¶ms); match params.get("org_id") { - Some(org_id) => CoursePackage::find_all_active_by_org_with_page(org_id, &keyword, page, page_size, extract_conn(fetch_db_conn(&db_pool)?).deref_mut()), - None => CoursePackage::find_all_active_with_page(&keyword, page, page_size, extract_conn(fetch_db_conn(&db_pool)?).deref_mut()), + Some(org_id) => CoursePackage::find_all_published_by_org_with_page(org_id, &keyword, page, page_size, extract_conn(fetch_db_conn(&db_pool)?).deref_mut()), + None => CoursePackage::find_all_published_with_page(&keyword, page, page_size, extract_conn(fetch_db_conn(&db_pool)?).deref_mut()), } })(); match result { diff --git a/htykc_models/src/models.rs b/htykc_models/src/models.rs index dd12ab3..5c5c6a7 100644 --- a/htykc_models/src/models.rs +++ b/htykc_models/src/models.rs @@ -910,6 +910,83 @@ impl CoursePackage { Ok((items, pages, total)) } + pub fn find_all_published_by_org_with_page( + org: &String, + keyword: &Option, + page: i64, + page_size: i64, + conn: &mut PgConnection, + ) -> anyhow::Result<(Vec, i64, i64)> { + use crate::schema::course_package::dsl::{ + course_package as packages, is_delete, org_id, package_name, package_status, + published_at, sort_order, created_at, + }; + let total: i64 = packages + .filter(org_id.eq(org)) + .filter(package_status.eq("ACTIVE")) + .filter(published_at.is_not_null()) + .filter(is_delete.is_null().or(is_delete.eq(false))) + .count() + .get_result(conn)?; + let pages = (total + page_size - 1) / page_size; + let offset = (page - 1) * page_size; + let kws = keyword.clone().unwrap_or_default(); + let mut query = packages + .filter(org_id.eq(org)) + .filter(package_status.eq("ACTIVE")) + .filter(published_at.is_not_null()) + .filter(is_delete.is_null().or(is_delete.eq(false))) + .into_boxed(); + if !kws.is_empty() { + let pattern = format!("%{}%", kws); + query = query.filter(package_name.like(pattern)); + } + let items = query + .order(sort_order.asc()) + .then_order_by(created_at.desc()) + .offset(offset) + .limit(page_size) + .load::(conn)?; + Ok((items, pages, total)) + } + + pub fn find_all_published_with_page( + keyword: &Option, + page: i64, + page_size: i64, + conn: &mut PgConnection, + ) -> anyhow::Result<(Vec, i64, i64)> { + use crate::schema::course_package::dsl::{ + course_package as packages, is_delete, package_name, package_status, + published_at, sort_order, created_at, + }; + let total: i64 = packages + .filter(package_status.eq("ACTIVE")) + .filter(published_at.is_not_null()) + .filter(is_delete.is_null().or(is_delete.eq(false))) + .count() + .get_result(conn)?; + let pages = (total + page_size - 1) / page_size; + let offset = (page - 1) * page_size; + let kws = keyword.clone().unwrap_or_default(); + let mut query = packages + .filter(package_status.eq("ACTIVE")) + .filter(published_at.is_not_null()) + .filter(is_delete.is_null().or(is_delete.eq(false))) + .into_boxed(); + if !kws.is_empty() { + let pattern = format!("%{}%", kws); + query = query.filter(package_name.like(pattern)); + } + let items = query + .order(sort_order.asc()) + .then_order_by(created_at.desc()) + .offset(offset) + .limit(page_size) + .load::(conn)?; + Ok((items, pages, total)) + } + pub fn find_all_by_teacher_id_with_page( teacher_id: &String, org: &String,