Packages
commanded
0.16.0-rc.0
1.4.10
1.4.9
1.4.8
1.4.7
1.4.6
1.4.3
1.4.2
1.4.1
1.4.0
1.4.0-rc.0
1.3.1
1.3.0
1.2.0
1.1.1
1.1.0
1.0.1
1.0.0
1.0.0-rc.1
1.0.0-rc.0
0.19.1
0.19.0
0.18.1
0.18.0
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.0
0.16.0-rc.1
0.16.0-rc.0
0.15.1
0.15.0
0.14.0
0.14.0-rc.0
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.5
0.8.4
0.8.3
0.8.1
0.8.0
0.7.1
0.6.2
0.6.1
0.6.0
0.4.0
0.3.1
0.3.0
0.2.1
0.2.0
0.1.0
Use Commanded to build your own Elixir applications following the CQRS/ES pattern.
Current section
Files
Jump to
Current section
Files
test/process_managers/support/example_aggregate.ex
defmodule Commanded.ProcessManagers.ExampleAggregate do
@moduledoc false
alias Commanded.ProcessManagers.ExampleAggregate
defstruct [
uuid: nil,
state: nil,
items: [],
]
defmodule Commands do
defmodule Start, do: defstruct [:aggregate_uuid]
defmodule Publish, do: defstruct [:aggregate_uuid, :interesting, :uninteresting]
defmodule Stop, do: defstruct [:aggregate_uuid]
defmodule Error, do: defstruct [:aggregate_uuid]
end
defmodule Events do
defmodule Started, do: defstruct [:aggregate_uuid]
defmodule Interested, do: defstruct [:aggregate_uuid, :index]
defmodule Uninterested, do: defstruct [:aggregate_uuid, :index]
defmodule Stopped, do: defstruct [:aggregate_uuid]
defmodule Errored, do: defstruct [:aggregate_uuid]
end
def start(%ExampleAggregate{}, aggregate_uuid) do
%Events.Started{aggregate_uuid: aggregate_uuid}
end
def publish(%ExampleAggregate{uuid: aggregate_uuid}, interesting, uninteresting) do
Enum.concat(
publish_interesting(aggregate_uuid, interesting, 1),
publish_uninteresting(aggregate_uuid, uninteresting, 1)
)
end
def stop(%ExampleAggregate{uuid: aggregate_uuid}) do
%Events.Stopped{aggregate_uuid: aggregate_uuid}
end
def error(%ExampleAggregate{uuid: aggregate_uuid}) do
%Events.Errored{aggregate_uuid: aggregate_uuid}
end
defp publish_interesting(_aggregate_uuid, 0, _index), do: []
defp publish_interesting(aggregate_uuid, interesting, index) do
[
%Events.Interested{aggregate_uuid: aggregate_uuid, index: index},
] ++ publish_interesting(aggregate_uuid, interesting - 1, index + 1)
end
defp publish_uninteresting(_aggregate_uuid, 0, _index), do: []
defp publish_uninteresting(aggregate_uuid, interesting, index) do
[
%Events.Uninterested{aggregate_uuid: aggregate_uuid, index: index},
] ++ publish_uninteresting(aggregate_uuid, interesting - 1, index + 1)
end
# state mutatators
def apply(%ExampleAggregate{} = state, %Events.Started{aggregate_uuid: aggregate_uuid}), do: %ExampleAggregate{state | uuid: aggregate_uuid, state: :started}
def apply(%ExampleAggregate{items: items} = state, %Events.Interested{index: index}), do: %ExampleAggregate{state | items: items ++ [index]}
def apply(%ExampleAggregate{} = state, %Events.Errored{}), do: %ExampleAggregate{state | state: :errored}
def apply(%ExampleAggregate{} = state, %Events.Uninterested{}), do: state
def apply(%ExampleAggregate{} = state, %Events.Stopped{}), do: %ExampleAggregate{state | state: :stopped}
end