Noizu Entities

Noizu Entity Scaffolding provides a mechanism to define extended elixir structs with metadata for specifying access control, flagging sensitive data, specifying json formatting, specifying text/geo/vector indexing, and per entity caching settings.

It provides a streamlined standardized mechanism to configure ORM mapping between ecto, mnesia, redis and other persistence layers while reducing the amount of boilerplate code needed while providing streamlined cache, security and indexing controls. Including support for multiple layers of cache/persistence.

It automatically hooks your entities up to support noizu_labs_context and noizu_labs_erp protocols.

Table of Contents

  1. Overview
  2. Tasks
  3. Persistence
  4. Indexing
  5. Caching
  6. Entity
    1. Overview
    2. ERP
    3. Field Types
    4. Cache
    5. Index
    6. Annotation
      1. Access Control
      2. Sensitive Data
      3. Transient Data
      4. JSON Formatting
      5. Cache
      6. Index
  7. Repo

Overview

details pending

Tasks

You can use the helpers to construct entities and related ecto classes. mix nz.gen.entity my_entity store=ecto sref=my-entity field=biz:integer Generation is not perfect and some manual editing of ecto and entity may be required.

Persistence

details pending

Indexing

details pending

Caching

details pending

Entity Definition

details pending

Repo Definition

details pending

Declaring a Noizu Entity

Behind the scenes a Noizu.Entity is just a defstruct with meta data added. Below is simple declaration and the effective defstruct it generates.

defmodule MyApp.Entity.Bar do
@vsn 1.0
use Noizu.Entity
def_entity do
identifier :integer
field :name
field :title, "Hello"
field :description
end
end

The above will generate a struct as below plus meta fields accessible by Noizu.Entity behavior defined methods.

defmodule MyApp.Entity.Bar do
defstruct [
identifier: nil,
name: nil,
title: "Hello",
description: nil,
# Generated Fields
vsn: 1.0,
meta: nil,
__transient__: nil
]
end

JSON Formatting

You may add json formatting annotation to Noizu.Entities to define how an entity should be displayed for different json formats (:admin, :client,...)

@json true
@json :include
@json false
@json :omit
@json template: :omit
@json as: :apple, omit: false
@json for: [:breif, :apple], set: [as: :alias, omit: false]

details_pending

Security/Access Control

You may add annotation to control required permissions to access/return an entity field, (:admin, :user, {:permission, name}, {:custom, {m,f,a})

@restrict :user
@restrict {m,f,a} # [entity, field, context] ++ a
@restrict :admin
@restrict {:group, group}

details_pending

Indexing

details_pending

Cache

details_pending

Extended Entity Declarations

Transient Annotation

Transient fields (fields that should not be persisted to persistence layers/cache) can be annotated or placed in transient blocks.

defmodule MyApp.Entity.Bar do
@vsn 1.0
use Noizu.Entity
def_entity do
identifier :integer
field :name
@transient true
field :transient_field
field :peristed_field
transient do
field :transient_field_2
field :transient_field_3
end
field :peristed_field2
end
end

PII Annotation

Flags with sensitive information can be marked by using pii blocks or via @pii annotation. The resulting struct is unchanged but meta data tracks pii status and is used to alter inspect and logging output.

defmodule MyApp.Entity.Bar do
@vsn 1.0
use Noizu.Entity
def_entity do
identifier :integer
field :name
@pii :sensitive
field :passport
pii() do
field :pii_sensitive_field
field :pii_sensitive_field2
end
pii(:low) do
field :pii_low_field
field :pii_low_field2
end
end
end