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 Accounts. This can be substituted for a Phoenix context or any other module.

  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.