use time::OffsetDateTime;
use toolkit_db::odata::sea_orm_filter::{FieldToColumn, ODataFieldMapping};
use toolkit_odata_macros::ODataFilterable;
use uuid::Uuid;
use crate::infra::db::entity::session::{Column, Entity, Model};
#[derive(ODataFilterable)]
#[allow(dead_code)]
pub struct SessionQuery {
#[odata(filter(kind = "Uuid"))]
pub session_id: Uuid,
#[odata(filter(kind = "DateTimeUtc"))]
pub created_at: OffsetDateTime,
#[odata(filter(kind = "DateTimeUtc"))]
pub updated_at: OffsetDateTime,
#[odata(filter(kind = "String"))]
pub lifecycle_state: String,
#[odata(filter(kind = "Uuid"))]
pub session_type_id: Uuid,
#[odata(filter(kind = "String"))]
pub client_id: String,
}
pub struct SessionODataMapper;
impl FieldToColumn<SessionQueryFilterField> for SessionODataMapper {
type Column = Column;
fn map_field(field: SessionQueryFilterField) -> Column {
match field {
SessionQueryFilterField::SessionId => Column::SessionId,
SessionQueryFilterField::CreatedAt => Column::CreatedAt,
SessionQueryFilterField::UpdatedAt => Column::UpdatedAt,
SessionQueryFilterField::LifecycleState => Column::LifecycleState,
SessionQueryFilterField::SessionTypeId => Column::SessionTypeId,
SessionQueryFilterField::ClientId => Column::ClientId,
}
}
}
impl ODataFieldMapping<SessionQueryFilterField> for SessionODataMapper {
type Entity = Entity;
fn extract_cursor_value(model: &Model, field: SessionQueryFilterField) -> sea_orm::Value {
match field {
SessionQueryFilterField::SessionId => {
sea_orm::Value::Uuid(Some(Box::new(model.session_id)))
}
SessionQueryFilterField::CreatedAt => {
sea_orm::Value::TimeDateTimeWithTimeZone(Some(Box::new(model.created_at)))
}
SessionQueryFilterField::UpdatedAt => {
sea_orm::Value::TimeDateTimeWithTimeZone(Some(Box::new(model.updated_at)))
}
SessionQueryFilterField::LifecycleState => {
sea_orm::Value::String(Some(Box::new(model.lifecycle_state.clone())))
}
SessionQueryFilterField::SessionTypeId => {
sea_orm::Value::Uuid(model.session_type_id.map(Box::new))
}
SessionQueryFilterField::ClientId => {
sea_orm::Value::String(model.client_id.as_ref().map(|s| Box::new(s.clone())))
}
}
}
}