mycommon-utils 0.2.1

Common utilities library for database operations, Redis caching and system utilities
Documentation
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?;

    // 如果 page_num 超过总页数,自动修正为最后一页
    if page_num > total_pages && total_pages > 0 {
        page_num = total_pages;
    }

    // 计算实际查询的页码(从 0 开始)
    let pages = page_num - 1;

    let data = paginator.fetch_page(pages).await?;
    Ok(ListData {
        total,
        data,
        total_pages,
        page_num,
        page_size,
    })
}