refactor(routes): share pagination helpers
This commit is contained in:
parent
3241f3c961
commit
90390c17ba
2 changed files with 27 additions and 27 deletions
|
|
@ -3,7 +3,7 @@ use axum::extract::{Path, Query, State};
|
||||||
use axum::http::{HeaderMap, StatusCode};
|
use axum::http::{HeaderMap, StatusCode};
|
||||||
use axum::response::{Html, IntoResponse, Redirect, Response};
|
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::domain::roasters::{NewRoaster, Roaster, RoasterSortKey, UpdateRoaster};
|
||||||
use crate::presentation::templates::{
|
use crate::presentation::templates::{
|
||||||
RoasterDetailTemplate, RoasterListTemplate, RoastersTemplate,
|
RoasterDetailTemplate, RoasterListTemplate, RoastersTemplate,
|
||||||
|
|
@ -19,28 +19,6 @@ use crate::server::server::AppState;
|
||||||
const ROASTER_PAGE_PATH: &str = "/roasters";
|
const ROASTER_PAGE_PATH: &str = "/roasters";
|
||||||
const ROASTER_FRAGMENT_PATH: &str = "/roasters#roaster-list";
|
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(
|
async fn load_roaster_page(
|
||||||
state: &AppState,
|
state: &AppState,
|
||||||
request: ListRequest<RoasterSortKey>,
|
request: ListRequest<RoasterSortKey>,
|
||||||
|
|
@ -51,9 +29,10 @@ async fn load_roaster_page(
|
||||||
.await
|
.await
|
||||||
.map_err(AppError::from)?;
|
.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 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))
|
Ok((roasters, navigator))
|
||||||
}
|
}
|
||||||
|
|
@ -141,7 +120,8 @@ pub(crate) async fn create_roaster(
|
||||||
.await
|
.await
|
||||||
.map_err(ApiError::from)
|
.map_err(ApiError::from)
|
||||||
} else if matches!(source, PayloadSource::Form) {
|
} 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())
|
Ok(Redirect::to(&target).into_response())
|
||||||
} else {
|
} else {
|
||||||
Ok((StatusCode::CREATED, Json(roaster)).into_response())
|
Ok((StatusCode::CREATED, Json(roaster)).into_response())
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,9 @@ use axum::extract::{Form, FromRequest, Json as JsonPayload, Request};
|
||||||
use axum::http::{HeaderMap, HeaderValue, header::CONTENT_TYPE};
|
use axum::http::{HeaderMap, HeaderValue, header::CONTENT_TYPE};
|
||||||
use serde::Deserialize;
|
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};
|
use crate::server::errors::{ApiError, AppError};
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
#[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 {
|
fn page_size_from_text(value: &str) -> PageSize {
|
||||||
if value.eq_ignore_ascii_case("all") {
|
if value.eq_ignore_ascii_case("all") {
|
||||||
PageSize::All
|
PageSize::All
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue