priv/repo/migrations/20260817040100_allow_graph_receipt_privacy_deletion.exs

58e6347eeb72 · 764 B

defmodule Sarah.Repo.Migrations.AllowGraphReceiptPrivacyDeletion do
  use Ecto.Migration

  def up do
    execute("""
    CREATE OR REPLACE FUNCTION reject_graph_projection_update()
    RETURNS trigger AS $$
    BEGIN
      IF TG_OP = 'DELETE' AND TG_TABLE_NAME = 'graph_operation_receipts' AND
         NOT EXISTS (SELECT 1 FROM visitors WHERE id = OLD.owner_visitor_id)
      THEN
        RETURN OLD;
      END IF;
      RAISE EXCEPTION 'graph projections are immutable';
    END;
    $$ LANGUAGE plpgsql;
    """)
  end

  def down do
    execute("""
    CREATE OR REPLACE FUNCTION reject_graph_projection_update()
    RETURNS trigger AS $$
    BEGIN
      RAISE EXCEPTION 'graph projections are immutable';
    END;
    $$ LANGUAGE plpgsql;
    """)
  end
end