lib/ecto_shorts.ex

defmodule EctoShorts do
  @moduledoc """
  Ecto Shorts is a library created to help shorten ecto interactions
  and remove most of the related code.



  There are 2 main modules Actions and CommonChanges

  ### Actions
  `EctoShorts.Actions` allows for filters to be constructed from data such as

  ```elixir
  Actions.all(User, %{
    favorite_food: "curry",
    age: %{gte: 18, lte: 50},
    name: %{ilike: "steven"},
    preload: [:address],
    last: 5
  })
  ```

  which the equivelent would be

  ```elixir
  Repo.all from u in User,
    preload: [:address],
    limit: 5,
    where: u.favorite_food == "curry" and
           u.age >= 18 and u.age <= 50 and
           ilike(u.name, "%steven%")
  ```
  All actions can accept an optional argument of a keyword list that can be used to configure which Repo the Action should use.

  ## Options
    * `:repo` - A module that uses the Ecto.Repo Module.
    * `:replica` - If you don't want to perform any reads against your Primary, you can specify a replica to read from.



  See `EctoShorts.CommonFilters` for more info on filters

  ### CommonChanges
  `EctoShorts.CommonChanges` is responsible for updating relations on schemas it allows
  you to update associations or create using changesets and handles choosing between
  `put_assoc` and `cast_assoc`

  ```elixir
  Actions.update(User, 1, %{friends: [%{id: 5, name: "Billy"}]})
  Actions.update(User, 1, %{friends: [%{id: 5, name: "Bob"}]})
  ```

  Another feature is you can update many to many relationship members using a id list of members

  ###### How to make user 1 friends with users 5, 6, 7
  ```elixir
  Actions.update(User, 1, %{friends: [%{id: 5}, %{id: 6}, %{id: 7}]})
  ```

  ## Config
  You can configure both the Repo and Error module via
  ```elixir
  config :ecto_shorts,
    repo: MyRepo,
    error_module: EctoShorts.Actions.Error
  ```
  """
end