Skip to content
This repository was archived by the owner on Jun 11, 2023. It is now read-only.

Commit b07c676

Browse files
author
Marcelo Amancio de Lima Santos
committed
Add AccountClose process
1 parent b70c5a1 commit b07c676

6 files changed

Lines changed: 159 additions & 20 deletions

File tree

lib/event/dispatcher.ex

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,10 @@ defmodule Helix.Event.Dispatcher do
315315
BankHandler.Bank.Account,
316316
:account_create_processed
317317

318+
event BankEvent.AccountClose.Processed,
319+
BankHandler.Bank.Account,
320+
:account_close_processed
321+
318322
event BankEvent.Bank.Account.Password.Revealed,
319323
EntityHandler.Database,
320324
:bank_password_revealed

lib/universe/bank/action/flow/bank_account.ex

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ defmodule Helix.Universe.Bank.Action.Flow.BankAccount do
1313
alias Helix.Universe.Bank.Model.BankToken
1414
alias Helix.Universe.Bank.Query.Bank, as: BankQuery
1515

16+
alias Helix.Universe.Bank.Process.Bank.Account.AccountCreate,
17+
as: BankAccountCreateProcess
1618
alias Helix.Universe.Bank.Process.Bank.Account.RevealPassword,
1719
as: BankAccountRevealPasswordProcess
1820
alias Helix.Universe.Bank.Process.Bank.Account.ChangePassword,
@@ -55,9 +57,9 @@ defmodule Helix.Universe.Bank.Action.Flow.BankAccount do
5557

5658
@spec open(Server.t, Account.id, Server.t, relay) ::
5759
{:ok, Process.t}
58-
| BankAccountAccountChangeProcess.executable_error
60+
| BankAccountChangeProcess.executable_error
5961
@doc """
60-
Opens a new BankAccount to given Account.id
62+
Starts the `bank_account_create` process.
6163
"""
6264
def open(gateway, account_id, atm, relay) do
6365
entity_id = Entity.ID.cast!(to_string(account_id.id))
@@ -67,23 +69,22 @@ defmodule Helix.Universe.Bank.Action.Flow.BankAccount do
6769
source_entity_id: entity_id
6870
}
6971

70-
BankAccountAccountCreateProcess.execute(gateway, atm, %{}, meta, relay)
72+
BankAccountCreateProcess.execute(gateway, atm, %{}, meta, relay)
7173
end
7274

7375
@spec close(BankAccount.t) ::
74-
:ok
75-
| {:error, {:bank_account, :not_found}}
76-
| {:error, {:bank_account, :not_empty}}
77-
def close(bank_account) do
78-
flowing do
79-
with \
80-
true <- not is_nil(bank_account),
81-
{:ok, events} <- BankAction.close_account(bank_account),
82-
on_success(fn -> Event.emit(events) end)
83-
do
84-
:ok
85-
end
86-
end
76+
{:ok, Process.t}
77+
| BankAccountCloseProcess.executable_error
78+
@doc """
79+
Starts the `bank_account_close` process.
80+
"""
81+
def close(gateway, bank_account, atm, relay) do
82+
meta = %{
83+
src_atm_id: bank_account.server_id,
84+
src_account_number: bank_account.account_number
85+
}
86+
87+
BankAccountCloseProcess.execute(gateway, atm, %{}, meta, relay)
8788
end
8889

8990
@spec change_password(BankAccount.t, Server.t, Server.t, relay) ::
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
defmodule Helix.Universe.Bank.Event.AccountClose do
2+
3+
import Helix.Event
4+
5+
event Processed do
6+
7+
alias Helix.Process.Model.Process
8+
alias Helix.Universe.Bank.Model.ATM
9+
alias Helix.Universe.Bank.Model.BankAccount
10+
alias Helix.Universe.Bank.Process.Bank.Account.AccountClose,
11+
as: AccountCloseProcess
12+
13+
@type t :: %__MODULE__{
14+
atm_id: ATM.id,
15+
account_number: BankAccount.account
16+
}
17+
18+
event_struct [:atm_id, :account_number]
19+
20+
@spec new(ATM.id, BankAccount.account) :: t
21+
22+
def new(atm_id, account_number) do
23+
%__MODULE__{
24+
atm_id: atm_id,
25+
account_number: account_number
26+
}
27+
end
28+
29+
@spec new(Process.t, AccountCloseProcess.t) :: t
30+
def new(process = %Process{}, data = %AccountCloseProcess{}) do
31+
%__MODULE__{
32+
atm_id: process.src_atm_id,
33+
account_number: process.src_acc_number
34+
}
35+
end
36+
end

lib/universe/bank/event/handler/bank/account.ex

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,19 @@ defmodule Helix.Universe.Bank.Event.Handler.Bank.Account do
3232
end
3333
end
3434

35+
def account_close_processed(event = %AccountCloseProcessedEvent{}) do
36+
flowing
37+
with \
38+
bank_account = BankQuery.fetch_account(event.atm_id, event.account_number)
39+
true <- not is_nil(bank_account),
40+
{:ok, events} <- BankAction.close_account(bank_account),
41+
on_success(fn -> Event.emit(events) end)
42+
do
43+
:ok
44+
end
45+
end
46+
end
47+
3548
@doc """
3649
Handles the conclusion of a `PasswordRevealProcess`, described at
3750
`BankAccountFlow`. Note that actually *displaying* the password to the user
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import Helix.Process
2+
3+
process Helix.Universe.Bank.Process.Bank.Account.AccountClose do
4+
5+
alias Helix.Universe.Bank.Model.ATM
6+
alias Helix.Universe.Bank.Model.BankAccount
7+
8+
process_struct [:account]
9+
10+
@process_type :bank_close_account
11+
12+
@type t :: %__MODULE__{}
13+
14+
@type creation_params :: %{}
15+
16+
@type objective :: %{cpu: resource_usage}
17+
18+
@type resource :: %{
19+
objective: objective,
20+
static: map,
21+
l_dynamic: [:cpu],
22+
r_dynamic: []
23+
}
24+
25+
@type resources_params :: %{}
26+
27+
@spec new(creation_params) :: t
28+
def new(%{}) do
29+
%__MODULE__{}
30+
end
31+
32+
@spec resources(resources_params) :: resources
33+
def resources(params = %{})
34+
do: get_resources params
35+
36+
processable do
37+
38+
alias Helix.Universe.Bank.Event.AccountClose.Processed,
39+
as: AccountCloseProcessedEvent
40+
41+
on_completion(process, data) do
42+
event = AccountCloseProcessedEvent.new(process, data)
43+
44+
{:delete, [event]}
45+
end
46+
47+
resourceable do
48+
alias Heli.Universe.Bank.Process.Bank.Account.AccountClose,
49+
as: AccountCloseProcess
50+
51+
@type params :: AccountCloseProcess.resources_params
52+
@type factors :: term
53+
54+
# TODO proper balance
55+
get_factors(%{}) do end
56+
57+
cpu(_) do
58+
59+
end
60+
61+
dynamic do
62+
[:cpu]
63+
end
64+
end
65+
66+
executable do
67+
68+
alias Helix.Universe.Bank.Process.Bank.Account.AccountClose,
69+
as: AccountCloseProcess
70+
71+
@type params :: AccountCloseProcess.creation_params
72+
73+
@type meta ::
74+
%{
75+
optional(atom) => term
76+
}
77+
78+
resources(_, _, %{}, _) do
79+
%{}
80+
end
81+
end
82+
end

lib/universe/bank/websocket/channel/requests/close_account.ex

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ request Helix.Universe.Bank.Websocket.Requests.CloseAccount do
77
88
It Returs :ok or :error
99
"""
10+
alias Helix.Server.Query.Server, as: ServerQuery
1011
alias Helix.Universe.Bank.Henforcer.Bank, as: BankHenforcer
1112
alias Helix.Universe.Bank.Public.Bank, as: BankPublic
1213
alias Helix.Universe.Bank.Query.Bank, as: BankQuery
@@ -36,11 +37,13 @@ request Helix.Universe.Bank.Websocket.Requests.CloseAccount do
3637
atm_id = socket.assigns.atm_id
3738
account_number = socket.assigns.account_number
3839
bank_account = BankQuery.fetch_account(atm_id, account_number)
39-
close_account = BankPublic.close_account(bank_account)
40+
atm = ServerQuery.fetch(atm_id)
41+
relay = request.relay
42+
process = BankPublic.close_account(gateway, bank_account, atm, relay)
4043

41-
case close_account do
42-
:ok ->
43-
reply_ok(request)
44+
case process do
45+
{:ok, process} ->
46+
update_meta(request, %{process: process}, reply: true)
4447
{:error, reason} ->
4548
reply_error(request, reason)
4649
end

0 commit comments

Comments
 (0)