Skip to content

Commit 7b28a62

Browse files
committed
Changes
1 parent 4b3bc8a commit 7b28a62

7 files changed

Lines changed: 459 additions & 78 deletions

File tree

.env

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22
# You SHOULD specify point releases here so that build time and run time Erlang/OTPs
33
# are the same. See: https://github.com/erlware/relx/pull/902
44
SERVICE_NAME=hellgate
5-
OTP_VERSION=27.1.2
5+
OTP_VERSION=27.3.4
66
REBAR_VERSION=3.24
77
THRIFT_VERSION=0.14.2.3

.tool-versions

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
rebar 3.24.0
2-
erlang 27.1.2
2+
erlang 27.3.4

apps/hellgate/src/hg_customer_client.erl

Lines changed: 93 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,18 @@
33
-include_lib("damsel/include/dmsl_customer_thrift.hrl").
44
-include_lib("damsel/include/dmsl_domain_thrift.hrl").
55

6+
%% BankCard operations
7+
-export([find_or_create_bank_card/2]).
8+
-export([get_recurrent_tokens_by_card/2]).
9+
-export([save_recurrent_token_by_card/3]).
10+
-export([tokens_to_map/1]).
11+
12+
%% Customer operations
613
-export([create_customer/1]).
714
-export([get_by_parent_payment/2]).
815
-export([get_recurrent_tokens/2]).
9-
-export([tokens_to_map/1]).
1016
-export([add_payment/3]).
11-
-export([save_recurrent_token/4]).
17+
-export([link_bank_card/2]).
1218

1319
-export_type([cascade_tokens/0]).
1420

@@ -19,7 +25,62 @@
1925
-type recurrent_token() :: dmsl_customer_thrift:'RecurrentToken'().
2026
-type cascade_tokens() :: #{provider_terminal_key() => token()}.
2127

22-
%%
28+
%% BankCard operations
29+
30+
-spec find_or_create_bank_card(dmsl_domain_thrift:'PartyConfigRef'(), token()) ->
31+
dmsl_customer_thrift:'BankCard'().
32+
find_or_create_bank_card(PartyConfigRef, BankCardToken) ->
33+
case find_bank_card(PartyConfigRef, BankCardToken) of
34+
{ok, BankCard} ->
35+
BankCard;
36+
{exception, #customer_BankCardNotFound{}} ->
37+
{ok, BankCard} = call(
38+
bank_card_storage,
39+
'Create',
40+
{PartyConfigRef, #customer_BankCardParams{bank_card_token = BankCardToken}}
41+
),
42+
BankCard
43+
end.
44+
45+
-spec get_recurrent_tokens_by_card(dmsl_domain_thrift:'PartyConfigRef'(), token()) ->
46+
[recurrent_token()].
47+
get_recurrent_tokens_by_card(PartyConfigRef, BankCardToken) ->
48+
case find_bank_card(PartyConfigRef, BankCardToken) of
49+
{ok, #customer_BankCard{id = BankCardID}} ->
50+
{ok, Tokens} = call(bank_card_storage, 'GetRecurrentTokens', {BankCardID}),
51+
Tokens;
52+
{exception, #customer_BankCardNotFound{}} ->
53+
[]
54+
end.
55+
56+
-spec save_recurrent_token_by_card(
57+
dmsl_domain_thrift:'PartyConfigRef'(),
58+
token(),
59+
{dmsl_domain_thrift:'PaymentRoute'(), token()}
60+
) -> ok.
61+
save_recurrent_token_by_card(
62+
PartyConfigRef,
63+
BankCardToken,
64+
{#domain_PaymentRoute{provider = ProviderRef, terminal = TerminalRef}, RecToken}
65+
) ->
66+
#customer_BankCard{id = BankCardID} = find_or_create_bank_card(PartyConfigRef, BankCardToken),
67+
{ok, _} = call(
68+
bank_card_storage,
69+
'AddRecurrentToken',
70+
{#customer_RecurrentTokenParams{
71+
bank_card_id = BankCardID,
72+
provider_ref = ProviderRef,
73+
terminal_ref = TerminalRef,
74+
token = RecToken
75+
}}
76+
),
77+
ok.
78+
79+
-spec tokens_to_map([recurrent_token()]) -> cascade_tokens().
80+
tokens_to_map(Tokens) ->
81+
lists:foldl(fun token_to_map_entry/2, #{}, Tokens).
82+
83+
%% Customer operations
2384

2485
-spec create_customer(dmsl_domain_thrift:'PartyConfigRef'()) -> dmsl_customer_thrift:'Customer'().
2586
create_customer(PartyConfigRef) ->
@@ -42,45 +103,46 @@ get_recurrent_tokens(InvoiceID, PaymentID) ->
42103
[]
43104
end.
44105

45-
-spec tokens_to_map([recurrent_token()]) -> cascade_tokens().
46-
tokens_to_map(Tokens) ->
47-
lists:foldl(fun token_to_map_entry/2, #{}, Tokens).
48-
49106
-spec add_payment(dmsl_customer_thrift:'CustomerID'(), invoice_id(), payment_id()) -> ok.
50107
add_payment(CustomerID, InvoiceID, PaymentID) ->
51108
{ok, ok} = call(customer_management, 'AddPayment', {CustomerID, InvoiceID, PaymentID}),
52109
ok.
53110

54-
-spec save_recurrent_token(
55-
dmsl_customer_thrift:'CustomerID'(),
56-
token(),
57-
dmsl_domain_thrift:'PaymentRoute'(),
58-
token()
59-
) -> ok.
60-
save_recurrent_token(
61-
CustomerID,
62-
BankCardToken,
63-
#domain_PaymentRoute{provider = ProviderRef, terminal = TerminalRef},
64-
RecToken
65-
) ->
66-
{ok, #customer_BankCard{id = BankCardID}} = call(
111+
-spec link_bank_card(dmsl_customer_thrift:'CustomerID'(), token()) -> ok.
112+
link_bank_card(CustomerID, BankCardToken) ->
113+
{ok, _} = call(
67114
customer_management,
68115
'AddBankCard',
69116
{CustomerID, #customer_BankCardParams{bank_card_token = BankCardToken}}
70117
),
71-
{ok, _} = call(
72-
bank_card_storage,
73-
'AddRecurrentToken',
74-
{#customer_RecurrentTokenParams{
75-
bank_card_id = BankCardID,
76-
provider_ref = ProviderRef,
77-
terminal_ref = TerminalRef,
78-
token = RecToken
79-
}}
80-
),
81118
ok.
82119

83-
%%
120+
%% Internal
121+
122+
find_bank_card(PartyConfigRef, BankCardToken) ->
123+
SearchParams = #customer_BankCardSearchParams{
124+
bank_card_token = BankCardToken,
125+
party_ref = PartyConfigRef
126+
},
127+
call(bank_card_storage, 'Find', {SearchParams}).
128+
129+
collect_bank_card_tokens(#customer_BankCardRef{id = BankCardID}) ->
130+
{ok, Tokens} = call(bank_card_storage, 'GetRecurrentTokens', {BankCardID}),
131+
Tokens.
132+
133+
token_to_map_entry(
134+
#customer_RecurrentToken{
135+
provider_ref = ProviderRef,
136+
terminal_ref = TerminalRef,
137+
token = Token
138+
},
139+
Acc
140+
) ->
141+
Key = #customer_ProviderTerminalKey{
142+
provider_ref = ProviderRef,
143+
terminal_ref = TerminalRef
144+
},
145+
Acc#{Key => Token}.
84146

85147
call(ServiceName, Function, Args) ->
86148
Service = hg_proto:get_service(ServiceName),
@@ -102,21 +164,3 @@ call(ServiceName, Function, Args) ->
102164
},
103165
WoodyContext
104166
).
105-
106-
collect_bank_card_tokens(#customer_BankCardRef{id = BankCardID}) ->
107-
{ok, Tokens} = call(bank_card_storage, 'GetRecurrentTokens', {BankCardID}),
108-
Tokens.
109-
110-
token_to_map_entry(
111-
#customer_RecurrentToken{
112-
provider_ref = ProviderRef,
113-
terminal_ref = TerminalRef,
114-
token = Token
115-
},
116-
Acc
117-
) ->
118-
Key = #customer_ProviderTerminalKey{
119-
provider_ref = ProviderRef,
120-
terminal_ref = TerminalRef
121-
},
122-
Acc#{Key => Token}.

apps/hellgate/src/hg_invoice_payment.erl

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -445,13 +445,16 @@ init_(PaymentID, Params, #{timestamp := CreatedAt} = Opts) ->
445445
customer_id = InheritedCustomerID
446446
},
447447
CascadeTokenEvents =
448-
case {InheritedCustomerID, PayerParams} of
449-
{CID, {recurrent, #payproc_RecurrentPayerParams{recurrent_parent = ?recurrent_parent(InvID, PmtID)}}} when
450-
CID =/= undefined
451-
->
452-
case hg_customer_client:get_recurrent_tokens(InvID, PmtID) of
453-
[_ | _] = Tokens -> [?cascade_tokens_loaded(Tokens)];
454-
[] -> []
448+
case PayerParams of
449+
{recurrent, #payproc_RecurrentPayerParams{recurrent_parent = ?recurrent_parent(_InvID, _PmtID)}} ->
450+
case get_bank_card_token(Payer) of
451+
undefined ->
452+
[];
453+
BCT ->
454+
case hg_customer_client:get_recurrent_tokens_by_card(PartyConfigRef, BCT) of
455+
[_ | _] = Tokens -> [?cascade_tokens_loaded(Tokens)];
456+
[] -> []
457+
end
455458
end;
456459
_ ->
457460
[]
@@ -2479,16 +2482,37 @@ maybe_save_recurrent_token_to_customer(
24792482
) when CustomerID =/= undefined ->
24802483
InvoiceID = get_invoice_id(get_invoice(get_opts(St))),
24812484
hg_customer_client:add_payment(CustomerID, InvoiceID, PaymentID),
2482-
case {MakeRecurrent, RecToken, get_bank_card_token(Payer)} of
2483-
{true, RT, BCT} when RT =/= undefined, BCT =/= undefined ->
2485+
maybe_save_recurrent_token_to_bankcard(MakeRecurrent, RecToken, Payer, St),
2486+
maybe_link_bankcard_to_customer(CustomerID, Payer);
2487+
maybe_save_recurrent_token_to_customer(
2488+
#st{
2489+
payment = #domain_InvoicePayment{
2490+
make_recurrent = MakeRecurrent,
2491+
payer = Payer
2492+
},
2493+
recurrent_token = RecToken
2494+
} = St
2495+
) ->
2496+
maybe_save_recurrent_token_to_bankcard(MakeRecurrent, RecToken, Payer, St).
2497+
2498+
maybe_save_recurrent_token_to_bankcard(true, RecToken, Payer, St) when RecToken =/= undefined ->
2499+
case get_bank_card_token(Payer) of
2500+
undefined ->
2501+
ok;
2502+
BCT ->
2503+
PartyConfigRef = get_party_config_ref(get_opts(St)),
24842504
Route = get_route(St),
2485-
hg_customer_client:save_recurrent_token(CustomerID, BCT, Route, RT);
2486-
_ ->
2487-
ok
2505+
hg_customer_client:save_recurrent_token_by_card(PartyConfigRef, BCT, {Route, RecToken})
24882506
end;
2489-
maybe_save_recurrent_token_to_customer(_St) ->
2507+
maybe_save_recurrent_token_to_bankcard(_, _, _, _) ->
24902508
ok.
24912509

2510+
maybe_link_bankcard_to_customer(CustomerID, Payer) ->
2511+
case get_bank_card_token(Payer) of
2512+
undefined -> ok;
2513+
BCT -> hg_customer_client:link_bank_card(CustomerID, BCT)
2514+
end.
2515+
24922516
get_bank_card_token(
24932517
?payment_resource_payer(
24942518
#domain_DisposablePaymentResource{

0 commit comments

Comments
 (0)