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