defmodule Philomena.Repo do
  alias Ecto.Multi

  use Ecto.Repo,
    otp_app: :philomena,
    adapter: Ecto.Adapters.Postgres

  use Scrivener, page_size: 250

  @levels %{
    read_committed: "READ COMMITTED",
    repeatable_read: "REPEATABLE READ",
    serializable: "SERIALIZABLE"
  }

  def isolated_transaction(%Multi{} = multi, level) do
    Multi.append(
      Multi.new |> Multi.run(:isolate, fn repo, _chg ->
        repo.query!("SET TRANSACTION ISOLATION LEVEL #{@levels[level]}")
        {:ok, nil}
      end),
      multi
    )
    |> Philomena.Repo.transaction()
  end
end