use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
use crate::typed_id::WorkspaceId;
#[cfg(feature = "openapi")]
use utoipa::ToSchema;
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
#[serde(rename_all = "lowercase")]
pub enum WorkspaceStatus {
Active,
Archived,
Deleted,
}
impl std::fmt::Display for WorkspaceStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
WorkspaceStatus::Active => write!(f, "active"),
WorkspaceStatus::Archived => write!(f, "archived"),
WorkspaceStatus::Deleted => write!(f, "deleted"),
}
}
}
impl From<&str> for WorkspaceStatus {
fn from(s: &str) -> Self {
match s {
"archived" => WorkspaceStatus::Archived,
"deleted" => WorkspaceStatus::Deleted,
_ => WorkspaceStatus::Active,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub struct Workspace {
#[serde(rename = "id")]
#[cfg_attr(
feature = "openapi",
schema(value_type = String, example = "wsp_01933b5a000070008000000000000001")
)]
pub public_id: WorkspaceId,
#[serde(skip, default = "Uuid::nil")]
pub internal_id: Uuid,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub owner_principal_id: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub resolved_owner_user_id: Option<Uuid>,
pub status: WorkspaceStatus,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
#[serde(skip_serializing_if = "Option::is_none")]
pub archived_at: Option<DateTime<Utc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub deleted_at: Option<DateTime<Utc>>,
}