Files
PecHub/backend/alembic/versions/0018_add_risk_confidentiality.py
T

81 lines
2.8 KiB
Python

"""
Migrazione 0018: Livello di Rischio e Riservatezza per Comunicazione (Feature N3).
Aggiunge alla tabella `messages`:
- risk_level ENUM(low, medium, high, critical) nullable
- confidentiality ENUM(public, internal, confidential, secret) nullable
Entrambi i campi sono nullable: rimangono NULL finche' non vengono
impostati manualmente o da una regola di smistamento (set_risk_level /
set_confidentiality).
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
revision = "0018"
down_revision = "0017"
branch_labels = None
depends_on = None
def upgrade() -> None:
# ── Crea i nuovi ENUM types ─────────────────────────────────────────────────
risk_level_enum = postgresql.ENUM(
"low", "medium", "high", "critical",
name="risk_level",
create_type=True,
)
confidentiality_enum = postgresql.ENUM(
"public", "internal", "confidential", "secret",
name="confidentiality_level",
create_type=True,
)
risk_level_enum.create(op.get_bind(), checkfirst=True)
confidentiality_enum.create(op.get_bind(), checkfirst=True)
# ── Aggiunge le colonne a messages ──────────────────────────────────────────
op.add_column(
"messages",
sa.Column(
"risk_level",
sa.Enum("low", "medium", "high", "critical", name="risk_level", create_type=False),
nullable=True,
),
)
op.add_column(
"messages",
sa.Column(
"confidentiality",
sa.Enum("public", "internal", "confidential", "secret", name="confidentiality_level", create_type=False),
nullable=True,
),
)
# ── Indici per filtrare rapidamente per rischio/riservatezza ────────────────
op.create_index(
"idx_messages_risk_level",
"messages",
["tenant_id", "risk_level"],
postgresql_where=sa.text("risk_level IS NOT NULL"),
)
op.create_index(
"idx_messages_confidentiality",
"messages",
["tenant_id", "confidentiality"],
postgresql_where=sa.text("confidentiality IS NOT NULL"),
)
def downgrade() -> None:
op.drop_index("idx_messages_confidentiality", table_name="messages")
op.drop_index("idx_messages_risk_level", table_name="messages")
op.drop_column("messages", "confidentiality")
op.drop_column("messages", "risk_level")
risk_level_enum = postgresql.ENUM(name="risk_level")
confidentiality_enum = postgresql.ENUM(name="confidentiality_level")
risk_level_enum.drop(op.get_bind(), checkfirst=True)
confidentiality_enum.drop(op.get_bind(), checkfirst=True)