Skip to content
Clone
030e59e
129 lines 3.6 KB Rust
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<DbState> 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<Option<db::project::project_health::ProjectHealth>> for ProjectHealth {
fn from(h: Option<db::project::project_health::ProjectHealth>) -> 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<Uuid>,
#[validate(length(min = 1, max = 100))]
pub name: String,
#[validate(length(max = 2000))]
pub description: Option<String>,
pub lead_id: Option<Uuid>,
pub icon: Option<String>,
pub color: Option<String>,
pub target_date: Option<time::Date>,
}
#[derive(Debug, Clone, Deserialize, Validate, ToSchema)]
pub struct UpdateProjectCmd {
#[validate(length(min = 1, max = 100))]
pub name: Option<String>,
#[validate(length(max = 2000))]
pub description: Option<String>,
pub lead_id: Option<Uuid>,
pub icon: Option<String>,
pub color: Option<String>,
pub state: Option<ProjectState>,
pub target_date: Option<time::Date>,
pub health: Option<ProjectHealth>,
pub sort_order: Option<i32>,
}
#[derive(Debug, Clone, Serialize, ToSchema)]
pub struct ProjectView {
pub id: Uuid,
pub space_id: Uuid,
pub creator_id: Uuid,
pub lead_id: Option<Uuid>,
pub name: String,
pub description: Option<String>,
pub icon: Option<String>,
pub color: Option<String>,
pub state: ProjectState,
pub target_date: Option<time::Date>,
pub started_at: Option<OffsetDateTime>,
pub completed_at: Option<OffsetDateTime>,
pub cancelled_at: Option<OffsetDateTime>,
pub health: ProjectHealth,
pub sort_order: i32,
pub starred: i32,
pub created_at: OffsetDateTime,
pub updated_at: Option<OffsetDateTime>,
}
#[derive(Debug, Clone, Serialize, ToSchema)]
pub struct ProjectPage {
pub total: u64,
pub items: Vec<ProjectView>,
}
#[derive(Debug, Clone, Deserialize, ToSchema)]
pub struct ListProjectQuery {
pub space_id: Uuid,
pub state: Option<ProjectState>,
pub lead_id: Option<Uuid>,
pub starred_only: Option<bool>,
pub q: Option<String>,
#[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
}