use db::issue::issues as issues_entity; use serde::{Deserialize, Serialize}; use time::OffsetDateTime; use time::format_description::well_known::Rfc3339; use utoipa::{IntoParams, ToSchema}; use uuid::Uuid; fn fmt_ts(ts: OffsetDateTime) -> String { ts.format(&Rfc3339).unwrap_or_default() } fn fmt_ts_opt(ts: Option) -> Option { ts.map(fmt_ts) } #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct CollectionView { pub id: Uuid, pub channel_id: Uuid, pub name: String, pub icon: Option, pub description: Option, pub nums_open_issue: i64, pub nums_closed_issue: i64, pub created_at: String, pub updated_at: Option, } impl From for CollectionView { fn from(m: issues_entity::Model) -> Self { Self { id: m.id, channel_id: m.channel_id, name: m.name, icon: m.icon, description: m.description, nums_open_issue: 0, nums_closed_issue: 0, created_at: fmt_ts(m.created_at), updated_at: fmt_ts_opt(m.updated_at), } } } #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct CollectionPage { pub items: Vec, pub total: i64, } #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct CreateCollectionOption { /// Space the collection lives in. An object channel is minted under `parent_dir` /// (or the space root when `None`) and bound to the collection. pub space_id: Uuid, pub parent_dir: Option, pub name: String, pub icon: Option, pub description: Option, } #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] pub struct UpdateCollectionOption { pub name: Option, pub icon: Option>, pub description: Option>, } #[derive(Debug, Clone, Serialize, Deserialize, ToSchema, IntoParams)] pub struct ListCollectionQuery { pub channel_id: Option, pub q: Option, pub limit: Option, pub offset: Option, }