Skip to content

Commit 6ef5400

Browse files
authored
TD-250: Add crypto currency ref (#6)
* added currency ref * reverted lock * Revert "reverted lock" This reverts commit e588ce8. * changed branches to refs in swag deps * fixed format * removed cowboy_cors dep * removed cors lock * changed workflow version * added crypto wallet code decode test * removed unused deps
1 parent 44e699b commit 6ef5400

9 files changed

+50
-264
lines changed

.github/workflows/erlang-checks.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ jobs:
3030
run:
3131
name: Run checks
3232
needs: setup
33-
uses: valitydev/erlang-workflows/.github/workflows/[email protected].1
33+
uses: valitydev/erlang-workflows/.github/workflows/[email protected].3
3434
with:
3535
otp-version: ${{ needs.setup.outputs.otp-version }}
3636
rebar-version: ${{ needs.setup.outputs.rebar-version }}

rebar.config

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
{bender_client, {git, "https://github.com/valitydev/bender-client-erlang.git", {branch, "master"}}},
4141
{bender_proto, {git, "https://github.com/valitydev/bender-proto.git", {branch, "master"}}},
4242
{lechiffre, {git, "https://github.com/valitydev/lechiffre.git", {branch, "master"}}},
43-
{cowboy_cors, {git, "https://github.com/valitydev/cowboy_cors.git", {branch, master}}},
4443
{bouncer_proto, {git, "https://github.com/valitydev/bouncer-proto.git", {branch, "master"}}},
4544
{bouncer_client, {git, "https://github.com/valitydev/bouncer-client-erlang", {branch, "master"}}},
4645
{token_keeper_client, {git, "https://github.com/valitydev/token-keeper-client.git", {branch, master}}},
@@ -81,10 +80,8 @@
8180
{test, [
8281
{deps, [
8382
%% Libraries generated with swagger-codegen-erlang from valitydev/swag-wallets
84-
{swag_server_wallet,
85-
{git, "https://github.com/valitydev/swag-wallets", {branch, "release/erlang/wallet-server/v0"}}},
86-
{swag_client_wallet,
87-
{git, "https://github.com/valitydev/swag-wallets", {branch, "release/erlang/wallet-client/v0"}}},
83+
{swag_server_wallet, {git, "https://github.com/valitydev/swag-wallets", {ref, "6597281"}}},
84+
{swag_client_wallet, {git, "https://github.com/valitydev/swag-wallets", {ref, "a2846c8"}}},
8885
{meck, "0.9.2"}
8986
]},
9087
{cover_enabled, true},

rebar.lock

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,6 @@
2222
{ref,"5a87a37694e42b6592d3b4164ae54e0e87e24e18"}},
2323
1},
2424
{<<"cowboy">>,{pkg,<<"cowboy">>,<<"2.9.0">>},1},
25-
{<<"cowboy_access_log">>,
26-
{git,"https://github.com/valitydev/cowboy_access_log.git",
27-
{ref,"04da359e022cf05c5c93812504d5791d6bc97453"}},
28-
0},
29-
{<<"cowboy_cors">>,
30-
{git,"https://github.com/valitydev/cowboy_cors.git",
31-
{ref,"5a3b084fb8c5a4ff58e3c915a822d709d6023c3b"}},
32-
0},
3325
{<<"cowlib">>,{pkg,<<"cowlib">>,<<"2.11.0">>},2},
3426
{<<"damsel">>,
3527
{git,"https://github.com/valitydev/damsel.git",
@@ -43,18 +35,13 @@
4335
{git,"https://github.com/valitydev/dmt_core.git",
4436
{ref,"5a0ff399dee3fd606bb864dd0e27ddde539345e2"}},
4537
1},
46-
{<<"email_validator">>,{pkg,<<"email_validator">>,<<"1.1.0">>},1},
47-
{<<"erl_health">>,
48-
{git,"https://github.com/valitydev/erlang-health.git",
49-
{ref,"5958e2f35cd4d09f40685762b82b82f89b4d9333"}},
50-
0},
5138
{<<"file_storage_proto">>,
5239
{git,"https://github.com/valitydev/file-storage-proto.git",
5340
{ref,"d1055d3e09463d4c959042b38931c113326c88f2"}},
5441
0},
5542
{<<"fistful_proto">>,
5643
{git,"https://github.com/valitydev/fistful-proto.git",
57-
{ref,"fd4117fd162e3c3f9170123341999668b61792b3"}},
44+
{ref,"c45166d018d36a75452c3007f704e8fd3ad1056c"}},
5845
0},
5946
{<<"fistful_reporter_proto">>,
6047
{git,"https://github.com/valitydev/fistful-reporter-proto.git",
@@ -75,10 +62,6 @@
7562
{ref,"89a4cda0c7bc45528c6df54b76a97fb0fd82754f"}},
7663
0},
7764
{<<"idna">>,{pkg,<<"idna">>,<<"6.1.1">>},2},
78-
{<<"jesse">>,
79-
{git,"https://github.com/valitydev/jesse.git",
80-
{ref,"f4ff58e79ebe65650f9c445e730ad4c8d7f463a0"}},
81-
1},
8265
{<<"jose">>,
8366
{git,"https://github.com/potatosalad/erlang-jose.git",
8467
{ref,"991649695aaccd92c8effb1c1e88e6159fe8e9a6"}},
@@ -98,7 +81,7 @@
9881
{git,"https://github.com/valitydev/org-management-proto.git",
9982
{ref,"06c5c8430e445cb7874e54358e457cbb5697fc32"}},
10083
0},
101-
{<<"parse_trans">>,{pkg,<<"parse_trans">>,<<"3.4.1">>},1},
84+
{<<"parse_trans">>,{pkg,<<"parse_trans">>,<<"3.4.1">>},2},
10285
{<<"quickrand">>,
10386
{git,"https://github.com/okeuday/quickrand.git",
10487
{ref,"7fe89e9cfcc1378b7164e9dac4e7f02119110b68"}},
@@ -113,14 +96,6 @@
11396
{ref,"de159486ef40cec67074afe71882bdc7f7deab72"}},
11497
1},
11598
{<<"ssl_verify_fun">>,{pkg,<<"ssl_verify_fun">>,<<"1.1.6">>},2},
116-
{<<"swag_client_wallet">>,
117-
{git,"https://github.com/valitydev/swag-wallets",
118-
{ref,"559e5b7f6c07221d517a61abda2a0a4b883bf01c"}},
119-
0},
120-
{<<"swag_server_wallet">>,
121-
{git,"https://github.com/valitydev/swag-wallets",
122-
{ref,"b6b6f641d2fa47c7a46f76d1ebd8f089038394ce"}},
123-
0},
12499
{<<"tds_proto">>,
125100
{git,"https://github.com/valitydev/tds-proto.git",
126101
{ref,"48bca4905215ac492ab4764441c04db7cf1f3394"}},
@@ -156,7 +131,6 @@
156131
{<<"certifi">>, <<"DBAB8E5E155A0763EEA978C913CA280A6B544BFA115633FA20249C3D396D9493">>},
157132
{<<"cowboy">>, <<"865DD8B6607E14CF03282E10E934023A1BD8BE6F6BACF921A7E2A96D800CD452">>},
158133
{<<"cowlib">>, <<"0B9FF9C346629256C42EBE1EEB769A83C6CB771A6EE5960BD110AB0B9B872063">>},
159-
{<<"email_validator">>, <<"7E09A862E9AA99AE2CA6FD2A718D2B94360E32940A1339B53DFEE6B774BCDB03">>},
160134
{<<"gproc">>, <<"853CCB7805E9ADA25D227A157BA966F7B34508F386A3E7E21992B1B484230699">>},
161135
{<<"hackney">>, <<"99DA4674592504D3FB0CFEF0DB84C3BA02B4508BAE2DFF8C0108BAA0D6E0977C">>},
162136
{<<"idna">>, <<"8A63070E9F7D0C62EB9D9FCB360A7DE382448200FBBD1B106CC96D3D8099DF8D">>},
@@ -172,7 +146,6 @@
172146
{<<"certifi">>, <<"524C97B4991B3849DD5C17A631223896272C6B0AF446778BA4675A1DFF53BB7E">>},
173147
{<<"cowboy">>, <<"2C729F934B4E1AA149AFF882F57C6372C15399A20D54F65C8D67BEF583021BDE">>},
174148
{<<"cowlib">>, <<"2B3E9DA0B21C4565751A6D4901C20D1B4CC25CBB7FD50D91D2AB6DD287BC86A9">>},
175-
{<<"email_validator">>, <<"2B1E6DF7BB14155C8D7D131F1C95CF4676200BC056EEBA82123396833FF94DA2">>},
176149
{<<"gproc">>, <<"587E8AF698CCD3504CF4BA8D90F893EDE2B0F58CABB8A916E2BF9321DE3CF10B">>},
177150
{<<"hackney">>, <<"DE16FF4996556C8548D512F4DBE22DD58A587BF3332E7FD362430A7EF3986B16">>},
178151
{<<"idna">>, <<"92376EB7894412ED19AC475E4A86F7B413C1B9FBB5BD16DCCD57934157944CEA">>},

src/wapi_codec.erl

Lines changed: 28 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,6 @@ marshal(resource_descriptor, {bank_card, BinDataID}) ->
9999
marshal(bank_card, BankCard = #{token := Token}) ->
100100
Bin = maps:get(bin, BankCard, undefined),
101101
PaymentSystem = maps:get(payment_system, BankCard, undefined),
102-
PaymentSystemDeprecated = maps:get(payment_system_deprecated, BankCard, undefined),
103102
MaskedPan = maps:get(masked_pan, BankCard, undefined),
104103
BankName = maps:get(bank_name, BankCard, undefined),
105104
IssuerCountry = maps:get(issuer_country, BankCard, undefined),
@@ -113,7 +112,6 @@ marshal(bank_card, BankCard = #{token := Token}) ->
113112
masked_pan = marshal(string, MaskedPan),
114113
bank_name = marshal(string, BankName),
115114
payment_system = maybe_marshal(payment_system, PaymentSystem),
116-
payment_system_deprecated = maybe_marshal(payment_system_deprecated, PaymentSystemDeprecated),
117115
issuer_country = maybe_marshal(issuer_country, IssuerCountry),
118116
card_type = maybe_marshal(card_type, CardType),
119117
exp_date = maybe_marshal(exp_date, ExpDate),
@@ -124,11 +122,11 @@ marshal(bank_card_auth_data, {session, #{session_id := ID}}) ->
124122
{session_data, #'fistful_base_SessionAuthData'{
125123
id = marshal(string, ID)
126124
}};
127-
marshal(crypto_wallet, #{id := ID, data := Data}) ->
125+
marshal(crypto_wallet, CryptoWallet = #{id := ID, currency := Currency}) ->
128126
#'fistful_base_CryptoWallet'{
129127
id = marshal(string, ID),
130-
data = marshal(crypto_data, Data),
131-
currency = marshal(crypto_currency, Data)
128+
currency = marshal(crypto_currency, Currency),
129+
tag = maybe_marshal(string, maps:get(tag, CryptoWallet, undefined))
132130
};
133131
marshal(digital_wallet, Wallet = #{id := ID, payment_service := PaymentService}) ->
134132
#'fistful_base_DigitalWallet'{
@@ -152,24 +150,10 @@ marshal(exp_date, {Month, Year}) ->
152150
month = marshal(integer, Month),
153151
year = marshal(integer, Year)
154152
};
155-
marshal(crypto_currency, {Currency, _}) ->
156-
Currency;
157-
marshal(crypto_data, {bitcoin, #{}}) ->
158-
{bitcoin, #'fistful_base_CryptoDataBitcoin'{}};
159-
marshal(crypto_data, {litecoin, #{}}) ->
160-
{litecoin, #'fistful_base_CryptoDataLitecoin'{}};
161-
marshal(crypto_data, {bitcoin_cash, #{}}) ->
162-
{bitcoin_cash, #'fistful_base_CryptoDataBitcoinCash'{}};
163-
marshal(crypto_data, {ethereum, #{}}) ->
164-
{ethereum, #'fistful_base_CryptoDataEthereum'{}};
165-
marshal(crypto_data, {zcash, #{}}) ->
166-
{zcash, #'fistful_base_CryptoDataZcash'{}};
167-
marshal(crypto_data, {usdt, #{}}) ->
168-
{usdt, #'fistful_base_CryptoDataUSDT'{}};
169-
marshal(crypto_data, {ripple, Data}) ->
170-
{ripple, #'fistful_base_CryptoDataRipple'{
171-
tag = maybe_marshal(string, maps:get(tag, Data, undefined))
172-
}};
153+
marshal(crypto_currency, #{id := Ref}) when is_binary(Ref) ->
154+
#'fistful_base_CryptoCurrencyRef'{
155+
id = Ref
156+
};
173157
marshal(payment_system, #{id := Ref}) when is_binary(Ref) ->
174158
#'fistful_base_PaymentSystemRef'{
175159
id = Ref
@@ -178,8 +162,6 @@ marshal(payment_service, #{id := Ref}) when is_binary(Ref) ->
178162
#'fistful_base_PaymentServiceRef'{
179163
id = Ref
180164
};
181-
marshal(payment_system_deprecated, V) when is_atom(V) ->
182-
V;
183165
marshal(issuer_country, V) when is_atom(V) ->
184166
V;
185167
marshal(card_type, V) when is_atom(V) ->
@@ -298,7 +280,6 @@ unmarshal(bank_card, #'fistful_base_BankCard'{
298280
masked_pan = MaskedPan,
299281
bank_name = BankName,
300282
payment_system = PaymentSystem,
301-
payment_system_deprecated = PaymentSystemDeprecated,
302283
issuer_country = IssuerCountry,
303284
card_type = CardType,
304285
bin_data_id = BinDataID,
@@ -308,7 +289,6 @@ unmarshal(bank_card, #'fistful_base_BankCard'{
308289
genlib_map:compact(#{
309290
token => unmarshal(string, Token),
310291
payment_system => maybe_unmarshal(payment_system, PaymentSystem),
311-
payment_system_deprecated => maybe_unmarshal(payment_system_deprecated, PaymentSystemDeprecated),
312292
bin => maybe_unmarshal(string, Bin),
313293
masked_pan => maybe_unmarshal(string, MaskedPan),
314294
bank_name => maybe_unmarshal(string, BankName),
@@ -327,27 +307,18 @@ unmarshal(payment_system, #'fistful_base_PaymentSystemRef'{id = Ref}) ->
327307
#{
328308
id => unmarshal(string, Ref)
329309
};
330-
unmarshal(payment_system_deprecated, V) when is_atom(V) ->
331-
V;
332310
unmarshal(issuer_country, V) when is_atom(V) ->
333311
V;
334312
unmarshal(card_type, V) when is_atom(V) ->
335313
V;
336314
unmarshal(crypto_wallet, #'fistful_base_CryptoWallet'{
337315
id = CryptoWalletID,
338-
currency = CryptoWalletCurrency,
339-
data = Data
316+
currency = CryptoCurrencyRef
340317
}) ->
341318
genlib_map:compact(#{
342319
id => unmarshal(string, CryptoWalletID),
343-
currency => {CryptoWalletCurrency, unmarshal(crypto_data, Data)}
344-
});
345-
unmarshal(crypto_data, {ripple, #'fistful_base_CryptoDataRipple'{tag = Tag}}) ->
346-
genlib_map:compact(#{
347-
tag => maybe_unmarshal(string, Tag)
320+
currency => unmarshal(crypto_currency, CryptoCurrencyRef)
348321
});
349-
unmarshal(crypto_data, _) ->
350-
#{};
351322
unmarshal(cash, #'fistful_base_Cash'{
352323
amount = Amount,
353324
currency = CurrencyRef
@@ -440,7 +411,6 @@ bank_card_codec_test() ->
440411
BankCard = #{
441412
token => <<"token">>,
442413
payment_system => #{id => <<"foo">>},
443-
payment_system_deprecated => visa,
444414
bin => <<"12345">>,
445415
masked_pan => <<"7890">>,
446416
bank_name => <<"bank">>,
@@ -458,7 +428,6 @@ bank_card_codec_test() ->
458428
#'fistful_base_BankCard'{
459429
token = <<"token">>,
460430
payment_system = #'fistful_base_PaymentSystemRef'{id = <<"foo">>},
461-
payment_system_deprecated = visa,
462431
bin = <<"12345">>,
463432
masked_pan = <<"7890">>,
464433
bank_name = <<"bank">>,
@@ -471,4 +440,23 @@ bank_card_codec_test() ->
471440
),
472441
?assertEqual(BankCard, unmarshal(bank_card, Decoded)).
473442

443+
-spec crypto_wallet_codec_test() -> _.
444+
445+
crypto_wallet_codec_test() ->
446+
CryptoWallet = #{
447+
id => <<"token">>,
448+
currency => #{id => <<"BTC">>}
449+
},
450+
Type = {struct, struct, {ff_proto_base_thrift, 'CryptoWallet'}},
451+
Binary = wapi_thrift_utils:serialize(Type, marshal(crypto_wallet, CryptoWallet)),
452+
Decoded = wapi_thrift_utils:deserialize(Type, Binary),
453+
?assertEqual(
454+
Decoded,
455+
#'fistful_base_CryptoWallet'{
456+
id = <<"token">>,
457+
currency = #'fistful_base_CryptoCurrencyRef'{id = <<"BTC">>}
458+
}
459+
),
460+
?assertEqual(CryptoWallet, unmarshal(crypto_wallet, Decoded)).
461+
474462
-endif.

src/wapi_destination_backend.erl

Lines changed: 8 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -143,15 +143,16 @@ construct_resource(
143143
construct_resource(
144144
#{
145145
<<"type">> := <<"CryptoWalletDestinationResource">>,
146-
<<"id">> := CryptoWalletID
147-
} = Resource,
146+
<<"id">> := CryptoWalletID,
147+
<<"currency">> := Currency
148+
},
148149
_Context
149150
) ->
150151
CostructedResource =
151152
{crypto_wallet, #{
152153
crypto_wallet => #{
153154
id => CryptoWalletID,
154-
data => marshal_crypto_currency_data(Resource)
155+
currency => #{id => marshal(string, Currency)}
155156
}
156157
}},
157158
{ok, wapi_codec:marshal(resource, CostructedResource)};
@@ -314,16 +315,16 @@ unmarshal(
314315
{crypto_wallet, #'fistful_base_ResourceCryptoWallet'{
315316
crypto_wallet = #'fistful_base_CryptoWallet'{
316317
id = CryptoWalletID,
317-
data = Data
318+
currency = #'fistful_base_CryptoCurrencyRef'{id = Currency},
319+
tag = Tag
318320
}
319321
}}
320322
) ->
321-
{Currency, Params} = unmarshal_crypto_currency_data(Data),
322323
genlib_map:compact(#{
323324
<<"type">> => <<"CryptoWalletDestinationResource">>,
324325
<<"id">> => unmarshal(string, CryptoWalletID),
325-
<<"currency">> => Currency,
326-
<<"tag">> => genlib_map:get(tag, Params)
326+
<<"currency">> => unmarshal(string, Currency),
327+
<<"tag">> => maybe_unmarshal(string, Tag)
327328
});
328329
unmarshal(
329330
resource,
@@ -359,45 +360,3 @@ maybe_unmarshal(_, undefined) ->
359360
undefined;
360361
maybe_unmarshal(T, V) ->
361362
unmarshal(T, V).
362-
363-
marshal_crypto_currency_data(Resource) ->
364-
#{
365-
<<"currency">> := CryptoCurrencyName
366-
} = Resource,
367-
Name = marshal_crypto_currency_name(CryptoCurrencyName),
368-
Params = marshal_crypto_currency_params(Name, Resource),
369-
{Name, Params}.
370-
371-
unmarshal_crypto_currency_data({Name, Params}) ->
372-
{unmarshal_crypto_currency_name(Name), unmarshal_crypto_currency_params(Name, Params)}.
373-
374-
marshal_crypto_currency_name(<<"Bitcoin">>) -> bitcoin;
375-
marshal_crypto_currency_name(<<"Litecoin">>) -> litecoin;
376-
marshal_crypto_currency_name(<<"BitcoinCash">>) -> bitcoin_cash;
377-
marshal_crypto_currency_name(<<"Ripple">>) -> ripple;
378-
marshal_crypto_currency_name(<<"Ethereum">>) -> ethereum;
379-
marshal_crypto_currency_name(<<"USDT">>) -> usdt;
380-
marshal_crypto_currency_name(<<"Zcash">>) -> zcash.
381-
382-
unmarshal_crypto_currency_name(bitcoin) -> <<"Bitcoin">>;
383-
unmarshal_crypto_currency_name(litecoin) -> <<"Litecoin">>;
384-
unmarshal_crypto_currency_name(bitcoin_cash) -> <<"BitcoinCash">>;
385-
unmarshal_crypto_currency_name(ripple) -> <<"Ripple">>;
386-
unmarshal_crypto_currency_name(ethereum) -> <<"Ethereum">>;
387-
unmarshal_crypto_currency_name(usdt) -> <<"USDT">>;
388-
unmarshal_crypto_currency_name(zcash) -> <<"Zcash">>.
389-
390-
marshal_crypto_currency_params(ripple, Resource) ->
391-
Tag = maps:get(<<"tag">>, Resource, undefined),
392-
#{
393-
tag => maybe_marshal(string, Tag)
394-
};
395-
marshal_crypto_currency_params(_Other, _Resource) ->
396-
#{}.
397-
398-
unmarshal_crypto_currency_params(ripple, #'fistful_base_CryptoDataRipple'{tag = Tag}) ->
399-
genlib_map:compact(#{
400-
tag => maybe_unmarshal(string, Tag)
401-
});
402-
unmarshal_crypto_currency_params(_Other, _Params) ->
403-
#{}.

src/wapi_lib.app.src

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
scoper,
1818
jose,
1919
jsx,
20-
cowboy_cors,
2120
snowflake,
2221
uac,
2322
bouncer_client,

src/wapi_stat_backend.erl

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -390,22 +390,14 @@ unmarshal_bank_card(#'fistful_base_BankCard'{
390390

391391
unmarshal_crypto_wallet(#'fistful_base_CryptoWallet'{
392392
id = CryptoWalletID,
393-
data = Data
393+
currency = #'fistful_base_CryptoCurrencyRef'{id = Currency}
394394
}) ->
395395
#{
396396
<<"type">> => <<"CryptoWalletDestinationResource">>,
397397
<<"id">> => CryptoWalletID,
398-
<<"currency">> => unmarshal_crypto_currency_name(Data)
398+
<<"currency">> => Currency
399399
}.
400400

401-
unmarshal_crypto_currency_name({bitcoin, _}) -> <<"Bitcoin">>;
402-
unmarshal_crypto_currency_name({litecoin, _}) -> <<"Litecoin">>;
403-
unmarshal_crypto_currency_name({bitcoin_cash, _}) -> <<"BitcoinCash">>;
404-
unmarshal_crypto_currency_name({ripple, _}) -> <<"Ripple">>;
405-
unmarshal_crypto_currency_name({ethereum, _}) -> <<"Ethereum">>;
406-
unmarshal_crypto_currency_name({usdt, _}) -> <<"USDT">>;
407-
unmarshal_crypto_currency_name({zcash, _}) -> <<"Zcash">>.
408-
409401
unmarshal_digital_wallet(#'fistful_base_DigitalWallet'{
410402
id = DigitalWalletID,
411403
payment_service = #'fistful_base_PaymentServiceRef'{id = Provider}

0 commit comments

Comments
 (0)