feat: strengthen backup and mobile workflows
ci / gitleaks (push) Successful in 1m19s
ci / docker (push) Successful in 5m48s

This commit is contained in:
2026-09-16 21:12:52 +08:00
parent 6f38190c92
commit 6c234d7d82
64 changed files with 5059 additions and 635 deletions
+46
View File
@@ -255,6 +255,52 @@ class Memo(Base):
deleted_at: Mapped[datetime | None] = mapped_column(UTCDateTime(), nullable=True)
class BackupPreflight(Base):
__tablename__ = "backup_preflights"
id: Mapped[UUID] = mapped_column(primary_key=True, default=new_id)
token_hash: Mapped[str] = mapped_column(String(64), unique=True, index=True)
user_id: Mapped[UUID] = mapped_column(ForeignKey("users.id", ondelete="CASCADE"), index=True)
backup_id: Mapped[UUID] = mapped_column(index=True)
archive_sha256: Mapped[str] = mapped_column(String(64))
archive_size: Mapped[int] = mapped_column(Integer)
staging_path: Mapped[str] = mapped_column(String(1024), unique=True)
mode: Mapped[str] = mapped_column(String(16))
status: Mapped[str] = mapped_column(String(32), default="pending", index=True)
expires_at: Mapped[datetime] = mapped_column(UTCDateTime(), index=True)
consumed_at: Mapped[datetime | None] = mapped_column(UTCDateTime(), nullable=True)
cleanup_path: Mapped[str | None] = mapped_column(String(1024), nullable=True)
created_at: Mapped[datetime] = mapped_column(UTCDateTime(), default=utcnow)
class BackupImport(Base):
__tablename__ = "backup_imports"
__table_args__ = (UniqueConstraint("user_id", "backup_id", name="uq_backup_import_user_backup"),)
id: Mapped[UUID] = mapped_column(primary_key=True, default=new_id)
user_id: Mapped[UUID] = mapped_column(ForeignKey("users.id", ondelete="CASCADE"), index=True)
backup_id: Mapped[UUID] = mapped_column(index=True)
archive_sha256: Mapped[str] = mapped_column(String(64))
mode: Mapped[str] = mapped_column(String(16))
created_at: Mapped[datetime] = mapped_column(UTCDateTime(), default=utcnow)
class BackupImportEntity(Base):
__tablename__ = "backup_import_entities"
__table_args__ = (
UniqueConstraint(
"user_id", "backup_id", "entity_type", "source_id",
name="uq_backup_import_entity_source",
),
)
id: Mapped[UUID] = mapped_column(primary_key=True, default=new_id)
user_id: Mapped[UUID] = mapped_column(ForeignKey("users.id", ondelete="CASCADE"), index=True)
backup_id: Mapped[UUID] = mapped_column(index=True)
entity_type: Mapped[str] = mapped_column(String(64))
source_id: Mapped[UUID] = mapped_column(index=True)
target_id: Mapped[UUID] = mapped_column(index=True)
content_digest: Mapped[str] = mapped_column(String(64))
created_at: Mapped[datetime] = mapped_column(UTCDateTime(), default=utcnow)
class AuditLog(Base):
__tablename__ = "audit_logs"
id: Mapped[UUID] = mapped_column(primary_key=True, default=new_id)