# `Rivet.Ecto.Collection`
[🔗](https://github.com/srevenant/rivet/blob/main/lib/rivet/ecto/collection/index.ex#L1)

# For data models using Ecto. Options:

`id_type: :uuid, :intid, :none` — how to handle record ID
`features: [...]`       — a list of atoms as features, including:
            :short_id   — enable/disable ShortId
`required: [:field, ...]` — list of fields required for this model
`update: [:field, ...]` — list of fields allowed to be updated on this model
`create: [:field, ...]` — list of additional fields allowed only on creation.
                          unlike the other fields, whatever is provided is
                          concatenated to required and update. This defaults
                          to `[:id]`, so specify it as `[]` for no additional
                          create fields.
`atomic: [:field, ...]` — if included the fields will be used when doing a
                          conditional/atomic update with `assert: %{}` as
                          an optional argument to update()
`foreign_keys: [:field, ...]` - list of foreign key constraints (if any)
`unique: [:field, ...]` — list of unique constraints (if any)
`debug: true` — will print out some compile-time information for debugging

Note:fk and unique may also be tuple: {:key, [keyword-list options]}

Recap:

* `create:` ONLY on create, but is still optional (default: :id)
* `required:` MUST exist on create, and at the intersection of required and
   update, those values must also exist
* `update:` things that can be updated

# `build`
*optional* 

```elixir
@callback build(params :: map()) :: Ecto.Changeset.t()
```

# `change_post`
*optional* 

```elixir
@callback change_post(
  {status :: atom(), item :: map()},
  changes :: map()
) :: {atom(), map()}
```

# `change_prep`
*optional* 

```elixir
@callback change_prep(item :: map(), changes :: map()) :: {:ok, map()}
```

# `changeset`
*optional* 

```elixir
@callback changeset(item :: map(), params :: map()) :: Ecto.Changeset.t()
```

# `create_post`
*optional* 

```elixir
@callback create_post(
  {status :: atom(), item :: map()},
  changes :: map()
) :: {atom(), map()}
```

# `create_prep`
*optional* 

```elixir
@callback create_prep(item :: map(), changes :: map()) :: {:ok, map()}
```

# `delete`
*optional* 

```elixir
@callback delete(item :: map()) :: {:ok | :error, Ecto.Changeset.t() | map()}
```

# `validate`
*optional* 

```elixir
@callback validate(Ecto.Changeset.t()) :: Ecto.Changeset.t()
```

# `enrich_query_args`

iex> enrich_query_args(%Ecto.Query{}, order_by: [asc: :asdf])
#Ecto.Query<from q0 in query, order_by: [asc: q0.asdf]>
iex> enrich_query_args(%Ecto.Query{}, desc: :asdf)
#Ecto.Query<from q0 in query, order_by: [desc: q0.asdf]>
iex> enrich_query_args(%Ecto.Query{}, asc: :asdf)
#Ecto.Query<from q0 in query, order_by: [asc: q0.asdf]>
iex> enrich_query_args(%Ecto.Query{}, limit: 10)
#Ecto.Query<from q0 in query, limit: ^10>
iex> enrich_query_args(%Ecto.Query{}, preload: [:narf])
#Ecto.Query<from q0 in query, preload: [:narf]>
iex> enrich_query_args(%Ecto.Query{}, select: [:narf])
#Ecto.Query<from q0 in query, select: [:narf]>

---

*Consult [api-reference.md](api-reference.md) for complete listing*
