elif_http/controller/
pagination.rs

1//! Pagination utilities for controllers
2
3use serde::{Deserialize, Serialize};
4
5/// Query parameters for pagination and filtering
6#[derive(Debug, Serialize, Deserialize)]
7pub struct QueryParams {
8    pub page: Option<u32>,
9    pub per_page: Option<u32>,
10    pub search: Option<String>,
11    pub filter: Option<String>,
12    pub sort: Option<String>,
13    pub order: Option<String>,
14}
15
16impl Default for QueryParams {
17    fn default() -> Self {
18        Self {
19            page: Some(1),
20            per_page: Some(10),
21            search: None,
22            filter: None,
23            sort: None,
24            order: None,
25        }
26    }
27}
28
29/// Pagination metadata for responses
30#[derive(Debug, Serialize)]
31pub struct PaginationMeta {
32    pub current_page: u32,
33    pub per_page: u32,
34    pub total_items: u64,
35    pub total_pages: u32,
36    pub has_next: bool,
37    pub has_prev: bool,
38}
39
40impl PaginationMeta {
41    pub fn new(page: u32, per_page: u32, total: u64) -> Self {
42        let total_pages = if per_page > 0 {
43            (total as f64 / per_page as f64).ceil() as u32
44        } else {
45            0
46        };
47
48        Self {
49            current_page: page,
50            per_page,
51            total_items: total,
52            total_pages,
53            has_next: page < total_pages,
54            has_prev: page > 1,
55        }
56    }
57}