use db::project::project_state::ProjectState as DbState; use serde::{Deserialize, Serialize}; use time::OffsetDateTime; use utoipa::ToSchema; use uuid::Uuid; use validator::Validate; #[derive(Debug, Clone, Serialize, Deserialize, ToSchema, PartialEq)] #[serde(rename_all = "snake_case")] pub enum ProjectState { Backlog, Planned, InProgress, Paused, Completed, Cancelled, } impl From for ProjectState { fn from(s: DbState) -> Self { match s { DbState::Backlog => Self::Backlog, DbState::Planned => Self::Planned, DbState::InProgress => Self::InProgress, DbState::Paused => Self::Paused, DbState::Completed => Self::Completed, DbState::Cancelled => Self::Cancelled, } } } #[derive(Debug, Clone, Serialize, Deserialize, ToSchema)] #[serde(rename_all = "snake_case")] pub enum ProjectHealth { OnTrack, AtRisk, OffTrack, None, } impl From> for ProjectHealth { fn from(h: Option) -> Self { match h { Some(db::project::project_health::ProjectHealth::OnTrack) => Self::OnTrack, Some(db::project::project_health::ProjectHealth::AtRisk) => Self::AtRisk, Some(db::project::project_health::ProjectHealth::OffTrack) => Self::OffTrack, None => Self::None, } } } #[derive(Debug, Clone, Deserialize, Validate, ToSchema)] pub struct CreateProjectCmd { pub space_id: Uuid, /// Optional directory channel to host the project's object channel under. pub parent_dir: Option, #[validate(length(min = 1, max = 100))] pub name: String, #[validate(length(max = 2000))] pub description: Option, pub lead_id: Option, pub icon: Option, pub color: Option, pub target_date: Option, } #[derive(Debug, Clone, Deserialize, Validate, ToSchema)] pub struct UpdateProjectCmd { #[validate(length(min = 1, max = 100))] pub name: Option, #[validate(length(max = 2000))] pub description: Option, pub lead_id: Option, pub icon: Option, pub color: Option, pub state: Option, pub target_date: Option, pub health: Option, pub sort_order: Option, } #[derive(Debug, Clone, Serialize, ToSchema)] pub struct ProjectView { pub id: Uuid, pub space_id: Uuid, pub creator_id: Uuid, pub lead_id: Option, pub name: String, pub description: Option, pub icon: Option, pub color: Option, pub state: ProjectState, pub target_date: Option, pub started_at: Option, pub completed_at: Option, pub cancelled_at: Option, pub health: ProjectHealth, pub sort_order: i32, pub starred: i32, pub created_at: OffsetDateTime, pub updated_at: Option, } #[derive(Debug, Clone, Serialize, ToSchema)] pub struct ProjectPage { pub total: u64, pub items: Vec, } #[derive(Debug, Clone, Deserialize, ToSchema)] pub struct ListProjectQuery { pub space_id: Uuid, pub state: Option, pub lead_id: Option, pub starred_only: Option, pub q: Option, #[serde(default = "default_page")] pub page: u64, #[serde(default = "default_per_page")] pub per_page: u64, } fn default_page() -> u64 { 1 } fn default_per_page() -> u64 { 20 }