from datetime import datetime from typing import Literal from beanie import Document from pydantic import Field from pydantic import BaseModel class Deployment(Document): deployment_id: str = Field(alias="_id") deployment_stage: str deployment_status: Literal["started", "failed", "succeeded", "aborted"] deployment_target_env: Literal["alpha", "prod"] deployment_ttl_hours: int = 2 deployment_project_id: str deployment_project_name: str deployment_product_id: str deployment_product_name: str deployment_git_url: str deployment_git_sha256: str deployment_reason: str deployed_by: str created_at: datetime = datetime.now() updated_at: datetime = datetime.now() class Settings: name = "deployment" indexes = [ [("deployment_product_id", 1), ("created_at", 1)], # Compound index [("deployment_id", 1), ("deployment_status", 1)], # Compound index {"keys": [("deployment_id", 1), ("deployment_stage", 1)], "unique": True} # Unique compound index ] class InitDeploymentRequest(BaseModel): product_id: str sha256: str target_env: str user_id: str reason: str = "not provided" ttl_hours: int = 3 class CheckDeploymentStatusRequest(BaseModel): product_id: str target_env: str user_id: str