use dynamic dispatch
This commit is contained in:
parent
0c5442f0cd
commit
e379896512
30
lib/memex.ex
30
lib/memex.ex
@ -6,4 +6,34 @@ defmodule Memex do
|
|||||||
Contexts are also responsible for managing your data, regardless
|
Contexts are also responsible for managing your data, regardless
|
||||||
if it comes from the database, an external API or others.
|
if it comes from the database, an external API or others.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
def context do
|
||||||
|
quote do
|
||||||
|
use Gettext, backend: MemexWeb.Gettext
|
||||||
|
import Ecto.Query
|
||||||
|
alias Ecto.{Changeset, Multi, Queryable, UUID}
|
||||||
|
alias Memex.Accounts.User
|
||||||
|
alias Memex.Repo
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def schema do
|
||||||
|
quote do
|
||||||
|
use Ecto.Schema
|
||||||
|
use Gettext, backend: MemexWeb.Gettext
|
||||||
|
import Ecto.{Changeset, Query}
|
||||||
|
alias Ecto.{Association, Changeset, Queryable, UUID}
|
||||||
|
alias Memex.Accounts.User
|
||||||
|
|
||||||
|
@primary_key {:id, :binary_id, autogenerate: true}
|
||||||
|
@foreign_key_type :binary_id
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
@doc """
|
||||||
|
When used, dispatch to the appropriate context/schema/etc.
|
||||||
|
"""
|
||||||
|
defmacro __using__(which) when is_atom(which) do
|
||||||
|
apply(__MODULE__, which, [])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
@ -3,10 +3,9 @@ defmodule Memex.Accounts do
|
|||||||
The Accounts context.
|
The Accounts context.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import Ecto.Query, warn: false
|
use Memex, :context
|
||||||
alias Memex.{Mailer, Repo}
|
alias Memex.Mailer
|
||||||
alias Memex.Accounts.{Invite, Invites, User, UserToken}
|
alias Memex.Accounts.{Invite, Invites, UserToken}
|
||||||
alias Ecto.{Changeset, Multi}
|
|
||||||
alias Oban.Job
|
alias Oban.Job
|
||||||
|
|
||||||
## Database getters
|
## Database getters
|
||||||
|
@ -5,13 +5,8 @@ defmodule Memex.Accounts.Invite do
|
|||||||
`:uses_left` is defined.
|
`:uses_left` is defined.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
use Ecto.Schema
|
use Memex, :schema
|
||||||
import Ecto.Changeset
|
|
||||||
alias Ecto.{Association, Changeset, UUID}
|
|
||||||
alias Memex.Accounts.User
|
|
||||||
|
|
||||||
@primary_key {:id, :binary_id, autogenerate: true}
|
|
||||||
@foreign_key_type :binary_id
|
|
||||||
schema "invites" do
|
schema "invites" do
|
||||||
field :name, :string
|
field :name, :string
|
||||||
field :token, :string
|
field :token, :string
|
||||||
|
@ -3,10 +3,8 @@ defmodule Memex.Accounts.Invites do
|
|||||||
The Invites context.
|
The Invites context.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import Ecto.Query, warn: false
|
use Memex, :context
|
||||||
alias Ecto.Multi
|
alias Memex.Accounts.Invite
|
||||||
alias Memex.Accounts.{Invite, User}
|
|
||||||
alias Memex.Repo
|
|
||||||
|
|
||||||
@invite_token_length 20
|
@invite_token_length 20
|
||||||
|
|
||||||
|
@ -3,11 +3,8 @@ defmodule Memex.Accounts.User do
|
|||||||
A Memex user
|
A Memex user
|
||||||
"""
|
"""
|
||||||
|
|
||||||
use Ecto.Schema
|
use Memex, :schema
|
||||||
use Gettext, backend: MemexWeb.Gettext
|
alias Memex.Accounts.Invite
|
||||||
import Ecto.Changeset
|
|
||||||
alias Ecto.{Association, Changeset, UUID}
|
|
||||||
alias Memex.Accounts.{Invite, User}
|
|
||||||
|
|
||||||
@derive {Jason.Encoder,
|
@derive {Jason.Encoder,
|
||||||
only: [
|
only: [
|
||||||
@ -20,8 +17,6 @@ defmodule Memex.Accounts.User do
|
|||||||
:updated_at
|
:updated_at
|
||||||
]}
|
]}
|
||||||
@derive {Inspect, except: [:password]}
|
@derive {Inspect, except: [:password]}
|
||||||
@primary_key {:id, :binary_id, autogenerate: true}
|
|
||||||
@foreign_key_type :binary_id
|
|
||||||
schema "users" do
|
schema "users" do
|
||||||
field :email, :string
|
field :email, :string
|
||||||
field :password, :string, virtual: true
|
field :password, :string, virtual: true
|
||||||
|
@ -3,10 +3,7 @@ defmodule Memex.Accounts.UserToken do
|
|||||||
Schema for a user's session token
|
Schema for a user's session token
|
||||||
"""
|
"""
|
||||||
|
|
||||||
use Ecto.Schema
|
use Memex, :schema
|
||||||
import Ecto.Query
|
|
||||||
alias Ecto.{Association, UUID}
|
|
||||||
alias Memex.Accounts.User
|
|
||||||
|
|
||||||
@hash_algorithm :sha256
|
@hash_algorithm :sha256
|
||||||
@rand_size 32
|
@rand_size 32
|
||||||
@ -18,8 +15,6 @@ defmodule Memex.Accounts.UserToken do
|
|||||||
@change_email_validity_in_days 7
|
@change_email_validity_in_days 7
|
||||||
@session_validity_in_days 60
|
@session_validity_in_days 60
|
||||||
|
|
||||||
@primary_key {:id, :binary_id, autogenerate: true}
|
|
||||||
@foreign_key_type :binary_id
|
|
||||||
schema "users_tokens" do
|
schema "users_tokens" do
|
||||||
field :token, :binary
|
field :token, :binary
|
||||||
field :context, :string
|
field :context, :string
|
||||||
|
@ -3,8 +3,8 @@ defmodule Memex.Contexts do
|
|||||||
The Contexts context.
|
The Contexts context.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import Ecto.Query, warn: false
|
use Memex, :context
|
||||||
alias Memex.{Accounts.User, Contexts.Context, Repo}
|
alias Memex.Contexts.Context
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Returns the list of contexts.
|
Returns the list of contexts.
|
||||||
|
@ -3,11 +3,8 @@ defmodule Memex.Contexts.Context do
|
|||||||
Represents a document that synthesizes multiple concepts as defined by notes
|
Represents a document that synthesizes multiple concepts as defined by notes
|
||||||
into a single consideration
|
into a single consideration
|
||||||
"""
|
"""
|
||||||
use Ecto.Schema
|
|
||||||
use Gettext, backend: MemexWeb.Gettext
|
use Memex, :schema
|
||||||
import Ecto.Changeset
|
|
||||||
alias Ecto.{Changeset, UUID}
|
|
||||||
alias Memex.{Accounts.User, Repo}
|
|
||||||
|
|
||||||
@derive {Phoenix.Param, key: :slug}
|
@derive {Phoenix.Param, key: :slug}
|
||||||
@derive {Jason.Encoder,
|
@derive {Jason.Encoder,
|
||||||
@ -19,8 +16,6 @@ defmodule Memex.Contexts.Context do
|
|||||||
:inserted_at,
|
:inserted_at,
|
||||||
:updated_at
|
:updated_at
|
||||||
]}
|
]}
|
||||||
@primary_key {:id, :binary_id, autogenerate: true}
|
|
||||||
@foreign_key_type :binary_id
|
|
||||||
schema "contexts" do
|
schema "contexts" do
|
||||||
field :slug, :string
|
field :slug, :string
|
||||||
field :content, :string
|
field :content, :string
|
||||||
@ -59,7 +54,7 @@ defmodule Memex.Contexts.Context do
|
|||||||
)
|
)
|
||||||
|> validate_required([:slug, :user_id, :visibility])
|
|> validate_required([:slug, :user_id, :visibility])
|
||||||
|> unique_constraint(:slug)
|
|> unique_constraint(:slug)
|
||||||
|> unsafe_validate_unique(:slug, Repo)
|
|> unsafe_validate_unique(:slug, Memex.Repo)
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec update_changeset(t(), attrs :: map(), User.t()) :: changeset()
|
@spec update_changeset(t(), attrs :: map(), User.t()) :: changeset()
|
||||||
@ -73,7 +68,7 @@ defmodule Memex.Contexts.Context do
|
|||||||
)
|
)
|
||||||
|> validate_required([:slug, :visibility])
|
|> validate_required([:slug, :visibility])
|
||||||
|> unique_constraint(:slug)
|
|> unique_constraint(:slug)
|
||||||
|> unsafe_validate_unique(:slug, Repo)
|
|> unsafe_validate_unique(:slug, Memex.Repo)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp cast_tags_string(changeset, attrs) do
|
defp cast_tags_string(changeset, attrs) do
|
||||||
|
@ -3,8 +3,8 @@ defmodule Memex.Notes do
|
|||||||
The Notes context.
|
The Notes context.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import Ecto.Query, warn: false
|
use Memex, :context
|
||||||
alias Memex.{Accounts.User, Notes.Note, Repo}
|
alias Memex.Notes.Note
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Returns the list of notes.
|
Returns the list of notes.
|
||||||
|
@ -2,11 +2,8 @@ defmodule Memex.Notes.Note do
|
|||||||
@moduledoc """
|
@moduledoc """
|
||||||
Schema for a user-written note
|
Schema for a user-written note
|
||||||
"""
|
"""
|
||||||
use Ecto.Schema
|
|
||||||
use Gettext, backend: MemexWeb.Gettext
|
use Memex, :schema
|
||||||
import Ecto.Changeset
|
|
||||||
alias Ecto.{Changeset, UUID}
|
|
||||||
alias Memex.{Accounts.User, Repo}
|
|
||||||
|
|
||||||
@derive {Phoenix.Param, key: :slug}
|
@derive {Phoenix.Param, key: :slug}
|
||||||
@derive {Jason.Encoder,
|
@derive {Jason.Encoder,
|
||||||
@ -18,8 +15,6 @@ defmodule Memex.Notes.Note do
|
|||||||
:inserted_at,
|
:inserted_at,
|
||||||
:updated_at
|
:updated_at
|
||||||
]}
|
]}
|
||||||
@primary_key {:id, :binary_id, autogenerate: true}
|
|
||||||
@foreign_key_type :binary_id
|
|
||||||
schema "notes" do
|
schema "notes" do
|
||||||
field :slug, :string
|
field :slug, :string
|
||||||
field :content, :string
|
field :content, :string
|
||||||
@ -58,7 +53,7 @@ defmodule Memex.Notes.Note do
|
|||||||
)
|
)
|
||||||
|> validate_required([:slug, :user_id, :visibility])
|
|> validate_required([:slug, :user_id, :visibility])
|
||||||
|> unique_constraint(:slug)
|
|> unique_constraint(:slug)
|
||||||
|> unsafe_validate_unique(:slug, Repo)
|
|> unsafe_validate_unique(:slug, Memex.Repo)
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec update_changeset(t(), attrs :: map(), User.t()) :: changeset()
|
@spec update_changeset(t(), attrs :: map(), User.t()) :: changeset()
|
||||||
@ -72,7 +67,7 @@ defmodule Memex.Notes.Note do
|
|||||||
)
|
)
|
||||||
|> validate_required([:slug, :visibility])
|
|> validate_required([:slug, :visibility])
|
||||||
|> unique_constraint(:slug)
|
|> unique_constraint(:slug)
|
||||||
|> unsafe_validate_unique(:slug, Repo)
|
|> unsafe_validate_unique(:slug, Memex.Repo)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp cast_tags_string(changeset, attrs) do
|
defp cast_tags_string(changeset, attrs) do
|
||||||
|
@ -3,8 +3,8 @@ defmodule Memex.Pipelines do
|
|||||||
The Pipelines context.
|
The Pipelines context.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import Ecto.Query, warn: false
|
use Memex, :context
|
||||||
alias Memex.{Accounts.User, Pipelines.Pipeline, Repo}
|
alias Memex.Pipelines.Pipeline
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Returns the list of pipelines.
|
Returns the list of pipelines.
|
||||||
|
@ -2,11 +2,9 @@ defmodule Memex.Pipelines.Pipeline do
|
|||||||
@moduledoc """
|
@moduledoc """
|
||||||
Represents a chain of considerations to take to accomplish a task
|
Represents a chain of considerations to take to accomplish a task
|
||||||
"""
|
"""
|
||||||
use Ecto.Schema
|
|
||||||
use Gettext, backend: MemexWeb.Gettext
|
use Memex, :schema
|
||||||
import Ecto.Changeset
|
alias Memex.Pipelines.Steps.Step
|
||||||
alias Ecto.{Changeset, UUID}
|
|
||||||
alias Memex.{Accounts.User, Pipelines.Steps.Step, Repo}
|
|
||||||
|
|
||||||
@derive {Phoenix.Param, key: :slug}
|
@derive {Phoenix.Param, key: :slug}
|
||||||
@derive {Jason.Encoder,
|
@derive {Jason.Encoder,
|
||||||
@ -19,8 +17,6 @@ defmodule Memex.Pipelines.Pipeline do
|
|||||||
:steps,
|
:steps,
|
||||||
:updated_at
|
:updated_at
|
||||||
]}
|
]}
|
||||||
@primary_key {:id, :binary_id, autogenerate: true}
|
|
||||||
@foreign_key_type :binary_id
|
|
||||||
schema "pipelines" do
|
schema "pipelines" do
|
||||||
field :slug, :string
|
field :slug, :string
|
||||||
field :description, :string
|
field :description, :string
|
||||||
@ -61,7 +57,7 @@ defmodule Memex.Pipelines.Pipeline do
|
|||||||
)
|
)
|
||||||
|> validate_required([:slug, :user_id, :visibility])
|
|> validate_required([:slug, :user_id, :visibility])
|
||||||
|> unique_constraint(:slug)
|
|> unique_constraint(:slug)
|
||||||
|> unsafe_validate_unique(:slug, Repo)
|
|> unsafe_validate_unique(:slug, Memex.Repo)
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec update_changeset(t(), attrs :: map(), User.t()) :: changeset()
|
@spec update_changeset(t(), attrs :: map(), User.t()) :: changeset()
|
||||||
@ -75,7 +71,7 @@ defmodule Memex.Pipelines.Pipeline do
|
|||||||
)
|
)
|
||||||
|> validate_required([:slug, :visibility])
|
|> validate_required([:slug, :visibility])
|
||||||
|> unique_constraint(:slug)
|
|> unique_constraint(:slug)
|
||||||
|> unsafe_validate_unique(:slug, Repo)
|
|> unsafe_validate_unique(:slug, Memex.Repo)
|
||||||
end
|
end
|
||||||
|
|
||||||
defp cast_tags_string(changeset, attrs) do
|
defp cast_tags_string(changeset, attrs) do
|
||||||
|
@ -2,10 +2,9 @@ defmodule Memex.Pipelines.Steps.Step do
|
|||||||
@moduledoc """
|
@moduledoc """
|
||||||
Represents a step taken while executing a pipeline
|
Represents a step taken while executing a pipeline
|
||||||
"""
|
"""
|
||||||
use Ecto.Schema
|
|
||||||
import Ecto.Changeset
|
use Memex, :schema
|
||||||
alias Ecto.{Changeset, UUID}
|
alias Memex.Pipelines.Pipeline
|
||||||
alias Memex.{Accounts.User, Pipelines.Pipeline}
|
|
||||||
|
|
||||||
@derive {Jason.Encoder,
|
@derive {Jason.Encoder,
|
||||||
only: [
|
only: [
|
||||||
@ -15,8 +14,6 @@ defmodule Memex.Pipelines.Steps.Step do
|
|||||||
:inserted_at,
|
:inserted_at,
|
||||||
:updated_at
|
:updated_at
|
||||||
]}
|
]}
|
||||||
@primary_key {:id, :binary_id, autogenerate: true}
|
|
||||||
@foreign_key_type :binary_id
|
|
||||||
schema "steps" do
|
schema "steps" do
|
||||||
field :title, :string
|
field :title, :string
|
||||||
field :content, :string
|
field :content, :string
|
||||||
|
@ -3,9 +3,7 @@ defmodule Memex.Pipelines.Steps do
|
|||||||
The context for steps within a pipeline
|
The context for steps within a pipeline
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import Ecto.Query, warn: false
|
use Memex, :context
|
||||||
alias Ecto.Multi
|
|
||||||
alias Memex.{Accounts.User, Repo}
|
|
||||||
alias Memex.Pipelines.{Pipeline, Steps.Step}
|
alias Memex.Pipelines.{Pipeline, Steps.Step}
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
|
Loading…
x
Reference in New Issue
Block a user