"""initial schema Revision ID: 0001_initial Revises: Create Date: 2026-06-22 00:00:00 """ from alembic import op import sqlalchemy as sa revision = "0001_initial" down_revision = None branch_labels = None depends_on = None def upgrade() -> None: op.create_table( "users", sa.Column("id", sa.Integer, primary_key=True), sa.Column("username", sa.String(64), nullable=False, unique=True), sa.Column("password_hash", sa.String(255), nullable=False), sa.Column("is_admin", sa.Boolean, nullable=False, server_default=sa.text("0")), sa.Column("is_active", sa.Boolean, nullable=False, server_default=sa.text("1")), sa.Column("created_at", sa.DateTime, nullable=False, server_default=sa.func.now()), ) op.create_index("ix_users_username", "users", ["username"], unique=True) op.create_table( "storages", sa.Column("id", sa.Integer, primary_key=True), sa.Column("name", sa.String(64), nullable=False, unique=True), sa.Column("type", sa.String(16), nullable=False), sa.Column("config_json", sa.Text, nullable=False), sa.Column("is_default", sa.Boolean, nullable=False, server_default=sa.text("0")), sa.Column("created_at", sa.DateTime, nullable=False, server_default=sa.func.now()), sa.Column("updated_at", sa.DateTime, nullable=False, server_default=sa.func.now()), ) op.create_table( "jobs", sa.Column("id", sa.Integer, primary_key=True), sa.Column("name", sa.String(64), nullable=False, unique=True), sa.Column("type", sa.String(16), nullable=False), sa.Column("source_config_json", sa.Text, nullable=False), sa.Column("storage_id", sa.Integer, sa.ForeignKey("storages.id", ondelete="RESTRICT"), nullable=False), sa.Column("cron_expression", sa.String(64), nullable=True), sa.Column("enabled", sa.Boolean, nullable=False, server_default=sa.text("1")), sa.Column("retention_count", sa.Integer, nullable=False, server_default=sa.text("7")), sa.Column("retention_days", sa.Integer, nullable=True), sa.Column("description", sa.String(255), nullable=True), sa.Column("created_at", sa.DateTime, nullable=False, server_default=sa.func.now()), sa.Column("updated_at", sa.DateTime, nullable=False, server_default=sa.func.now()), ) op.create_table( "runs", sa.Column("id", sa.Integer, primary_key=True), sa.Column("job_id", sa.Integer, sa.ForeignKey("jobs.id", ondelete="CASCADE"), nullable=False), sa.Column("status", sa.String(16), nullable=False, server_default="pending"), sa.Column("trigger", sa.String(16), nullable=False, server_default="manual"), sa.Column("started_at", sa.DateTime, nullable=True), sa.Column("finished_at", sa.DateTime, nullable=True), sa.Column("duration_seconds", sa.Integer, nullable=True), sa.Column("artifact_path", sa.String(512), nullable=True), sa.Column("artifact_size", sa.BigInteger, nullable=True), sa.Column("artifact_checksum", sa.String(64), nullable=True), sa.Column("error_message", sa.Text, nullable=True), sa.Column("log_excerpt", sa.Text, nullable=True), sa.Column("created_at", sa.DateTime, nullable=False, server_default=sa.func.now()), ) op.create_index("ix_runs_job_id", "runs", ["job_id"]) op.create_table( "run_logs", sa.Column("id", sa.Integer, primary_key=True), sa.Column("run_id", sa.Integer, sa.ForeignKey("runs.id", ondelete="CASCADE"), nullable=False), sa.Column("content", sa.Text, nullable=False), sa.Column("created_at", sa.DateTime, nullable=False, server_default=sa.func.now()), ) op.create_index("ix_run_logs_run_id", "run_logs", ["run_id"]) op.create_table( "settings", sa.Column("key", sa.String(64), primary_key=True), sa.Column("value", sa.Text, nullable=False, server_default=""), sa.Column("updated_at", sa.DateTime, nullable=False, server_default=sa.func.now()), ) op.create_table( "restore_history", sa.Column("id", sa.Integer, primary_key=True), sa.Column("run_id", sa.Integer, sa.ForeignKey("runs.id", ondelete="CASCADE"), nullable=False), sa.Column("target", sa.String(512), nullable=False), sa.Column("status", sa.String(16), nullable=False, server_default="pending"), sa.Column("started_at", sa.DateTime, nullable=True), sa.Column("finished_at", sa.DateTime, nullable=True), sa.Column("error_message", sa.Text, nullable=True), sa.Column("created_at", sa.DateTime, nullable=False, server_default=sa.func.now()), ) op.create_index("ix_restore_history_run_id", "restore_history", ["run_id"]) def downgrade() -> None: op.drop_index("ix_restore_history_run_id", table_name="restore_history") op.drop_table("restore_history") op.drop_table("settings") op.drop_index("ix_run_logs_run_id", table_name="run_logs") op.drop_table("run_logs") op.drop_index("ix_runs_job_id", table_name="runs") op.drop_table("runs") op.drop_table("jobs") op.drop_table("storages") op.drop_index("ix_users_username", table_name="users") op.drop_table("users")