Skip to main content

d1_orm_engine/
pagination.rs

1use d1_orm_query::Query;
2use crate::{error::OrmError, model::D1Model, table::Table};
3
4pub struct Page<M> {
5    pub items: Vec<M>,
6    pub total: u64,
7    pub page: u32,
8    pub per_page: u32,
9    pub has_next: bool,
10}
11
12impl<'db, M: D1Model> Table<'db, M> {
13    pub async fn paginate(&self, base: Query, page: u32, per_page: u32) -> Result<Page<M>, OrmError> {
14        let total = self.count(base.clone()).await?;
15        let offset = ((page.saturating_sub(1)) as u64) * (per_page as u64);
16        let items = self.find_all(base.limit(per_page as u64).offset(offset)).await?;
17        let has_next = (page as u64) * (per_page as u64) < total;
18        Ok(Page { items, total, page, per_page, has_next })
19    }
20}