defmodule Ravix.Documents.Store do @moduledoc """ Macro to define a RavenDB Repository Store ## Example `defmodule Ravix.TestRepo do use Ravix.Documents.Store end` """ defmacro __using__(opts) do require OK alias Ravix.Telemetry quote bind_quoted: [opts: opts] do @behaviour Ravix.Documents.Store otp_app = Ravix.Connection.Supervisor.compile_config(opts) @otp_app otp_app def start_link(opts \\ []) do Ravix.Connection.Supervisor.start_link(__MODULE__, @otp_app, opts) end def open_session() do session_id = UUID.uuid4() {:ok, conn_state} = Ravix.Connection.fetch_state(__MODULE__) session_initial_state = %Ravix.Documents.Session.State{ store: __MODULE__, session_id: session_id, database: conn_state.database, conventions: conn_state.conventions } {:ok, _} = Ravix.Documents.Session.Supervisor.create_session(session_initial_state) Telemetry.session_started(__MODULE__) {:ok, session_id} end def close_session(session_id) do Telemetry.session_ended(__MODULE__) Ravix.Documents.Session.Supervisor.close_session(__MODULE__, session_id) end def child_spec(opts) do %{ id: __MODULE__, start: {__MODULE__, :start_link, [opts]}, type: :supervisor } end end end @callback start_link(opts :: Keyword.t()) :: {:ok, pid} | {:error, {:already_started, pid}} | {:error, term} @doc """ Opens a RavenDB local session Returns a tuple with `{:ok, uuid}` if successful or `{:error, :not_found}` if the store is not initialized ## Examples iex> Ravix.Test.Store.open_session {:ok, "8945c215-dd67-44da-9a64-2916e0a328d9"} """ @callback open_session() :: {:ok, binary()} @doc """ Closes a RavenDB local session Returns `:ok` if successful or `{:error, :not_found}` if the session is not found ## Examples iex> Ravix.Test.Store.close_session("8945c215-dd67-44da-9a64-2916e0a328d9") :ok """ @callback close_session(session_id :: binary()) :: :ok | {:error, :not_found} end