use sea_orm::{error::DbErr, FromQueryResult}; use sea_orm::{prelude::*, Order, QueryOrder}; use sea_orm_rocket::Connection; use sea_query::expr::SimpleExpr; use serde::{Deserialize, Serialize}; use super::Db; #[derive(Debug, Clone, Serialize, Deserialize)] pub struct PaginatedResponse { pub count: u64, pub num_pages: u64, pub list: Vec, } pub async fn paginate( conn: Connection<'_, Db>, page: Option, size: Option, column: Option, order: Option, ) -> Result, DbErr> where E: EntityTrait, M: Send + Sync + FromQueryResult, C: ColumnTrait, { let db = conn.into_inner(); let s = size.unwrap_or(20).min(50); let selector; if let (Some(col), Some(ord)) = (column, order) { selector = E::find().order_by(col, ord); } else { selector = E::find(); } let pages = selector.into_model().paginate(db, s); let count = pages.num_items().await?; let num_pages = pages.num_pages().await?; let p = page.unwrap_or(0).min(num_pages); let list = pages.fetch_page(p).await?; let res = PaginatedResponse { count, num_pages, list, }; Ok(res) } pub async fn paginate_also_related( conn: Connection<'_, Db>, page: Option, size: Option, column: Option, order: Option, filter: Option, ) -> Result)>, DbErr> where E: EntityTrait + Related, R: EntityTrait, T: Sync + Send + FromQueryResult, K: Sync + Send + FromQueryResult, C: ColumnTrait, { let db = conn.into_inner(); let s = size.unwrap_or(20).min(50); let mut selector; if let (Some(col), Some(ord)) = (column, order) { selector = E::find() .find_also_related::(R::default()) .order_by(col, ord) } else { selector = E::find().find_also_related::(R::default()); } if let Some(fil) = filter { selector = selector.filter(fil); } let pages = selector.into_model().paginate(db, s); let count = pages.num_items().await?; let num_pages = pages.num_pages().await?; let p = page.unwrap_or(0).min(num_pages); let list = pages.fetch_page(p).await?; let res = PaginatedResponse { count, num_pages, list, }; Ok(res) }