magnetar/ext_calckey_model/src/paginated.rs

96 lines
2.7 KiB
Rust

use ext_calckey_model_migration::{Expr, SimpleExpr};
use magnetar_sdk::types::{EndFilter, RangeFilter, SpanFilter, StartFilter};
use sea_orm::Iden;
pub trait PaginatedModel: 'static {
fn time_column() -> impl Iden;
fn id_column() -> impl Iden;
fn range_into_expr(filter: &SpanFilter) -> Option<SimpleExpr> {
match filter {
SpanFilter::Range(RangeFilter {
time_start,
time_end,
id_start,
id_end,
}) => Some(
Expr::tuple([
Expr::col(Self::time_column()).into(),
Expr::col(Self::id_column()).into(),
])
.between(
Expr::tuple([
Expr::value(time_start.clone()),
Expr::value(id_start.clone()),
]),
Expr::tuple([Expr::value(time_end.clone()), Expr::value(id_end.clone())]),
),
),
SpanFilter::Start(StartFilter {
id_start,
time_start,
}) => Some(
Expr::tuple([
Expr::col(Self::time_column()).into(),
Expr::col(Self::id_column()).into(),
])
.gt(Expr::tuple([
Expr::value(time_start.clone()),
Expr::value(id_start.clone()),
])),
),
SpanFilter::End(EndFilter { id_end, time_end }) => Some(
Expr::tuple([
Expr::col(Self::time_column()).into(),
Expr::col(Self::id_column()).into(),
])
.lt(Expr::tuple([
Expr::value(time_end.clone()),
Expr::value(id_end.clone()),
])),
),
SpanFilter::None(_) => None,
}
}
}
impl PaginatedModel for ck::note::Model {
fn time_column() -> impl Iden {
ck::note::Column::CreatedAt
}
fn id_column() -> impl Iden {
ck::note::Column::Id
}
}
impl PaginatedModel for ck::user::Model {
fn time_column() -> impl Iden {
ck::user::Column::CreatedAt
}
fn id_column() -> impl Iden {
ck::user::Column::Id
}
}
impl PaginatedModel for ck::following::Model {
fn time_column() -> impl Iden {
ck::following::Column::CreatedAt
}
fn id_column() -> impl Iden {
ck::following::Column::Id
}
}
impl PaginatedModel for ck::follow_request::Model {
fn time_column() -> impl Iden {
ck::follow_request::Column::CreatedAt
}
fn id_column() -> impl Iden {
ck::follow_request::Column::Id
}
}