"""Aggiunge la tabella tenant_settings per configurazione archiviazione sostitutiva Revision ID: 0005 Revises: 0004 Create Date: 2026-03-19 00:00:00.000000 Aggiunge: - tenant_settings (configurazione per-tenant: modalità archivio mock/produzione, credenziali conservatore AgID cifrate) """ from alembic import op revision = "0005" down_revision = "0004" branch_labels = None depends_on = None def upgrade() -> None: op.execute(""" CREATE TABLE tenant_settings ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), tenant_id UUID NOT NULL REFERENCES tenants(id) ON DELETE CASCADE, -- Archiviazione sostitutiva (Fase 6) -- 'mock' → usa conservatore simulato in locale (default sicuro per dev) -- 'production' → usa endpoint reale AgID conservatore archival_mode VARCHAR(20) NOT NULL DEFAULT 'mock', -- Identificativo del conservatore (es. 'aruba-cons', 'docuvision', 'mock') conservatore_id VARCHAR(100) NOT NULL DEFAULT 'mock', -- URL API conservatore (NULL in modalità mock) conservatore_endpoint TEXT, -- Credenziali cifrate AES-256-GCM (NULL in modalità mock) conservatore_username_enc TEXT, conservatore_password_enc TEXT, -- Note operative libere archival_notes TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), CONSTRAINT uq_tenant_settings_tenant UNIQUE (tenant_id) ) """) op.execute("CREATE INDEX idx_tenant_settings_tenant ON tenant_settings (tenant_id)") # Trigger updated_at op.execute(""" CREATE TRIGGER trg_tenant_settings_updated_at BEFORE UPDATE ON tenant_settings FOR EACH ROW EXECUTE FUNCTION set_updated_at() """) def downgrade() -> None: op.execute("DROP TABLE IF EXISTS tenant_settings CASCADE")