feat: Add pagination support to ListMediaParams and ListMediaOptions
This commit is contained in:
@@ -1,10 +1,21 @@
|
||||
use axum::{extract::{FromRequestParts, Query}, http::request::Parts};
|
||||
use libertas_core::{error::CoreError, schema::{FilterParams, ListMediaOptions, MetadataFilter, SortOrder, SortParams}};
|
||||
use axum::{
|
||||
extract::{FromRequestParts, Query},
|
||||
http::request::Parts,
|
||||
};
|
||||
use libertas_core::{
|
||||
error::CoreError,
|
||||
schema::{
|
||||
FilterParams, ListMediaOptions, MetadataFilter, PaginationParams, SortOrder, SortParams,
|
||||
},
|
||||
};
|
||||
|
||||
use crate::{error::ApiError, schema::ListMediaParams, state::AppState};
|
||||
|
||||
pub struct ApiListMediaOptions(pub ListMediaOptions);
|
||||
|
||||
const DEFAULT_PAGE: u32 = 1;
|
||||
const DEFAULT_LIMIT: u32 = 50;
|
||||
|
||||
impl From<ListMediaParams> for ListMediaOptions {
|
||||
fn from(params: ListMediaParams) -> Self {
|
||||
let sort = params.sort_by.map(|field| {
|
||||
@@ -22,24 +33,44 @@ impl From<ListMediaParams> for ListMediaOptions {
|
||||
None
|
||||
} else {
|
||||
Some(
|
||||
params.metadata
|
||||
.into_iter()
|
||||
.filter_map(|s| {
|
||||
s.split_once(":").map(|(key, value)| MetadataFilter {
|
||||
tag_name: key.to_string(),
|
||||
tag_value: value.to_string(),
|
||||
params
|
||||
.metadata
|
||||
.into_iter()
|
||||
.filter_map(|s| {
|
||||
s.split_once(":").map(|(key, value)| MetadataFilter {
|
||||
tag_name: key.to_string(),
|
||||
tag_value: value.to_string(),
|
||||
})
|
||||
})
|
||||
})
|
||||
.collect::<Vec<_>>()
|
||||
.collect::<Vec<_>>(),
|
||||
)
|
||||
};
|
||||
|
||||
let pagination = {
|
||||
let page = params.page.unwrap_or(DEFAULT_PAGE);
|
||||
let limit = params.limit.unwrap_or(DEFAULT_LIMIT);
|
||||
|
||||
let page = if page == 0 { DEFAULT_PAGE } else { page };
|
||||
|
||||
let limit = if limit > (DEFAULT_LIMIT * 2) {
|
||||
DEFAULT_LIMIT * 2
|
||||
} else {
|
||||
limit
|
||||
};
|
||||
|
||||
Some(PaginationParams { page, limit })
|
||||
};
|
||||
|
||||
let filter = Some(FilterParams {
|
||||
mime_type: params.mime_type,
|
||||
metadata_filters,
|
||||
});
|
||||
|
||||
ListMediaOptions { sort, filter }
|
||||
ListMediaOptions {
|
||||
sort,
|
||||
filter,
|
||||
pagination,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,4 +87,4 @@ impl FromRequestParts<AppState> for ApiListMediaOptions {
|
||||
|
||||
Ok(ApiListMediaOptions(params.into()))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,6 +37,8 @@ pub struct ListMediaParams {
|
||||
pub mime_type: Option<String>,
|
||||
#[serde(default)]
|
||||
pub metadata: Vec<String>,
|
||||
pub page: Option<u32>,
|
||||
pub limit: Option<u32>,
|
||||
}
|
||||
|
||||
#[derive(Deserialize)]
|
||||
|
||||
Reference in New Issue
Block a user