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