59 lines
2.0 KiB
Rust
59 lines
2.0 KiB
Rust
use serde::{Deserialize, Serialize};
|
|
use utoipa::ToSchema;
|
|
|
|
pub const UNICODE_COLLATION_NAME: &str = "unicode_ci";
|
|
pub const UNICODE_COLLATION_LOCALE: &str = "und-u-ks-level2";
|
|
|
|
const TITLE_ASC: &str = "title COLLATE \"unicode_ci\" ASC";
|
|
const TITLE_DESC: &str = "title COLLATE \"unicode_ci\" DESC";
|
|
const ISSUED_AT_ASC: &str = "issued_at ASC NULLS LAST";
|
|
const ISSUED_AT_DESC: &str = "issued_at DESC NULLS LAST";
|
|
const CREATED_AT_ASC: &str = "created_at ASC";
|
|
const CREATED_AT_DESC: &str = "created_at DESC";
|
|
const UPDATED_AT_ASC: &str = "updated_at ASC";
|
|
const UPDATED_AT_DESC: &str = "updated_at DESC";
|
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, Deserialize, Serialize, ToSchema)]
|
|
#[serde(rename_all = "snake_case")]
|
|
pub enum DocumentSortField {
|
|
Title,
|
|
IssuedAt,
|
|
CreatedAt,
|
|
UpdatedAt,
|
|
}
|
|
|
|
impl Default for DocumentSortField {
|
|
fn default() -> Self {
|
|
DocumentSortField::Title
|
|
}
|
|
}
|
|
|
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, Deserialize, Serialize, ToSchema)]
|
|
#[serde(rename_all = "snake_case")]
|
|
pub enum SortDirection {
|
|
Asc,
|
|
Desc,
|
|
}
|
|
|
|
impl Default for SortDirection {
|
|
fn default() -> Self {
|
|
SortDirection::Asc
|
|
}
|
|
}
|
|
|
|
pub fn ordering_clauses(
|
|
field: DocumentSortField,
|
|
direction: SortDirection,
|
|
) -> (&'static str, Option<&'static str>) {
|
|
match (field, direction) {
|
|
(DocumentSortField::Title, SortDirection::Asc) => (TITLE_ASC, None),
|
|
(DocumentSortField::Title, SortDirection::Desc) => (TITLE_DESC, None),
|
|
(DocumentSortField::IssuedAt, SortDirection::Asc) => (ISSUED_AT_ASC, Some(TITLE_ASC)),
|
|
(DocumentSortField::IssuedAt, SortDirection::Desc) => (ISSUED_AT_DESC, Some(TITLE_ASC)),
|
|
(DocumentSortField::CreatedAt, SortDirection::Asc) => (CREATED_AT_ASC, Some(TITLE_ASC)),
|
|
(DocumentSortField::CreatedAt, SortDirection::Desc) => (CREATED_AT_DESC, Some(TITLE_ASC)),
|
|
(DocumentSortField::UpdatedAt, SortDirection::Asc) => (UPDATED_AT_ASC, Some(TITLE_ASC)),
|
|
(DocumentSortField::UpdatedAt, SortDirection::Desc) => (UPDATED_AT_DESC, Some(TITLE_ASC)),
|
|
}
|
|
}
|