20260716_20_workflow_versions.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. """Add governed DataFlow to n8n Workflow version mappings."""
  2. from alembic import op
  3. revision = "20260716_20"
  4. down_revision = "20260716_10"
  5. branch_labels = None
  6. depends_on = None
  7. def upgrade() -> None:
  8. op.execute(
  9. """
  10. CREATE TABLE IF NOT EXISTS public.dataflow_workflow_versions (
  11. id UUID PRIMARY KEY,
  12. dataflow_uid UUID NOT NULL,
  13. environment VARCHAR(20) NOT NULL
  14. CHECK (environment IN ('development', 'test', 'production')),
  15. version_no INTEGER NOT NULL CHECK (version_no > 0),
  16. n8n_workflow_id VARCHAR(100) NOT NULL,
  17. n8n_workflow_name VARCHAR(200),
  18. definition_hash CHAR(64) NOT NULL,
  19. definition_snapshot JSONB NOT NULL,
  20. status VARCHAR(30) NOT NULL DEFAULT 'draft'
  21. CHECK (status IN ('draft', 'validating', 'active',
  22. 'superseded', 'activation_failed')),
  23. activation_error VARCHAR(1000),
  24. activation_correlation_id UUID,
  25. created_by UUID REFERENCES public.users(id) ON DELETE SET NULL,
  26. created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  27. activated_by UUID REFERENCES public.users(id) ON DELETE SET NULL,
  28. activated_at TIMESTAMPTZ,
  29. updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
  30. UNIQUE (dataflow_uid, environment, version_no),
  31. UNIQUE (dataflow_uid, environment, definition_hash)
  32. );
  33. CREATE UNIQUE INDEX IF NOT EXISTS uq_dataflow_workflow_active_environment
  34. ON public.dataflow_workflow_versions(dataflow_uid, environment)
  35. WHERE status = 'active';
  36. CREATE INDEX IF NOT EXISTS idx_workflow_versions_n8n
  37. ON public.dataflow_workflow_versions(n8n_workflow_id);
  38. """
  39. )
  40. def downgrade() -> None:
  41. pass