priv/repo/migrations/20260822153929_allow_cross_repository_project_items.exs

58e6347eeb72 · 1 KB

defmodule OpenAgents.Repo.Migrations.AllowCrossRepositoryProjectItems do
  use Ecto.Migration

  def up do
    alter table(:project_items) do
      add :issue_repository_id,
          references(:repositories, type: :binary_id, on_delete: :delete_all)
    end

    execute("UPDATE project_items SET issue_repository_id = repository_id")
    execute("ALTER TABLE project_items ALTER COLUMN issue_repository_id SET NOT NULL")
    execute("ALTER TABLE project_items DROP CONSTRAINT project_items_issue_repository_fkey")
    create index(:project_items, [:issue_repository_id])
    create unique_index(:project_items, [:project_id, :issue_id])

    execute("""
    ALTER TABLE project_items
      ADD CONSTRAINT project_items_issue_source_repository_fkey
      FOREIGN KEY (issue_id, issue_repository_id)
      REFERENCES issues (id, repository_id)
      ON DELETE RESTRICT
    """)
  end

  def down do
    execute("DELETE FROM project_items WHERE issue_repository_id <> repository_id")

    execute(
      "ALTER TABLE project_items DROP CONSTRAINT project_items_issue_source_repository_fkey"
    )

    drop unique_index(:project_items, [:project_id, :issue_id])
    drop index(:project_items, [:issue_repository_id])

    execute("""
    ALTER TABLE project_items
      ADD CONSTRAINT project_items_issue_repository_fkey
      FOREIGN KEY (issue_id, repository_id)
      REFERENCES issues (id, repository_id)
      ON DELETE RESTRICT
    """)

    alter table(:project_items), do: remove(:issue_repository_id)
  end
end