diff --git a/backend/migrations/versions/c9d7e9b6a4f2_add_skills_marketplace_tables.py b/backend/migrations/versions/c9d7e9b6a4f2_add_skills_marketplace_tables.py index f1f278e1..a96643e8 100644 --- a/backend/migrations/versions/c9d7e9b6a4f2_add_skills_marketplace_tables.py +++ b/backend/migrations/versions/c9d7e9b6a4f2_add_skills_marketplace_tables.py @@ -19,81 +19,116 @@ branch_labels = None depends_on = None +def _has_table(table_name: str) -> bool: + return sa.inspect(op.get_bind()).has_table(table_name) + + +def _has_index(table_name: str, index_name: str) -> bool: + if not _has_table(table_name): + return False + indexes = sa.inspect(op.get_bind()).get_indexes(table_name) + return any(index["name"] == index_name for index in indexes) + + def upgrade() -> None: - op.create_table( - "marketplace_skills", - sa.Column("id", sa.Uuid(), nullable=False), - sa.Column("organization_id", sa.Uuid(), nullable=False), - sa.Column("name", sqlmodel.sql.sqltypes.AutoString(), nullable=False), - sa.Column("description", sqlmodel.sql.sqltypes.AutoString(), nullable=True), - sa.Column("source_url", sqlmodel.sql.sqltypes.AutoString(), nullable=False), - sa.Column("created_at", sa.DateTime(), nullable=False), - sa.Column("updated_at", sa.DateTime(), nullable=False), - sa.ForeignKeyConstraint( + if not _has_table("marketplace_skills"): + op.create_table( + "marketplace_skills", + sa.Column("id", sa.Uuid(), nullable=False), + sa.Column("organization_id", sa.Uuid(), nullable=False), + sa.Column("name", sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column("description", sqlmodel.sql.sqltypes.AutoString(), nullable=True), + sa.Column("source_url", sqlmodel.sql.sqltypes.AutoString(), nullable=False), + sa.Column("created_at", sa.DateTime(), nullable=False), + sa.Column("updated_at", sa.DateTime(), nullable=False), + sa.ForeignKeyConstraint( + ["organization_id"], + ["organizations.id"], + ), + sa.PrimaryKeyConstraint("id"), + sa.UniqueConstraint( + "organization_id", + "source_url", + name="uq_marketplace_skills_org_source_url", + ), + ) + + marketplace_org_idx = op.f("ix_marketplace_skills_organization_id") + if not _has_index("marketplace_skills", marketplace_org_idx): + op.create_index( + marketplace_org_idx, + "marketplace_skills", ["organization_id"], - ["organizations.id"], - ), - sa.PrimaryKeyConstraint("id"), - sa.UniqueConstraint( - "organization_id", - "source_url", - name="uq_marketplace_skills_org_source_url", - ), - ) - op.create_index( - op.f("ix_marketplace_skills_organization_id"), - "marketplace_skills", - ["organization_id"], - unique=False, - ) - op.create_table( - "gateway_installed_skills", - sa.Column("id", sa.Uuid(), nullable=False), - sa.Column("gateway_id", sa.Uuid(), nullable=False), - sa.Column("skill_id", sa.Uuid(), nullable=False), - sa.Column("created_at", sa.DateTime(), nullable=False), - sa.Column("updated_at", sa.DateTime(), nullable=False), - sa.ForeignKeyConstraint( + unique=False, + ) + + if not _has_table("gateway_installed_skills"): + op.create_table( + "gateway_installed_skills", + sa.Column("id", sa.Uuid(), nullable=False), + sa.Column("gateway_id", sa.Uuid(), nullable=False), + sa.Column("skill_id", sa.Uuid(), nullable=False), + sa.Column("created_at", sa.DateTime(), nullable=False), + sa.Column("updated_at", sa.DateTime(), nullable=False), + sa.ForeignKeyConstraint( + ["gateway_id"], + ["gateways.id"], + ), + sa.ForeignKeyConstraint( + ["skill_id"], + ["marketplace_skills.id"], + ), + sa.PrimaryKeyConstraint("id"), + sa.UniqueConstraint( + "gateway_id", + "skill_id", + name="uq_gateway_installed_skills_gateway_id_skill_id", + ), + ) + + gateway_id_idx = op.f("ix_gateway_installed_skills_gateway_id") + if not _has_index("gateway_installed_skills", gateway_id_idx): + op.create_index( + gateway_id_idx, + "gateway_installed_skills", ["gateway_id"], - ["gateways.id"], - ), - sa.ForeignKeyConstraint( + unique=False, + ) + + gateway_skill_idx = op.f("ix_gateway_installed_skills_skill_id") + if not _has_index("gateway_installed_skills", gateway_skill_idx): + op.create_index( + gateway_skill_idx, + "gateway_installed_skills", ["skill_id"], - ["marketplace_skills.id"], - ), - sa.PrimaryKeyConstraint("id"), - sa.UniqueConstraint( - "gateway_id", - "skill_id", - name="uq_gateway_installed_skills_gateway_id_skill_id", - ), - ) - op.create_index( - op.f("ix_gateway_installed_skills_gateway_id"), - "gateway_installed_skills", - ["gateway_id"], - unique=False, - ) - op.create_index( - op.f("ix_gateway_installed_skills_skill_id"), - "gateway_installed_skills", - ["skill_id"], - unique=False, - ) + unique=False, + ) def downgrade() -> None: - op.drop_index( - op.f("ix_gateway_installed_skills_skill_id"), - table_name="gateway_installed_skills", - ) - op.drop_index( - op.f("ix_gateway_installed_skills_gateway_id"), - table_name="gateway_installed_skills", - ) - op.drop_table("gateway_installed_skills") - op.drop_index( - op.f("ix_marketplace_skills_organization_id"), - table_name="marketplace_skills", - ) - op.drop_table("marketplace_skills") + gateway_skill_idx = op.f("ix_gateway_installed_skills_skill_id") + if _has_index("gateway_installed_skills", gateway_skill_idx): + op.drop_index( + gateway_skill_idx, + table_name="gateway_installed_skills", + ) + + gateway_id_idx = op.f("ix_gateway_installed_skills_gateway_id") + if _has_index("gateway_installed_skills", gateway_id_idx): + op.drop_index( + gateway_id_idx, + table_name="gateway_installed_skills", + ) + + if _has_table("gateway_installed_skills"): + op.drop_table("gateway_installed_skills") + + marketplace_org_idx = op.f("ix_marketplace_skills_organization_id") + if _has_index("marketplace_skills", marketplace_org_idx): + op.drop_index( + marketplace_org_idx, + table_name="marketplace_skills", + ) + + if _has_table("marketplace_skills"): + op.drop_table("marketplace_skills")