use models::users::user_suspensions::{self, SuspensionType}; use sea_orm::{ColumnTrait, EntityTrait, QueryFilter, QueryOrder}; use serde::{Deserialize, Serialize}; use time::OffsetDateTime; use utoipa::{IntoParams, ToSchema}; use uuid::Uuid; use crate::errors::UserError; use crate::services::service::UserService; #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct SuspensionDto { pub id: Uuid, pub suspension_type: SuspensionType, pub reason: Option, pub starts_at: OffsetDateTime, pub ends_at: Option, pub revoked_at: Option, pub created_at: OffsetDateTime, } impl From for SuspensionDto { fn from(m: user_suspensions::Model) -> Self { Self { id: m.id, suspension_type: m.suspension_type, reason: m.reason, starts_at: m.starts_at, ends_at: m.ends_at, revoked_at: m.revoked_at, created_at: m.created_at, } } } #[derive(Debug, Clone, Deserialize, IntoParams, ToSchema)] pub struct IncludeRevokedQuery { pub include_revoked: Option, pub active: Option, } impl UserService { pub async fn my_suspensions( &self, uid: i64, q: IncludeRevokedQuery, ) -> Result, UserError> { let mut sel = user_suspensions::Entity::find() .filter(user_suspensions::Column::UserId.eq(uid)) .order_by_desc(user_suspensions::Column::CreatedAt); if q.include_revoked != Some(true) { sel = sel.filter(user_suspensions::Column::RevokedAt.is_null()); } if q.active == Some(true) { let now = time::OffsetDateTime::now_utc(); sel = sel.filter( sea_orm::Condition::any() .add(user_suspensions::Column::EndsAt.gt(now)) .add(user_suspensions::Column::EndsAt.is_null()), ); } let rows = sel.all(self.database.read()).await?; Ok(rows.into_iter().map(SuspensionDto::from).collect()) } }