priv/repo/migrations/20260817030100_allow_experience_receipt_privacy_deletion.exs

58e6347eeb72 · 1 KB

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

  def up do
    replace_bank_turn_foreign_key("CASCADE")

    execute("""
    CREATE OR REPLACE FUNCTION reject_experience_deletion_receipt_mutation()
    RETURNS trigger AS $$
    BEGIN
      IF TG_OP = 'DELETE' AND NOT EXISTS (
        SELECT 1 FROM visitors WHERE id = OLD.owner_visitor_id
      ) THEN
        RETURN OLD;
      END IF;
      RAISE EXCEPTION 'experience deletion receipts are append-only';
    END;
    $$ LANGUAGE plpgsql;
    """)
  end

  def down do
    replace_bank_turn_foreign_key("RESTRICT")

    execute("""
    CREATE OR REPLACE FUNCTION reject_experience_deletion_receipt_mutation()
    RETURNS trigger AS $$
    BEGIN
      RAISE EXCEPTION 'experience deletion receipts are append-only';
    END;
    $$ LANGUAGE plpgsql;
    """)
  end

  defp replace_bank_turn_foreign_key(on_delete) do
    execute("ALTER TABLE experience_banks DROP CONSTRAINT experience_banks_turn_id_fkey")

    execute("""
    ALTER TABLE experience_banks
    ADD CONSTRAINT experience_banks_turn_id_fkey
    FOREIGN KEY (turn_id) REFERENCES turns(id) ON DELETE #{on_delete}
    """)
  end
end