EctoContext (EctoContext v0.1.0)

Copy Markdown View Source

Generates standard data access functions for Ecto-backed contexts at compile time.

The ecto_context declaration is the table of contents for a context module. Every generated function threads a scope through, forcing explicit authorization decisions at every call site.

Usage

import EctoContext

ecto_context schema: Article, scope: &__MODULE__.scope/2 do
  list()
  get!()
  get_by!()
  create()
  update()
  delete()
  change()
end

def scope(query, %Scope{admin: true}), do: query
def scope(query, %Scope{user_id: uid}), do: where(query, user_id: ^uid)

def permission(_action, _record, %Scope{admin: true}), do: true
def permission(_, _, _), do: false

Generated functions

FunctionSignatureOpts
listlist(scope, opts \\ []):preload, :order_by, :limit, :select, :query
list_forlist_for(scope, assoc_atom, parent_id, opts \\ []):preload, :order_by, :limit, :select, :query
list_bylist_by(scope, clauses, opts \\ []):preload, :order_by, :limit, :select, :query
getget(scope, id, opts \\ []):preload
get!get!(scope, id, opts \\ []):preload, :query
get_byget_by(scope, clauses, opts \\ []):preload
get_by!get_by!(scope, clauses, opts \\ []):preload, :query
createcreate(scope, attrs, opts \\ []):changeset (default: :changeset)
create_forcreate_for(scope, assoc_atom, parent_id, attrs, opts \\ []):changeset (default: :changeset)
updateupdate(scope, record, attrs, opts \\ []):changeset (default: :changeset)
deletedelete(scope, record)
changechange(scope, record, attrs \\ %{}, opts \\ []):changeset (default: :changeset)
countcount(scope, opts \\ []):query
paginatepaginate(scope, opts \\ []):page, :per_page, :order_by, :preload, :query
subscribesubscribe(scope)
broadcastbroadcast(scope, message)

Summary

Functions

Default topic key function for subscribe/1 and broadcast/2. Returns scope.user.id. Override via topic_key: in ecto_context.

Declares the generated functions for an Ecto-backed context module.

Resolves the effective settings for a context declaration.

Functions

default_topic_key(scope)

@spec default_topic_key(term()) :: term()

Default topic key function for subscribe/1 and broadcast/2. Returns scope.user.id. Override via topic_key: in ecto_context.

ecto_context(context_opts_ast, list)

(macro)

Declares the generated functions for an Ecto-backed context module.

Accepts a keyword list of context-level options (:schema, :scope, :repo, etc.) and a do block containing function declarations like list(), get!(), create().

See the module documentation for the full list of supported functions and options.

resolve_settings(declaration_opts)

@spec resolve_settings(keyword()) :: keyword()

Resolves the effective settings for a context declaration.

Merges three layers (lowest to highest priority): guessed defaults from Mix/app config, library config from config :ecto_context, :defaults, and the declaration-level opts.