use sea_orm::{entity::*, query::*, DatabaseConnection, DbErr, PaginatorTrait};
use crate::database::common::res::{ListData, PageParams};
pub async fn paginate<T, M>(
db: &DatabaseConnection,
query: Select<T>,
page: PageParams,
) -> Result<ListData<M>, DbErr>
where
T: EntityTrait,
M: FromQueryResult + Send + Sync,
{
let page_size = page.page_size.unwrap_or(10).max(1);
let mut page_num = page.page_num.unwrap_or(1).max(1);
let paginator = query.into_model::<M>().paginate(db, page_size);
let total = paginator.num_items().await?;
let total_pages = paginator.num_pages().await?;
if page_num > total_pages && total_pages > 0 {
page_num = total_pages;
}
let pages = page_num - 1;
let data = paginator.fetch_page(pages).await?;
Ok(ListData {
total,
data,
total_pages,
page_num,
page_size,
})
}