EctoResource
Eliminate boilerplate involved in defining basic CRUD functions in a Phoenix context or Elixir module.
Installation
If available in Hex, the package can be installed
by adding ecto_resource
to your list of dependencies in mix.exs
:
def deps do
[
{:ecto_resource, "~> 0.1.0"}
]
end
Basic Usage
All examples are using a "context" module Accounts
and a schema of User
. This can be substituted for your Phoenix context, or any other module and schema.
defmodule Accounts do
use EctoResource
using_repo(Repo) do
resource(User)
end
end
This will generate the functions:
def create_user(attributes) do
EctoResource.create(Repo, User, attributes)
end
def all_users(options) do
EctoResource.all(Repo, User, options)
end
def get_user(id, options) do
EctoResource.get(Repo, User, id, options)
end
def change_user(struct_or_changeset) do
EctoResource.change(User, struct_or_changeset)
end
def update_user(%User{id: 1}, changeset) do
EctoResource.update(Repo, User, struct, changeset)
end
def delete_user(struct_or_changeset) do
EctoResource.delete(Repo, struct_or_changeset)
end
There are also introspection functions to understand what is generated by the macro
Accounts.__resource__(:resources) == [
{Repo, User,
[
"all_users/1",
"change_user/1",
"create_user/1",
"delete_user/1",
"get_user/2",
"update_user/2"
]}
]
Advanced usage
More granular control is available through options
:read
defmodule Accounts do
use EctoResource
using_repo(Repo) do
resource(User, :read)
end
end
This will generate the functions:
def all_users(options) do
EctoResource.all(Repo, User, options)
end
def get_user(id, options) do
EctoResource.get(Repo, User, id, options)
end
There are also introspection functions to understand what is generated by the macro
Accounts.__resource__(:resources) == [
{Repo, User,
[
"all_users/1",
"get_user/2"
]}
]
:write
defmodule Accounts do
use EctoResource
using_repo(Repo) do
resource(User, :write)
end
end
This will generate the functions:
def create_user(attributes) do
EctoResource.create(Repo, User, attributes)
end
def change_user(struct_or_changeset) do
EctoResource.change(User, struct_or_changeset)
end
def update_user(%User{id: 1}, changeset) do
EctoResource.update(Repo, User, struct, changeset)
end
There are also introspection functions to understand what is generated by the macro
Accounts.__resource__(:resources) == [
{Repo, User,
[
"change_user/1",
"create_user/1",
"update_user/2"
]}
]
:delete
defmodule Accounts do
use EctoResource
using_repo(Repo) do
resource(User, :delete)
end
end
This will generate the functions:
def delete_user(struct_or_changeset) do
EctoResource.delete(Repo, struct_or_changeset)
end
There are also introspection functions to understand what is generated by the macro
Accounts.__resource__(:resources) == [
{Repo, User,
[
"delete_user/1"
]}
]
:only
defmodule Accounts do
use EctoResource
using_repo(Repo) do
resource(User, only: [:change])
end
This will generate the functions:
def change_user(struct_or_changeset) do
EctoResource.change(User, struct_or_changeset)
end
There are also introspection functions to understand what is generated by the macro
Accounts.__resource__(:resources) == [
{Repo, User,
[
"change_user/1"
]}
]
:except
defmodule Accounts do
use EctoResource
using_repo(Repo) do
resource(User, except: [:change])
end
This will generate the functions:
def create_user(attributes) do
EctoResource.create(Repo, User, attributes)
end
def all_users(options) do
EctoResource.all(Repo, User, options)
end
def get_user(id, options) do
EctoResource.get(Repo, User, id, options)
end
def update_user(%User{id: 1}, changeset) do
EctoResource.update(Repo, User, struct, changeset)
end
def delete_user(struct_or_changeset) do
EctoResource.delete(Repo, struct_or_changeset)
end
There are also introspection functions to understand what is generated by the macro
Accounts.__resource__(:resources) == [
{Repo, User,
[
"all_users/1",
"create_user/1",
"delete_user/1",
"get_user/2",
"update_user/2"
]}
]
Documentation can be generated with ExDoc and published on HexDocs. Once published, the docs can be found at https://hexdocs.pm/ecto_resource.