Skip to content

Commit c75770a

Browse files
committed
Adding wallet version based on aggregates
1 parent e52768d commit c75770a

File tree

2 files changed

+38
-18
lines changed

2 files changed

+38
-18
lines changed

fullstack/lib/fullstack/application.ex

+2-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ defmodule Fullstack.Application do
2323
Fullstack.Servers.OperationsSupervisor,
2424
Fullstack.Services.Counters,
2525
Fullstack.Servers.Generators.Transactions,
26-
{Registry, [keys: :unique, name: :wallet_projectors]}
26+
{Registry, [keys: :unique, name: :wallet_projectors]},
27+
{Registry, [keys: :unique, name: Fullstack.Wallet.Aggregate.WalletAggregators]}
2728
] ++ prod_child()
2829

2930
# See https://hexdocs.pm/elixir/Supervisor.html

fullstack/lib/fullstack/wallet/WalletAggregator.ex

+36-17
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
defmodule Fullstack.Wallet.Aggregate.WalletProjector do
1+
defmodule Fullstack.Wallet.Aggregate.WalletAggregator do
22
use GenServer
33
require Logger
4+
@registry Fullstack.Wallet.Aggregate.WalletAggregators
45

5-
@registry :wallet_projectors
66
defstruct [:customer_id, :value, event_type: :amount_deposited]
77

88
def start_link(customer_id) do
@@ -20,7 +20,7 @@ defmodule Fullstack.Wallet.Aggregate.WalletProjector do
2020
apply_event(pid, event)
2121

2222
_ ->
23-
Logger.debug("Attempt to apply event to non-existent account, starting projector")
23+
Logger.debug("Attempt to apply event to non-existent account, starting aggregator")
2424
{:ok, pid} = start_link(account)
2525
apply_event(pid, event)
2626
end
@@ -30,14 +30,22 @@ defmodule Fullstack.Wallet.Aggregate.WalletProjector do
3030
GenServer.cast(pid, {:handle_event, event})
3131
end
3232

33-
def get_balance(pid) do
34-
GenServer.call(pid, :get_balance)
33+
def get_balance(customer_id) when is_binary(customer_id) do
34+
customer_id
35+
|> lookup_aggregator
36+
|> GenServer.call(:get_balance)
3537
end
3638

37-
def lookup_balance(customer_id) when is_binary(customer_id) do
39+
def get_history(customer_id) when is_binary(customer_id) do
40+
customer_id
41+
|> lookup_aggregator
42+
|> GenServer.call(:get_history)
43+
end
44+
45+
defp lookup_aggregator(customer_id) when is_binary(customer_id) do
3846
with [{pid, _}] <-
3947
Registry.lookup(@registry, customer_id) do
40-
{:ok, get_balance(pid)}
48+
pid
4149
else
4250
_ ->
4351
{:error, :unknown_account}
@@ -46,7 +54,7 @@ defmodule Fullstack.Wallet.Aggregate.WalletProjector do
4654

4755
@impl true
4856
def init(customer_id) do
49-
{:ok, %{balance: 0, account_number: customer_id}}
57+
{:ok, %{balance: 0, account_number: customer_id, commands: []}}
5058
end
5159

5260
@impl true
@@ -55,31 +63,42 @@ defmodule Fullstack.Wallet.Aggregate.WalletProjector do
5563
end
5664

5765
def handle_event(
58-
%{balance: bal} = s,
59-
%{event_type: :amount_withdrawn, value: v}
66+
%{balance: _bal} = s,
67+
%{event_type: :amount_withdrawn, value: v} = evt
6068
) do
61-
%{s | balance: bal - v}
69+
s
70+
|> Map.update(:balance, 0, &(&1 - v))
71+
|> Map.update(:commands, [], &[evt | &1])
6272
end
6373

6474
def handle_event(
65-
%{balance: bal} = s,
66-
%{event_type: :amount_deposited, value: v}
75+
%{balance: _bal} = s,
76+
%{event_type: :amount_deposited, value: v} = evt
6777
) do
68-
%{s | balance: bal + v}
78+
s
79+
|> Map.update(:balance, 0, &(&1 + v))
80+
|> Map.update(:commands, [], &[evt | &1])
6981
end
7082

7183
def handle_event(
72-
%{balance: bal} = s,
73-
%{event_type: :fee_applied, value: v}
84+
%{balance: _bal} = s,
85+
%{event_type: :fee_applied, value: v} = evt
7486
) do
75-
%{s | balance: bal - v}
87+
s
88+
|> Map.update(:balance, 0, &(&1 - v))
89+
|> Map.update(:commands, [], &[evt | &1])
7690
end
7791

7892
@impl true
7993
def handle_call(:get_balance, _from, state) do
8094
{:reply, state.balance, state}
8195
end
8296

97+
@impl true
98+
def handle_call(:get_history, _from, state) do
99+
{:reply, state.commands, state}
100+
end
101+
83102
defp register_via(customer_id) do
84103
{:via, Registry, {@registry, customer_id}}
85104
end

0 commit comments

Comments
 (0)