From 76395afb10b08db0557be5430c492950bd27e38e Mon Sep 17 00:00:00 2001 From: Chewing_Bever Date: Wed, 19 Jun 2024 22:07:30 +0200 Subject: [PATCH] feat: only return committed packages from the api --- server/src/api/mod.rs | 8 +++---- server/src/api/pagination.rs | 24 ++++++++------------- server/src/db/entities/package.rs | 1 + server/src/db/query/distro.rs | 5 ++--- server/src/db/query/package.rs | 35 ++++++++++++++++++++----------- server/src/db/query/repo.rs | 5 ++--- 6 files changed, 41 insertions(+), 37 deletions(-) diff --git a/server/src/api/mod.rs b/server/src/api/mod.rs index 0a0a56e..4678257 100644 --- a/server/src/api/mod.rs +++ b/server/src/api/mod.rs @@ -22,10 +22,10 @@ async fn get_repos( Query(pagination): Query, Query(filter): Query, ) -> crate::Result>> { - let (total_pages, items) = + let items = db::query::repo::page(&global.db, pagination.per_page, pagination.page - 1, filter).await?; - Ok(Json(pagination.res(total_pages, items))) + Ok(Json(pagination.res(items))) } async fn get_single_repo( @@ -44,11 +44,11 @@ async fn get_packages( Query(pagination): Query, Query(filter): Query, ) -> crate::Result>> { - let (total_pages, pkgs) = + let items = db::query::package::page(&global.db, pagination.per_page, pagination.page - 1, filter) .await?; - Ok(Json(pagination.res(total_pages, pkgs))) + Ok(Json(pagination.res(items))) } async fn get_single_package( diff --git a/server/src/api/pagination.rs b/server/src/api/pagination.rs index 02e32dc..3ede5bf 100644 --- a/server/src/api/pagination.rs +++ b/server/src/api/pagination.rs @@ -1,19 +1,19 @@ use serde::{Deserialize, Serialize}; #[derive(Deserialize)] -#[serde(default)] pub struct Query { + #[serde(default = "default_page")] pub page: u64, + #[serde(default = "default_per_page")] pub per_page: u64, } -impl Default for Query { - fn default() -> Self { - Query { - page: 1, - per_page: 25, - } - } +fn default_page() -> u64 { + 1 +} + +fn default_per_page() -> u64 { + 25 } #[derive(Serialize)] @@ -23,21 +23,15 @@ where { pub page: u64, pub per_page: u64, - pub total_pages: u64, pub count: usize, pub items: Vec, } impl Query { - pub fn res Serialize>( - self, - total_pages: u64, - items: Vec, - ) -> PaginatedResponse { + pub fn res Serialize>(self, items: Vec) -> PaginatedResponse { PaginatedResponse { page: self.page, per_page: self.per_page, - total_pages, count: items.len(), items, } diff --git a/server/src/db/entities/package.rs b/server/src/db/entities/package.rs index 08ac2ab..4ef90a4 100644 --- a/server/src/db/entities/package.rs +++ b/server/src/db/entities/package.rs @@ -26,6 +26,7 @@ pub struct Model { pub pgp_sig_size: Option, pub sha256_sum: String, pub compression: String, + #[serde(skip_serializing)] pub state: PackageState, } diff --git a/server/src/db/query/distro.rs b/server/src/db/query/distro.rs index c4fc70f..8647f2a 100644 --- a/server/src/db/query/distro.rs +++ b/server/src/db/query/distro.rs @@ -21,15 +21,14 @@ pub async fn page( per_page: u64, page: u64, filter: Filter, -) -> Result<(u64, Vec)> { +) -> Result> { let paginator = Distro::find() .filter(filter) .order_by_asc(distro::Column::Id) .paginate(conn, per_page); let repos = paginator.fetch_page(page).await?; - let total_pages = paginator.num_pages().await?; - Ok((total_pages, repos)) + Ok(repos) } pub async fn by_id(conn: &DbConn, id: i32) -> Result> { diff --git a/server/src/db/query/package.rs b/server/src/db/query/package.rs index 2ba1996..bfdad73 100644 --- a/server/src/db/query/package.rs +++ b/server/src/db/query/package.rs @@ -17,10 +17,7 @@ impl IntoCondition for Filter { Condition::all() .add_option(self.repo.map(|repo| package::Column::RepoId.eq(repo))) .add_option(self.arch.map(|arch| package::Column::Arch.eq(arch))) - .add_option( - self.name - .map(|name| package::Column::Name.like(format!("%{}%", name))), - ) + .add_option(self.name.map(|name| package::Column::Name.contains(name))) } } @@ -29,15 +26,29 @@ pub async fn page( per_page: u64, page: u64, filter: Filter, -) -> super::Result<(u64, Vec)> { - let paginator = Package::find() - .filter(filter) - .order_by_asc(package::Column::Id) - .paginate(conn, per_page); - let packages = paginator.fetch_page(page).await?; - let total_pages = paginator.num_pages().await?; +) -> crate::Result> { + let p2 = Alias::new("p2"); + let query = Query::select() + .columns(db::package::Column::iter().map(|c| (db::package::Entity, c))) + .from(db::package::Entity) + .join_subquery( + JoinType::InnerJoin, + max_pkg_ids_query(true), + p2.clone(), + Expr::col((db::package::Entity, db::package::Column::Id)) + .eq(Expr::col((p2.clone(), Alias::new("max_id")))), + ) + .cond_where(filter) + .order_by((db::package::Entity, db::package::Column::Id), Order::Asc) + .to_owned(); + let builder = conn.get_database_backend(); + let sql = builder.build(&query); - Ok((total_pages, packages)) + Ok(db::Package::find() + .from_raw_sql(sql) + .paginate(conn, per_page) + .fetch_page(page) + .await?) } pub async fn by_id(conn: &DbConn, id: i32) -> Result> { diff --git a/server/src/db/query/repo.rs b/server/src/db/query/repo.rs index 2ad54bf..a2daa26 100644 --- a/server/src/db/query/repo.rs +++ b/server/src/db/query/repo.rs @@ -21,15 +21,14 @@ pub async fn page( per_page: u64, page: u64, filter: Filter, -) -> Result<(u64, Vec)> { +) -> Result> { let paginator = Repo::find() .filter(filter) .order_by_asc(repo::Column::Id) .paginate(conn, per_page); let repos = paginator.fetch_page(page).await?; - let total_pages = paginator.num_pages().await?; - Ok((total_pages, repos)) + Ok(repos) } pub async fn by_id(conn: &DbConn, id: i32) -> Result> {