README.md

# FireAct

Plug inspired/based helper for defining action handlers with
optional params validations via Ecto.Changeset.

Perfect for extracting logic outside the controller endpoints.

[Documentation](https://hexdocs.pm/fire_act/)

## Installation

If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `fire_act` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:fire_act, "~> 0.1.0"}
  ]
end
```


## Basic example usage

Please also read documentation and tests.

```elixir
defmodule MyApp.RegisterUser do
  use FireAct.Handler
  use FireAct.ChangesetParams, %{
    age: :number,
    email: :string
  }

  def handle(action, permitted_params) do
    MyApp.User.create_changeset(permitted_params)
    |> MyApp.Repo.insert()
    |> case do
      {:ok, user} ->
        action |> assign(:user, user)
      {:error, error} ->
        action |> assign(:error, error) |> fail()
    end
  end

  def validate_params(_action, changeset) do
    changeset
    |> validate_email()
    |> validate_required([:age, :email])
  end

  defp validate_email(changeset) do
    if "valid@example.com" == get_field(changeset, :email) do
      changeset
    else
      changeset
      |> add_error(:email, "only valid@example.com is OK")
    end
  end
end

{:ok, %{assigns: %{user: user}}} = FireAct.run(RegisterUser, %{
  age: 1,
  email: "valid@example.com"
})
```