Packages
one_piece_commanded
0.12.0
0.26.0
0.25.2
0.25.1
0.25.0
0.24.0
0.23.0
0.22.0
0.21.4
0.21.3
0.21.2
0.21.1
0.21.0
0.20.0
0.19.1
0.19.0
0.18.0
0.17.0
0.16.0
0.15.2
0.15.1
0.15.0
0.14.0
0.13.0
0.12.0
0.11.1
0.11.0
0.10.1
0.10.0
0.9.1
0.9.0
0.8.0
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.0
0.5.0
0.4.1
0.4.0
0.3.0
0.2.1
0.2.0
0.1.3
0.1.2
0.1.1
0.1.0
Extend Commanded package
Current section
Files
Jump to
Current section
Files
lib/one_piece/commanded/command.ex
defmodule OnePiece.Commanded.Command do
@moduledoc """
Defines a module as a "Command". For more information about commands, please read the following:
- [CQRS pattern](https://docs.microsoft.com/en-us/azure/architecture/patterns/cqrs)
"""
alias OnePiece.Commanded.Command
alias OnePiece.Commanded.Entity
alias OnePiece.Commanded.Helpers
@type t :: struct()
@doc """
Converts the module into an `Ecto.Schema`, and derive from `Jason.Encoder`.
## Usage
defmodule MyCommand do
use OnePiece.Commanded.Command, aggregate_identifier: :id
embedded_schema do
# ...
end
end
"""
@spec __using__(opts :: [aggregate_identifier: atom()]) :: any()
defmacro __using__(opts \\ []) do
unless Keyword.has_key?(opts, :aggregate_identifier) do
raise ArgumentError, "missing :aggregate_identifier key"
end
aggregate_identifier = Keyword.fetch!(opts, :aggregate_identifier)
quote do
use Ecto.Schema
@typedoc """
The key used to identify the aggregate.
"""
@type aggregate_identifier_key :: unquote(aggregate_identifier)
@aggregate_identifier_key unquote(aggregate_identifier)
@primary_key {@aggregate_identifier_key, :string, autogenerate: false}
@derive Jason.Encoder
@doc """
Creates a new `t:t/0` command.
"""
@spec new(attrs :: map()) :: struct()
def new(attrs) do
Helpers.struct_from(attrs, __MODULE__)
end
@doc """
Returns the aggregate identifier key.
"""
@spec aggregate_identifier :: aggregate_identifier_key()
def aggregate_identifier do
@aggregate_identifier_key
end
@doc """
Put the `value` into `t:t/0` aggregate identifier key.
"""
@spec put_aggregate_id(command :: Command.t(), Entity.identity()) :: Command.t()
def put_aggregate_id(command, value) do
Map.put(command, @aggregate_identifier_key, value)
end
end
end
end