"""IRM: команды (teams) и правила сопоставления по лейблам алерта Revision ID: 006_teams Revises: 005_irm_alerts Create Date: 2026-04-03 """ from typing import Sequence, Union from alembic import op revision: str = "006_teams" down_revision: Union[str, None] = "005_irm_alerts" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: op.execute( """ CREATE TABLE IF NOT EXISTS teams ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), slug text NOT NULL UNIQUE, name text NOT NULL, description text, created_at timestamptz NOT NULL DEFAULT now() ); """ ) op.execute( """ CREATE INDEX IF NOT EXISTS teams_slug_idx ON teams (slug); """ ) op.execute( """ CREATE TABLE IF NOT EXISTS team_label_rules ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), team_id uuid NOT NULL REFERENCES teams(id) ON DELETE CASCADE, label_key text NOT NULL, label_value text NOT NULL, priority integer NOT NULL DEFAULT 0, created_at timestamptz NOT NULL DEFAULT now(), CONSTRAINT team_label_rules_key_nonempty CHECK ( length(trim(label_key)) > 0 ) ); """ ) op.execute( """ CREATE INDEX IF NOT EXISTS team_label_rules_team_idx ON team_label_rules (team_id); """ ) op.execute( """ CREATE INDEX IF NOT EXISTS team_label_rules_priority_idx ON team_label_rules (priority DESC, id ASC); """ ) op.execute( """ ALTER TABLE irm_alerts ADD COLUMN IF NOT EXISTS team_id uuid REFERENCES teams(id) ON DELETE SET NULL; """ ) op.execute( """ CREATE INDEX IF NOT EXISTS irm_alerts_team_id_idx ON irm_alerts (team_id); """ ) def downgrade() -> None: op.execute("ALTER TABLE irm_alerts DROP COLUMN IF EXISTS team_id;") op.execute("DROP TABLE IF EXISTS team_label_rules;") op.execute("DROP TABLE IF EXISTS teams;")