# SPDX-License-Identifier: Apache-2.0 defmodule Carbonite.Multi do @moduledoc """ This module provides functions for dealing with audit trails in the context of Ecto.Multi. """ @moduledoc since: "0.2.0" alias Carbonite.Trigger alias Ecto.Multi @type prefix :: binary() @type params :: map() @type prefix_option :: {:carbonite_prefix, prefix()} @doc """ Adds an insert operation for a `Carbonite.Transaction` to an `Ecto.Multi`. Multi step is called `:carbonite_transaction`. See `Carbonite.insert_transaction/3` for options. ## Example Ecto.Multi.new() |> Carbonite.Multi.insert_transaction(%{meta: %{type: "create_rabbit"}}) |> Ecto.Multi.insert(:rabbit, fn _ -> Rabbit.changeset(%{}) end) """ @doc since: "0.2.0" @spec insert_transaction(Multi.t()) :: Multi.t() @spec insert_transaction(Multi.t(), params()) :: Multi.t() @spec insert_transaction(Multi.t(), params(), [prefix_option()]) :: Multi.t() def insert_transaction(%Multi{} = multi, params \\ %{}, opts \\ []) do Multi.run(multi, :carbonite_transaction, fn repo, _state -> Carbonite.insert_transaction(repo, params, opts) end) end @doc """ Adds a operation to an `Ecto.Multi` to fetch the changes of the current transaction. Useful for returning all transaction changes to the caller. Multi step is called `:carbonite_changes`. See `Carbonite.fetch_changes/2` for options. ## Example Ecto.Multi.new() |> Carbonite.Multi.insert_transaction(%{meta: %{type: "create_rabbit"}}) |> Ecto.Multi.insert(:rabbit, fn _ -> Rabbit.changeset(%{}) end) |> Carbonite.Multi.fetch_changes() """ @doc since: "0.5.0" @spec fetch_changes(Multi.t()) :: Multi.t() @spec fetch_changes(Multi.t(), [prefix_option()]) :: Multi.t() def fetch_changes(%Multi{} = multi, opts \\ []) do Multi.run(multi, :carbonite_changes, fn repo, _state -> Carbonite.fetch_changes(repo, opts) end) end @doc """ Sets the current transaction to "override mode" for all tables in the audit log. See `Carbonite.override_mode/2` for options. """ @doc since: "0.2.0" @spec override_mode(Multi.t()) :: Multi.t() @spec override_mode(Multi.t(), [{:to, Trigger.mode()} | prefix_option()]) :: Multi.t() def override_mode(%Multi{} = multi, opts \\ []) do Multi.run(multi, :carbonite_triggers, fn repo, _state -> {:ok, Carbonite.override_mode(repo, opts)} end) end end