"""Backup model — tracks database backup records per tenant.""" from __future__ import annotations import uuid from datetime import datetime from sqlalchemy import BigInteger, DateTime, String, Text, func from sqlalchemy.dialects.postgresql import UUID as PGUUID from sqlalchemy.orm import Mapped, mapped_column from app.core.db import Base, TenantMixin class Backup(Base, TenantMixin): """Database backup record scoped to a tenant. Tracks pg_dump backups with status, file location, and error details. """ __tablename__ = "backups" id: Mapped[uuid.UUID] = mapped_column( PGUUID(as_uuid=True), primary_key=True, default=uuid.uuid4 ) # ── Identity ── filename: Mapped[str] = mapped_column(String(255), nullable=False) size_bytes: Mapped[int | None] = mapped_column(BigInteger, nullable=True, default=None) # ── Status ── status: Mapped[str] = mapped_column( String(20), nullable=False, default="pending" ) # pending, completed, failed error_message: Mapped[str | None] = mapped_column(Text, nullable=True, default=None) # ── Audit ── created_by: Mapped[uuid.UUID | None] = mapped_column( PGUUID(as_uuid=True), nullable=True ) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), nullable=False, server_default=func.now() ) completed_at: Mapped[datetime | None] = mapped_column( DateTime(timezone=True), nullable=True, default=None )