from __future__ import annotations from datetime import datetime, timezone from typing import Optional from sqlmodel import Field, SQLModel def _now() -> datetime: return datetime.now(timezone.utc) DESTINATION_TYPES = ["sftp", "s3"] # config keys that hold secrets — masked in API responses. SECRET_KEYS = {"password", "private_key", "secret_key"} class BackupDestination(SQLModel, table=True): """A remote target for stack backups (SFTP or S3-compatible).""" id: Optional[int] = Field(default=None, primary_key=True) name: str type: str # one of DESTINATION_TYPES config: str = "{}" # JSON-encoded, type-specific (incl. secrets) created_at: datetime = Field(default_factory=_now) # --- API schemas --- class DestinationCreate(SQLModel): name: str type: str config: dict class DestinationUpdate(SQLModel): name: Optional[str] = None config: Optional[dict] = None class DestinationRead(SQLModel): id: int name: str type: str config: dict # secrets masked created_at: datetime