use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use sqlx::FromRow;
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct User {
pub id: Uuid,
pub email: String,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct Project {
pub id: Uuid,
pub name: String,
pub status: ProjectStatus,
pub access_class: String,
pub owner_user_id: Option<Uuid>,
pub owner_team_id: Option<Uuid>,
pub finalizers: Vec<String>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, sqlx::Type)]
#[sqlx(type_name = "text")]
pub enum ProjectStatus {
Stopped,
Running,
Failed,
Deploying,
Deleting,
Terminated,
}
impl std::fmt::Display for ProjectStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ProjectStatus::Stopped => write!(f, "Stopped"),
ProjectStatus::Running => write!(f, "Running"),
ProjectStatus::Failed => write!(f, "Failed"),
ProjectStatus::Deploying => write!(f, "Deploying"),
ProjectStatus::Deleting => write!(f, "Deleting"),
ProjectStatus::Terminated => write!(f, "Terminated"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct Team {
pub id: Uuid,
pub name: String,
pub idp_managed: bool,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct TeamMember {
pub team_id: Uuid,
pub user_id: Uuid,
pub role: TeamRole,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, sqlx::Type, PartialEq)]
#[sqlx(type_name = "text")]
pub enum TeamRole {
#[sqlx(rename = "owner")]
Owner,
#[sqlx(rename = "member")]
Member,
}
impl std::fmt::Display for TeamRole {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
TeamRole::Owner => write!(f, "owner"),
TeamRole::Member => write!(f, "member"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct ServiceAccount {
pub id: Uuid,
pub project_id: Uuid,
pub user_id: Uuid,
pub issuer_url: String,
pub claims: serde_json::Value, pub sequence: i32,
pub deleted_at: Option<DateTime<Utc>>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct Deployment {
pub id: Uuid,
pub deployment_id: String,
pub project_id: Uuid,
pub created_by_id: Uuid,
pub status: DeploymentStatus,
pub deployment_group: String,
pub expires_at: Option<DateTime<Utc>>,
pub termination_reason: Option<TerminationReason>,
pub completed_at: Option<DateTime<Utc>>,
pub error_message: Option<String>,
pub build_logs: Option<String>,
pub controller_metadata: serde_json::Value,
pub image: Option<String>,
pub image_digest: Option<String>,
pub rolled_back_from_deployment_id: Option<Uuid>,
pub http_port: i32,
pub needs_reconcile: bool,
pub is_active: bool,
pub deploying_started_at: Option<DateTime<Utc>>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, sqlx::Type, PartialEq)]
#[sqlx(type_name = "text")]
pub enum DeploymentStatus {
Pending,
Building,
Pushing,
Pushed, Deploying,
Healthy, Unhealthy,
Cancelling, Cancelled,
Terminating, Stopped, Superseded,
Failed, Expired, }
impl std::fmt::Display for DeploymentStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
DeploymentStatus::Pending => write!(f, "Pending"),
DeploymentStatus::Building => write!(f, "Building"),
DeploymentStatus::Pushing => write!(f, "Pushing"),
DeploymentStatus::Pushed => write!(f, "Pushed"),
DeploymentStatus::Deploying => write!(f, "Deploying"),
DeploymentStatus::Healthy => write!(f, "Healthy"),
DeploymentStatus::Unhealthy => write!(f, "Unhealthy"),
DeploymentStatus::Cancelling => write!(f, "Cancelling"),
DeploymentStatus::Cancelled => write!(f, "Cancelled"),
DeploymentStatus::Terminating => write!(f, "Terminating"),
DeploymentStatus::Stopped => write!(f, "Stopped"),
DeploymentStatus::Superseded => write!(f, "Superseded"),
DeploymentStatus::Failed => write!(f, "Failed"),
DeploymentStatus::Expired => write!(f, "Expired"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, sqlx::Type, PartialEq)]
#[sqlx(type_name = "termination_reason")]
pub enum TerminationReason {
UserStopped, Superseded, Cancelled, Failed, Expired, }
impl std::fmt::Display for TerminationReason {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
TerminationReason::UserStopped => write!(f, "UserStopped"),
TerminationReason::Superseded => write!(f, "Superseded"),
TerminationReason::Cancelled => write!(f, "Cancelled"),
TerminationReason::Failed => write!(f, "Failed"),
TerminationReason::Expired => write!(f, "Expired"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct ProjectEnvVar {
pub id: Uuid,
pub project_id: Uuid,
pub key: String,
pub value: String,
pub is_secret: bool,
pub is_protected: bool,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct DeploymentEnvVar {
pub id: Uuid,
pub deployment_id: Uuid,
pub key: String,
pub value: String,
pub is_secret: bool,
pub is_protected: bool,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct CustomDomain {
pub id: Uuid,
pub project_id: Uuid,
pub domain: String,
pub is_primary: bool,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize, FromRow)]
pub struct ProjectExtension {
pub project_id: Uuid,
pub extension: String,
pub extension_type: String,
pub spec: serde_json::Value,
pub status: serde_json::Value,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
pub deleted_at: Option<DateTime<Utc>>,
}