lib/storex.ex

defmodule Storex do
  use Application

  @doc false
  def start(_type, _args) do
    import Supervisor.Spec, warn: false

    children = [
      worker(Storex.Registry.ETS, []),
      supervisor(Storex.Supervisor, [])
    ]

    Supervisor.start_link(children, strategy: :one_for_one, name: __MODULE__)
  end

  @doc """
  Mutate store from elixir.

  ```elixir
  Call mutation callback in store synchronously.

  Storex.mutate("d9ez7fgkp96", "ExampleApp.Store", "reload", ["user_id"])
  ```
  """
  def mutate(session, store, mutation, payload \\ [])
      when is_binary(session) and is_binary(store) do
    Storex.Registry.session_pid(session)
    |> case do
      :undefined -> {:error, "Session #{session} not found."}
      pid -> Kernel.send(pid, {:mutate, store, mutation, payload})
    end
  end
end