use dynamic dispatch

This commit is contained in:
shibao 2025-04-05 02:59:27 +00:00
parent 0c5442f0cd
commit e379896512
14 changed files with 62 additions and 69 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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 """