refactor(routes): share pagination helpers

This commit is contained in:
Jon Seager 2025-11-24 11:26:24 +00:00
parent 3241f3c961
commit 90390c17ba
No known key found for this signature in database
2 changed files with 27 additions and 27 deletions

View file

@ -3,7 +3,7 @@ use axum::extract::{Path, Query, State};
use axum::http::{HeaderMap, StatusCode};
use axum::response::{Html, IntoResponse, Redirect, Response};
use crate::domain::listing::{ListRequest, Page, PageSize, SortDirection};
use crate::domain::listing::{ListRequest, SortDirection};
use crate::domain::roasters::{NewRoaster, Roaster, RoasterSortKey, UpdateRoaster};
use crate::presentation::templates::{
RoasterDetailTemplate, RoasterListTemplate, RoastersTemplate,
@ -19,28 +19,6 @@ use crate::server::server::AppState;
const ROASTER_PAGE_PATH: &str = "/roasters";
const ROASTER_FRAGMENT_PATH: &str = "/roasters#roaster-list";
fn normalize_request(
request: ListRequest<RoasterSortKey>,
page: &Page<Roaster>,
) -> ListRequest<RoasterSortKey> {
let page_size = if page.showing_all {
PageSize::All
} else {
PageSize::limited(page.page_size)
};
ListRequest::new(
page.page,
page_size,
request.sort_key(),
request.sort_direction(),
)
}
fn roaster_navigator(request: ListRequest<RoasterSortKey>) -> ListNavigator<RoasterSortKey> {
ListNavigator::new(ROASTER_PAGE_PATH, ROASTER_FRAGMENT_PATH, request)
}
async fn load_roaster_page(
state: &AppState,
request: ListRequest<RoasterSortKey>,
@ -51,9 +29,10 @@ async fn load_roaster_page(
.await
.map_err(AppError::from)?;
let normalized_request = normalize_request(request, &page);
let normalized_request = crate::server::routes::support::normalize_request(request, &page);
let roasters = Paginated::from_page(page, RoasterView::from);
let navigator = roaster_navigator(normalized_request);
let navigator =
ListNavigator::new(ROASTER_PAGE_PATH, ROASTER_FRAGMENT_PATH, normalized_request);
Ok((roasters, navigator))
}
@ -141,7 +120,8 @@ pub(crate) async fn create_roaster(
.await
.map_err(ApiError::from)
} else if matches!(source, PayloadSource::Form) {
let target = roaster_navigator(request).page_href(1);
let target =
ListNavigator::new(ROASTER_PAGE_PATH, ROASTER_FRAGMENT_PATH, request).page_href(1);
Ok(Redirect::to(&target).into_response())
} else {
Ok((StatusCode::CREATED, Json(roaster)).into_response())

View file

@ -3,7 +3,9 @@ use axum::extract::{Form, FromRequest, Json as JsonPayload, Request};
use axum::http::{HeaderMap, HeaderValue, header::CONTENT_TYPE};
use serde::Deserialize;
use crate::domain::listing::{DEFAULT_PAGE_SIZE, ListRequest, PageSize, SortDirection, SortKey};
use crate::domain::listing::{
DEFAULT_PAGE_SIZE, ListRequest, Page, PageSize, SortDirection, SortKey,
};
use crate::server::errors::{ApiError, AppError};
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
@ -66,6 +68,24 @@ impl ListQuery {
}
}
pub fn normalize_request<K, T>(request: ListRequest<K>, page: &Page<T>) -> ListRequest<K>
where
K: SortKey,
{
let page_size = if page.showing_all {
PageSize::All
} else {
PageSize::limited(page.page_size)
};
ListRequest::new(
page.page,
page_size,
request.sort_key(),
request.sort_direction(),
)
}
fn page_size_from_text(value: &str) -> PageSize {
if value.eq_ignore_ascii_case("all") {
PageSize::All