Current section
Files
Jump to
Current section
Files
lib/contexto.ex
defmodule Contexto do
@moduledoc """
Abstracts away common schema functions, such as list, get, create, update, delete, etc.
Assumes that the schema module has a `changeset` function.
Usage:
defmodule MyContext do
use ContextBase, repo: MyApp.Repo, schema: MyApp.MySchema
end
Options:
- :repo: the repo module to use
- :schema: the schema module to use
"""
defmacro __using__(opts) do
repo = Module.concat([opts |> Keyword.get(:repo) |> Macro.to_string()])
schema = Module.concat([opts |> Keyword.get(:schema) |> Macro.to_string()])
quote do
def list do
unquote(repo).all(unquote(schema))
end
def get(id) do
unquote(repo).get(unquote(schema), id)
end
def get!(id) do
unquote(repo).get!(unquote(schema), id)
end
def create(attrs) do
%unquote(schema){}
|> unquote(schema).changeset(attrs)
|> unquote(repo).insert()
end
def update(%unquote(schema){} = record, attrs) do
record
|> unquote(schema).changeset(attrs)
|> unquote(repo).update()
end
def update!(%unquote(schema){} = record, attrs) do
record
|> unquote(schema).changeset(attrs)
|> unquote(repo).update!()
end
def delete(record) do
unquote(repo).delete(record)
end
def preload(record, associations) do
unquote(repo).preload(record, associations)
end
end
end
end