github_backup.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. """GitHub backup configuration and log models."""
  2. from datetime import datetime
  3. from sqlalchemy import Boolean, DateTime, ForeignKey, Integer, String, Text, func
  4. from sqlalchemy.orm import Mapped, mapped_column, relationship
  5. from backend.app.core.database import Base
  6. class GitHubBackupConfig(Base):
  7. """Configuration for GitHub profile backup."""
  8. __tablename__ = "github_backup_config"
  9. id: Mapped[int] = mapped_column(primary_key=True)
  10. repository_url: Mapped[str] = mapped_column(String(500)) # Full GitHub URL
  11. access_token: Mapped[str] = mapped_column(Text) # Personal Access Token
  12. branch: Mapped[str] = mapped_column(String(100), default="main")
  13. # Schedule configuration
  14. schedule_enabled: Mapped[bool] = mapped_column(Boolean, default=False)
  15. schedule_type: Mapped[str] = mapped_column(String(20), default="daily") # hourly/daily/weekly
  16. schedule_cron: Mapped[str | None] = mapped_column(String(100), nullable=True) # For future cron support
  17. # What to backup
  18. backup_kprofiles: Mapped[bool] = mapped_column(Boolean, default=True)
  19. backup_cloud_profiles: Mapped[bool] = mapped_column(Boolean, default=True)
  20. backup_settings: Mapped[bool] = mapped_column(Boolean, default=False)
  21. backup_spools: Mapped[bool] = mapped_column(Boolean, default=False)
  22. backup_archives: Mapped[bool] = mapped_column(Boolean, default=False)
  23. # Status tracking
  24. enabled: Mapped[bool] = mapped_column(Boolean, default=True)
  25. last_backup_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
  26. last_backup_status: Mapped[str | None] = mapped_column(String(20), nullable=True) # success/failed/skipped
  27. last_backup_message: Mapped[str | None] = mapped_column(Text, nullable=True)
  28. last_backup_commit_sha: Mapped[str | None] = mapped_column(String(40), nullable=True)
  29. next_scheduled_run: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
  30. # Timestamps
  31. created_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
  32. updated_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now(), onupdate=func.now())
  33. # Relationships
  34. logs: Mapped[list["GitHubBackupLog"]] = relationship(back_populates="config", cascade="all, delete-orphan")
  35. class GitHubBackupLog(Base):
  36. """Log entry for GitHub backup runs."""
  37. __tablename__ = "github_backup_logs"
  38. id: Mapped[int] = mapped_column(primary_key=True)
  39. config_id: Mapped[int] = mapped_column(ForeignKey("github_backup_config.id", ondelete="CASCADE"))
  40. started_at: Mapped[datetime] = mapped_column(DateTime, server_default=func.now())
  41. completed_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
  42. status: Mapped[str] = mapped_column(String(20)) # running/success/failed/skipped
  43. trigger: Mapped[str] = mapped_column(String(20)) # manual/scheduled
  44. commit_sha: Mapped[str | None] = mapped_column(String(40), nullable=True)
  45. files_changed: Mapped[int] = mapped_column(Integer, default=0)
  46. error_message: Mapped[str | None] = mapped_column(Text, nullable=True)
  47. # Relationships
  48. config: Mapped["GitHubBackupConfig"] = relationship(back_populates="logs")