fix: public-packages should only return published course packages
Add `published_at IS NOT NULL` filter to the public-packages query. Unpublished packages (ACTIVE status but no published_at) should not appear in the student-facing store. Two new model methods added: - find_all_published_by_org_with_page - find_all_published_with_page Existing find_all_active_* methods unchanged for admin use. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -235,8 +235,8 @@ pub async fn find_public_course_packages(
|
|||||||
let page_size = get_some_from_query_params::<i64>("page_size", ¶ms).unwrap_or(20);
|
let page_size = get_some_from_query_params::<i64>("page_size", ¶ms).unwrap_or(20);
|
||||||
let keyword = get_some_from_query_params::<String>("keyword", ¶ms);
|
let keyword = get_some_from_query_params::<String>("keyword", ¶ms);
|
||||||
match params.get("org_id") {
|
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()),
|
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_active_with_page(&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 {
|
match result {
|
||||||
|
|||||||
@@ -910,6 +910,83 @@ impl CoursePackage {
|
|||||||
Ok((items, pages, total))
|
Ok((items, pages, total))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn find_all_published_by_org_with_page(
|
||||||
|
org: &String,
|
||||||
|
keyword: &Option<String>,
|
||||||
|
page: i64,
|
||||||
|
page_size: i64,
|
||||||
|
conn: &mut PgConnection,
|
||||||
|
) -> anyhow::Result<(Vec<CoursePackage>, 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::<CoursePackage>(conn)?;
|
||||||
|
Ok((items, pages, total))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn find_all_published_with_page(
|
||||||
|
keyword: &Option<String>,
|
||||||
|
page: i64,
|
||||||
|
page_size: i64,
|
||||||
|
conn: &mut PgConnection,
|
||||||
|
) -> anyhow::Result<(Vec<CoursePackage>, 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::<CoursePackage>(conn)?;
|
||||||
|
Ok((items, pages, total))
|
||||||
|
}
|
||||||
|
|
||||||
pub fn find_all_by_teacher_id_with_page(
|
pub fn find_all_by_teacher_id_with_page(
|
||||||
teacher_id: &String,
|
teacher_id: &String,
|
||||||
org: &String,
|
org: &String,
|
||||||
|
|||||||
Reference in New Issue
Block a user