diff --git a/src/server/routes/roasters.rs b/src/server/routes/roasters.rs index c1a6a8c..469f078 100644 --- a/src/server/routes/roasters.rs +++ b/src/server/routes/roasters.rs @@ -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, - page: &Page, -) -> ListRequest { - 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) -> ListNavigator { - ListNavigator::new(ROASTER_PAGE_PATH, ROASTER_FRAGMENT_PATH, request) -} - async fn load_roaster_page( state: &AppState, request: ListRequest, @@ -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()) diff --git a/src/server/routes/support.rs b/src/server/routes/support.rs index c9f0f7b..b2bf219 100644 --- a/src/server/routes/support.rs +++ b/src/server/routes/support.rs @@ -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(request: ListRequest, page: &Page) -> ListRequest +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