Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion apps/capi/src/capi.app.src
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
cowboy_access_log,
cowboy_draining_server,
woody_user_identity,
payproc_errors,
erl_health,
bouncer_client,
token_keeper_client,
Expand Down
52 changes: 29 additions & 23 deletions apps/capi/src/capi_handler_decoder_invoicing.erl
Original file line number Diff line number Diff line change
Expand Up @@ -335,28 +335,27 @@ decode_payment_status({Status, StatusInfo}, Context) ->
<<"error">> => Error
}.

-spec decode_payment_operation_failure({atom(), _}, processing_context()) -> decode_data().
-spec decode_payment_operation_failure(dmsl_domain_thrift:'OperationFailure'(), processing_context()) -> decode_data().
decode_payment_operation_failure({operation_timeout, _}, _) ->
payment_error(<<"timeout">>);
decode_payment_operation_failure({failure, Failure}, Context) ->
AuthContext = capi_handler_utils:get_auth_context(Context),
case capi_auth:get_consumer(AuthContext) of
client ->
payment_error(payproc_errors:match('PaymentFailure', Failure, fun payment_error_client_maping/1));
payment_error(payment_error_client_maping(Failure));
merchant ->
% чтобы не городить ещё один обход дерева как в payproc_errors проще отформатировать в текст,
% а потом уже в json
decode_payment_operation_failure_(
binary:split(erlang:list_to_binary(payproc_errors:format_raw(Failure)), <<":">>, [global])
)
decode_payment_operation_failure_(Failure)
end.

decode_payment_operation_failure_([H | T]) ->
R = payment_error(H),
case T of
[] -> R;
_ -> R#{<<"subError">> => decode_payment_operation_failure_(T)}
end.
decode_payment_operation_failure_(undefined) ->
undefined;
decode_payment_operation_failure_(Failure) ->
{Code, Sub} =
case Failure of
#domain_Failure{code = C, sub = S} -> {C, S};
#domain_SubFailure{code = C, sub = S} -> {C, S}
end,
genlib_map:compact((payment_error(Code))#{<<"subError">> => decode_payment_operation_failure_(Sub)}).

decode_flow({instant, _}) ->
#{<<"type">> => <<"PaymentFlowInstant">>};
Expand Down Expand Up @@ -384,21 +383,28 @@ payment_error(Code) ->
#{<<"code">> => Code}.

%% client error mapping
%% @see https://github.com/petrkozorezov/swag/blob/master/spec/definitions/PaymentError.yaml
-spec payment_error_client_maping(capi_handler_encoder:encode_data()) -> binary().
payment_error_client_maping({preauthorization_failed, _}) ->
-spec payment_error_client_maping(dmsl_domain_thrift:'Failure'()) -> binary().
payment_error_client_maping(#domain_Failure{code = <<"preauthorization_failed">>}) ->
<<"PreauthorizationFailed">>;
payment_error_client_maping({authorization_failed, {account_blocked, _}}) ->
<<"RejectedByIssuer">>;
payment_error_client_maping({authorization_failed, {rejected_by_issuer, _}}) ->
payment_error_client_maping(#domain_Failure{
code = <<"authorization_failed">>, sub = #domain_SubFailure{code = <<"account_blocked">>}
}) ->
<<"RejectedByIssuer">>;
payment_error_client_maping({authorization_failed, {payment_tool_rejected, _}}) ->
payment_error_client_maping(#domain_Failure{
code = <<"authorization_failed">>, sub = #domain_SubFailure{code = <<"payment_tool_rejected">>}
}) ->
<<"InvalidPaymentTool">>;
payment_error_client_maping({authorization_failed, {account_not_found, _}}) ->
payment_error_client_maping(#domain_Failure{
code = <<"authorization_failed">>, sub = #domain_SubFailure{code = <<"account_not_found">>}
}) ->
<<"InvalidPaymentTool">>;
payment_error_client_maping({authorization_failed, {account_limit_exceeded, _}}) ->
payment_error_client_maping(#domain_Failure{
code = <<"authorization_failed">>, sub = #domain_SubFailure{code = <<"account_limit_exceeded">>}
}) ->
<<"AccountLimitsExceeded">>;
payment_error_client_maping({authorization_failed, {insufficient_funds, _}}) ->
payment_error_client_maping(#domain_Failure{
code = <<"authorization_failed">>, sub = #domain_SubFailure{code = <<"insufficient_funds">>}
}) ->
<<"InsufficientFunds">>;
payment_error_client_maping(_) ->
<<"PaymentRejected">>.
Expand Down
51 changes: 25 additions & 26 deletions apps/capi/test/capi_base_api_token_tests_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
-include_lib("stdlib/include/assert.hrl").

-include_lib("damsel/include/dmsl_payproc_thrift.hrl").
-include_lib("damsel/include/dmsl_payproc_error_thrift.hrl").
-include_lib("damsel/include/dmsl_webhooker_thrift.hrl").
-include_lib("damsel/include/dmsl_base_thrift.hrl").
-include_lib("damsel/include/dmsl_domain_thrift.hrl").
Expand Down Expand Up @@ -803,12 +802,11 @@ get_payment_status_preauthorization_failed_test(Config) ->
<<"code">> => <<"unknown">>
}
},
Failure =
payproc_errors:construct(
'PaymentFailure',
{preauthorization_failed, {unknown, #payproc_error_GeneralFailure{}}},
<<"Reason">>
),
Failure = #domain_Failure{
reason = <<"Reason">>,
code = <<"preauthorization_failed">>,
sub = #domain_SubFailure{code = <<"unknown">>}
},
get_merchant_payment_status_test_impl(MappedFailure, Failure, Config).

-spec get_payment_status_payment_tool_rejected_test(config()) -> _.
Expand All @@ -824,13 +822,16 @@ get_payment_status_payment_tool_rejected_test(Config) ->
}
}
},
Failure =
payproc_errors:construct(
'PaymentFailure',
{authorization_failed,
{payment_tool_rejected, {bank_card_rejected, {cvv_invalid, #payproc_error_GeneralFailure{}}}}},
<<"Reason">>
),
Failure = #domain_Failure{
reason = <<"Reason">>,
code = <<"authorization_failed">>,
sub = #domain_SubFailure{
code = <<"payment_tool_rejected">>,
sub = #domain_SubFailure{
code = <<"bank_card_rejected">>, sub = #domain_SubFailure{code = <<"cvv_invalid">>}
}
}
},
get_merchant_payment_status_test_impl(MappedFailure, Failure, Config).

-spec get_payment_status_account_limit_exceeded_test(config()) -> _.
Expand All @@ -845,12 +846,11 @@ get_payment_status_account_limit_exceeded_test(Config) ->
}
}
},
Failure =
payproc_errors:construct(
'PaymentFailure',
{authorization_failed, {account_limit_exceeded, {unknown, #payproc_error_GeneralFailure{}}}},
<<"Reason">>
),
Failure = #domain_Failure{
reason = <<"Reason">>,
code = <<"authorization_failed">>,
sub = #domain_SubFailure{code = <<"account_limit_exceeded">>, sub = #domain_SubFailure{code = <<"unknown">>}}
},
get_merchant_payment_status_test_impl(MappedFailure, Failure, Config).

-spec get_payment_status_account_blocked_test(config()) -> _.
Expand Down Expand Up @@ -880,12 +880,11 @@ get_merchant_payment_status_test_(SubErrorCode, Config) ->
<<"code">> => atom_to_binary(SubErrorCode)
}
},
Failure6 =
payproc_errors:construct(
'PaymentFailure',
{authorization_failed, {SubErrorCode, #payproc_error_GeneralFailure{}}},
<<"Reason">>
),
Failure6 = #domain_Failure{
reason = <<"Reason">>,
code = <<"authorization_failed">>,
sub = #domain_SubFailure{code = atom_to_binary(SubErrorCode)}
},
get_merchant_payment_status_test_impl(MappedFailure6, Failure6, Config).

get_merchant_payment_status_test_impl(MappedFailure, Failure, Config) ->
Expand Down
18 changes: 10 additions & 8 deletions apps/capi/test/capi_invoice_access_token_tests_SUITE.erl
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
-include_lib("stdlib/include/assert.hrl").

-include_lib("damsel/include/dmsl_payproc_thrift.hrl").
-include_lib("damsel/include/dmsl_payproc_error_thrift.hrl").
-include_lib("damsel/include/dmsl_base_thrift.hrl").
-include_lib("damsel/include/dmsl_domain_thrift.hrl").
-include_lib("damsel/include/dmsl_user_interaction_thrift.hrl").
Expand Down Expand Up @@ -771,13 +770,16 @@ get_recurrent_payments_ok_test(Config) ->

-spec get_failed_payment_with_invalid_cvv(config()) -> _.
get_failed_payment_with_invalid_cvv(Config) ->
Failure =
payproc_errors:construct(
'PaymentFailure',
{authorization_failed,
{payment_tool_rejected, {bank_card_rejected, {cvv_invalid, #payproc_error_GeneralFailure{}}}}},
<<"Reason">>
),
Failure = #domain_Failure{
reason = <<"Reason">>,
code = <<"authorization_failed">>,
sub = #domain_SubFailure{
code = <<"payment_tool_rejected">>,
sub = #domain_SubFailure{
code = <<"bank_card_rejected">>, sub = #domain_SubFailure{code = <<"cvv_invalid">>}
}
}
},
_ = capi_ct_helper:mock_services(
[
{invoicing, fun
Expand Down
1 change: 0 additions & 1 deletion rebar.config
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@
{dmt_client, {git, "https://github.com/valitydev/dmt_client.git", {tag, "v2.0.3"}}},
{cowboy_cors, {git, "https://github.com/valitydev/cowboy_cors.git", {branch, "master"}}},
{cowboy_access_log, {git, "https://github.com/valitydev/cowboy_access_log.git", {branch, "master"}}},
{payproc_errors, {git, "https://github.com/valitydev/payproc-errors-erlang.git", {branch, "master"}}},
{scoper, {git, "https://github.com/valitydev/scoper.git", {tag, "v1.1.0"}}},
{erl_health, {git, "https://github.com/valitydev/erlang-health.git", {branch, master}}},
{lechiffre, {git, "https://github.com/valitydev/lechiffre.git", {tag, "v0.1.0"}}},
Expand Down
10 changes: 3 additions & 7 deletions rebar.lock
Original file line number Diff line number Diff line change
Expand Up @@ -106,10 +106,6 @@
{git,"https://github.com/valitydev/party-client-erlang.git",
{ref,"8448535eb60e6130bb12902594d2c59eea03e8b0"}},
0},
{<<"payproc_errors">>,
{git,"https://github.com/valitydev/payproc-errors-erlang.git",
{ref,"8ae8586239ef68098398acf7eb8363d9ec3b3234"}},
0},
{<<"prometheus">>,{pkg,<<"prometheus">>,<<"4.11.0">>},0},
{<<"prometheus_cowboy">>,{pkg,<<"prometheus_cowboy">>,<<"0.1.9">>},0},
{<<"prometheus_httpd">>,{pkg,<<"prometheus_httpd">>,<<"2.1.15">>},1},
Expand Down Expand Up @@ -137,7 +133,7 @@
{ref,"3a60e5dc5bbd709495024f26e100b041c3547fd9"}},
1},
{<<"tls_certificate_check">>,
{pkg,<<"tls_certificate_check">>,<<"1.33.0">>},
{pkg,<<"tls_certificate_check">>,<<"1.35.0">>},
1},
{<<"token_keeper_client">>,
{git,"https://github.com/valitydev/token-keeper-client.git",
Expand Down Expand Up @@ -185,7 +181,7 @@
{<<"quantile_estimator">>, <<"EF50A361F11B5F26B5F16D0696E46A9E4661756492C981F7B2229EF42FF1CD15">>},
{<<"ranch">>, <<"8C7A100A139FD57F17327B6413E4167AC559FBC04CA7448E9BE9057311597A1D">>},
{<<"ssl_verify_fun">>, <<"354C321CF377240C7B8716899E182CE4890C5938111A1296ADD3EC74CF1715DF">>},
{<<"tls_certificate_check">>, <<"01E0822A2EBB0B207C4964E8D32AD8B1B8CE1CAF58F446E53F816D06DB953DE4">>},
{<<"tls_certificate_check">>, <<"6237B9CB9632B1F52F00EF852CD04D4AF70319C308D4F65BE1E45DA637578867">>},
{<<"unicode_util_compat">>, <<"A48703A25C170EEDADCA83B11E88985AF08D35F37C6F664D6DCFB106A97782FC">>}]},
{pkg_hash_ext,[
{<<"accept">>, <<"CA69388943F5DAD2E7232A5478F16086E3C872F48E32B88B378E1885A59F5649">>},
Expand Down Expand Up @@ -215,6 +211,6 @@
{<<"quantile_estimator">>, <<"282A8A323CA2A845C9E6F787D166348F776C1D4A41EDE63046D72D422E3DA946">>},
{<<"ranch">>, <<"49FBCFD3682FAB1F5D109351B61257676DA1A2FDBE295904176D5E521A2DDFE5">>},
{<<"ssl_verify_fun">>, <<"FE4C190E8F37401D30167C8C405EDA19469F34577987C76DDE613E838BBC67F8">>},
{<<"tls_certificate_check">>, <<"CAB9A7439E2DBFE91B38104F2D8A4B6D61DBC4D3A5AD59AC364713A88C6CFD9B">>},
{<<"tls_certificate_check">>, <<"36FD91D635761DAFFA12E75B0C784B24510A69AD53348B8276A553D2D665B579">>},
{<<"unicode_util_compat">>, <<"B3A917854CE3AE233619744AD1E0102E05673136776FB2FA76234F3E03B23642">>}]}
].
Loading