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

Commit 7962580

Browse files
author
Marcelo Amancio de Lima Santos
committed
Add process
1 parent 1a6bd56 commit 7962580

7 files changed

Lines changed: 154 additions & 19 deletions

File tree

lib/event/dispatcher.ex

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,7 @@ defmodule Helix.Event.Dispatcher do
278278
event BankEvent.Bank.Account.Token.Acquired
279279
event BankEvent.Bank.Transfer.Processed
280280
event BankEvent.Bank.Transfer.Aborted
281+
event BankEvent.AccountCreate.Processed
281282
event BankEvent.RevealPassword.Processed
282283
event BankEvent.ChangePassword.Processed
283284

@@ -310,6 +311,10 @@ defmodule Helix.Event.Dispatcher do
310311
BankHandler.Bank.Account,
311312
:password_change_processed
312313

314+
event BankEvent.AccountCreate.Processed,
315+
BankHandler.Bank.Account,
316+
:account_create_processed
317+
313318
event BankEvent.Bank.Account.Password.Revealed,
314319
EntityHandler.Database,
315320
:bank_password_revealed
@@ -322,4 +327,5 @@ defmodule Helix.Event.Dispatcher do
322327
EntityHandler.Database,
323328
:bank_account_login
324329

330+
325331
end

lib/process/model/process.ex

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ defmodule Helix.Process.Model.Process do
7979
| :install_virus
8080
| :bank_change_password
8181
| :bank_reveal_password
82+
| :bank_account_create
8283

8384
@typedoc """
8485
List of signals a process may receive during its lifetime.

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

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -53,24 +53,21 @@ defmodule Helix.Universe.Bank.Action.Flow.BankAccount do
5353
BankAccountRevealPasswordProcess.execute(gateway, atm, params, meta, relay)
5454
end
5555

56-
@spec open(Account.id, ATM.id) ::
57-
{:ok, BankAccount.t}
58-
| {:error, :internal}
56+
@spec open(Server.t, Account.id, Server.t, relay) ::
57+
{:ok, Process.t}
58+
| BankAccountAccountChangeProcess.executable_error
5959
@doc """
6060
Opens a new BankAccount to given Account.id
6161
"""
62-
def open(account_id, atm_id) do
63-
flowing do
64-
with \
65-
{:ok, bank_acc, events} <- BankAction.open_account(account_id, atm_id),
66-
on_success(fn -> Event.emit(events) end)
67-
do
68-
{:ok, bank_acc}
69-
else
70-
_ ->
71-
{:error, :internal}
72-
end
73-
end
62+
def open(gateway, account_id, atm, relay) do
63+
entity_id = Entity.ID.cast!(to_string(account_id.id))
64+
65+
meta = %{
66+
src_atm_id: atm.server_id,
67+
source_entity_id: entity_id
68+
}
69+
70+
BankAccountAccountCreateProcess.execute(gateway, atm, %{}, meta, relay)
7471
end
7572

7673
@spec close(BankAccount.t) ::
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
defmodule Helix.Universe.Bank.Event.AccountCreate 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.Process.Bank.Account.AccountCreate,
10+
as: AccountCreateProcess
11+
12+
@type t :: %__MODULE__{
13+
atm_id: ATM.id
14+
}
15+
16+
event_struct [:atm_id]
17+
18+
@spec new(ATM.id) :: t
19+
def new(atm_id) do
20+
%__MODULE__{
21+
atm_id: atm_id
22+
}
23+
end
24+
25+
@spec new(Process.t, AccountCreateProcess.t) :: t
26+
def new(process = %Process{}, data = %AccountCreateProcess{}) do
27+
%__MODULE__{
28+
atm_id: process.src_atm_id
29+
}
30+
end
31+
end

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,27 @@ defmodule Helix.Universe.Bank.Event.Handler.Bank.Account do
1111
as: BankAccountRemovedEvent
1212
alias Helix.Universe.Bank.Event.Bank.Account.Updated,
1313
as: BankAccountUpdatedEvent
14+
alias Helix.Universe.Bank.Event.AccountCreate.Processed,
15+
as: AccountCreateProcessedEvent
1416
alias Helix.Universe.Bank.Event.RevealPassword.Processed,
1517
as: RevealPasswordProcessedEvent
1618
alias Helix.Universe.Bank.Event.ChangePassword.Processed,
1719
as: ChangePasswordProcessedEvent
1820
alias Helix.Universe.Bank.Event.Bank.Account.Password.Changed,
1921
as: BankPasswordChangedEvent
2022

23+
def account_create_processed(event = %AccountCreateProcessedEvent{}) do
24+
flowing do
25+
with \
26+
{:ok, _bank_account, events} <-
27+
BankAction.open_account(event.requester, event.atm),
28+
on_success(fn -> Event.emit(events, from: event) end)
29+
do
30+
:ok
31+
end
32+
end
33+
end
34+
2135
@doc """
2236
Handles the conclusion of a `PasswordRevealProcess`, described at
2337
`BankAccountFlow`. Note that actually *displaying* the password to the user
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
import Helix.Process
2+
3+
process Helix.Universe.Bank.Process.Bank.Account.AccountCreate do
4+
5+
alias Helix.Universe.Bank.Model.ATM
6+
alias Helix.Universe.Bank.Model.BankAccount
7+
8+
process_struct [:atm_id]
9+
10+
@process_type :bank_create_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(resource_params) :: resources
33+
def resources(params = %{}),
34+
do: get_resources params
35+
36+
processable do
37+
38+
alias Helix.Universe.Bank.Event.Bank.Account.AccountCreate.Processed,
39+
as: AccountCreateProcess
40+
41+
on_completion(process, data) do
42+
event = AccountCreateProcess.new(process, data)
43+
44+
{:delete, [event]}
45+
end
46+
end
47+
48+
resourceable do
49+
50+
alias Helix.Universe.Bank.Process.Bank.Account.AccountCreate,
51+
as: AccountCreateProcess
52+
53+
@type params :: AccountCreateProcess.resources_params
54+
@type factors :: term
55+
56+
# TODO proper balance
57+
get_factors(%{}) do end
58+
59+
cpu(_) do
60+
1
61+
end
62+
63+
dynamic do
64+
[:cpu]
65+
end
66+
67+
executable do
68+
69+
alias Helix.Universe.Bank.Process.Bank.Account.AccountCreate,
70+
as: AccountCreateProcess
71+
72+
@type params :: AccountCreateProcess.creation_params
73+
74+
@type meta ::
75+
${
76+
optional(atom) => term
77+
}
78+
79+
resources(_, _, %{}) do
80+
%{}
81+
end
82+
end
83+
end
84+
end

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,13 @@ request Helix.Universe.Bank.Websocket.Requests.CreateAccount do
5555
def handle_request(request, socket) do
5656
atm_id = request.meta.atm_id
5757
account_id = socket.assigns.account_id
58+
gateway = ServerQuery.fetch(socket.assigns.gateway.server_id)
59+
relay = request.relay
5860

59-
bank_account = BankPublic.open_account(account_id, atm_id)
60-
case bank_account do
61-
{:ok, bank_account} ->
62-
update_meta(request, %{bank_account: bank_account}, reply: true)
61+
process = BankPublic.open_account(gateway, account_id, atm, relay)
62+
case process do
63+
{:ok, process} ->
64+
update_meta(request, %{process: process}, reply: true)
6365
{:error, reason} ->
6466
reply_error(request, reason)
6567
end

0 commit comments

Comments
 (0)