Refactor lib (#16)

This commit is contained in:
struga 2022-03-15 17:26:44 +03:00 committed by GitHub
parent 063586c512
commit 6ffe114df5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 81 additions and 20 deletions

View File

@ -1 +1,4 @@
# adapter-flow-lib
### License
[Apache 2.0 License.](/LICENSE)

View File

@ -1,12 +1,14 @@
### Как использовать бибилиотеку?
1. Необходимо провести аналитику и определить какой процесс вам подходит. Список процессов:
* [Процесс с полным прохождением 3дс версии 1.0 и 2.0](./flows/Full Three Ds V1 V2 Flow Steps.md)
* [Простой процесс с редиректом и поллингом статусов после всех операций](./flows/Full Three Ds V1 V2 Flow Steps.md)
* [Процесс с полным прохождением 3дс версии 1.0 и 2.0](./flows/full_three_ds_v1_v2_flow_steps.md)
* [Простой процесс с редиректом и поллингом статусов после всех операций](./flows/simple_redirect_with_polling_flow_steps.md)
2. Если подходящий вам процесс найден, процесс продолжается по следующему пути:
1. Подготавливается конфигурация под spring-boot [настройка конфигурации](./spring-boot-configuration.md).
2. Релизовать, соответствующие выбранному флоу, методы
из [RemoteClient](../src/main/java/dev/vality/adapter/flow/lib/client/RemoteClient.java) [инструкция](./client_implementations_manual.md)
3. Реализовать валидаторы для ваших входных параметров, уникальных для вашего адаптера и настраевымых командой
поддержки поддержкой(options - на уровне протокола damsel) [интерфейс](../src/main/java/dev/vality/adapter/flow/lib/validator/Validator.java)
поддержки поддержкой(options - на уровне протокола
damsel) [интерфейс](../src/main/java/dev/vality/adapter/flow/lib/validator/Validator.java)
4. Реализация тестов

View File

@ -1 +0,0 @@
### Простой процесс с редиректом и поллингом статусов после всех операций

View File

Before

Width:  |  Height:  |  Size: 119 KiB

After

Width:  |  Height:  |  Size: 119 KiB

View File

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 67 KiB

View File

@ -0,0 +1,8 @@
### Простой процесс с редиректом и поллингом статусов после всех операций
![alt text](imgs/simple_redirect_with_polling_flow_steps.drawio.svg)
1. Запрос на авторизацию
2. Получение ссылки для перенаправления клиента
3. Перенаправление клиента
4. Опрос статуса после прохождения таймаута

View File

@ -1 +1,2 @@
### Конфигурация Spring Boot?

View File

@ -13,7 +13,7 @@
</parent>
<artifactId>adapter-flow-lib</artifactId>
<version>0.0.11</version>
<version>0.1.0</version>
<packaging>jar</packaging>
<name>adapter-flow-lib</name>

View File

@ -0,0 +1,7 @@
package dev.vality.adapter.flow.lib.constant;
public enum HttpMethod {
GET, POST;
}

View File

@ -66,8 +66,11 @@ public class CtxToEntryModelConverter implements Converter<PaymentContext, Entry
.refundData(initRefundData(paymentInfo))
.paymentId(idGenerator.get(paymentInfo.getInvoice().getId()))
.createdAt(paymentInfo.getPayment().getCreatedAt())
.currency(payment.getCost().getCurrency().getSymbolicCode())
.amount(payment.getCost().getAmount())
.currency(Currency.builder()
.symbolicCode(payment.getCost().getCurrency().getSymbolicCode())
.numericCode(payment.getCost().getCurrency().getNumericCode())
.build()
).amount(payment.getCost().getAmount())
.details(paymentInfo.getInvoice().getDetails().getDescription())
.payerInfo(PayerInfo.builder()
.ip(ProxyProviderPackageCreators.extractIpAddress(context))

View File

@ -65,7 +65,13 @@ public class RecCtxToEntryModelConverter implements Converter<RecurrentTokenCont
.cardData(cardData)
.refundData(initRefundData(recurrentPaymentTool, orderId))
.paymentId(orderId)
.currency(recurrentPaymentTool.getMinimalPaymentCost().getCurrency().getSymbolicCode())
.currency(Currency.builder()
.symbolicCode(
recurrentPaymentTool.getMinimalPaymentCost().getCurrency().getSymbolicCode())
.numericCode(
recurrentPaymentTool.getMinimalPaymentCost().getCurrency().getNumericCode())
.build()
)
.amount(recurrentPaymentTool.getMinimalPaymentCost().getAmount())
.details(recurrentPaymentTool.getId())
.payerInfo(PayerInfo.builder()

View File

@ -18,8 +18,6 @@ public class SimpleRedirectWithPollingResultIntentResolver implements ResultInte
@Override
public Intent initIntentByStep(ExitStateModel exitStateModel) {
Step nextStep = exitStateModel.getNextStep();
EntryStateModel entryStateModel = exitStateModel.getEntryStateModel();
Step currentStep = entryStateModel.getCurrentStep();
return switch (nextStep) {
case CHECK_STATUS -> exitStateModel.getLastOperationStatus() == Status.NEED_REDIRECT
? intentResultFactory.createSuspendIntentWithCallbackAfterTimeout(exitStateModel)

View File

@ -17,7 +17,7 @@ import java.util.Map;
public class BaseRequestModel {
/**
* Uniq Long identifier for payment.
* Uniq Long identifier for payment.
*/
private Long paymentId;
/**
@ -29,12 +29,12 @@ public class BaseRequestModel {
*/
private Long amount;
/**
* Currency in symbolic formats (example: "USD").
* Code and symbolic code of currency.
*/
private String currency;
private Currency currency;
/**
* Timestamp RFC 3339.
*
* <p>
* The string must contain the date and time in UTC in the following format:
* `2016-03-22T06:12:27Z`
*/

View File

@ -0,0 +1,23 @@
package dev.vality.adapter.flow.lib.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
@Data
@SuperBuilder
@NoArgsConstructor
@AllArgsConstructor
public class Currency {
/**
* Currency in symbolic formats (example: "USD").
*/
private String symbolicCode;
/**
* Currency in symbolic formats (example: "USD").
*/
private Short numericCode;
}

View File

@ -1,5 +1,6 @@
package dev.vality.adapter.flow.lib.model;
import dev.vality.adapter.flow.lib.constant.HttpMethod;
import dev.vality.adapter.flow.lib.constant.ThreeDsType;
import lombok.AllArgsConstructor;
import lombok.Data;
@ -14,6 +15,10 @@ import java.util.Map;
@AllArgsConstructor
public class ThreeDsData {
/**
* Http method type.
*/
private HttpMethod httpMethod = HttpMethod.GET;
/**
* Use type to select desired 3ds flow.
*/

View File

@ -1,5 +1,6 @@
package dev.vality.adapter.flow.lib.service;
import dev.vality.adapter.flow.lib.constant.HttpMethod;
import dev.vality.adapter.flow.lib.constant.RedirectFields;
import dev.vality.adapter.flow.lib.model.EntryStateModel;
import dev.vality.adapter.flow.lib.model.ExitStateModel;
@ -13,6 +14,7 @@ import dev.vality.adapter.flow.lib.utils.TimerProperties;
import dev.vality.damsel.base.Timer;
import dev.vality.damsel.proxy_provider.*;
import dev.vality.damsel.timeout_behaviour.TimeoutBehaviour;
import dev.vality.damsel.user_interaction.UserInteraction;
import dev.vality.error.mapping.ErrorMapping;
import lombok.RequiredArgsConstructor;
@ -81,18 +83,22 @@ public class IntentResultFactory {
Timer.timeout(TimeoutUtils.toSeconds(timerRedirectTimeoutMin)))
.setTimeoutBehaviour(TimeoutBehaviour.callback(
ByteBuffer.wrap(parametersSerializer.writeByte(params)))
).setUserInteraction(createGetUserInteraction(threeDsData.getAcsUrl()))
).setUserInteraction(createUserInteraction(threeDsData))
);
}
private UserInteraction createUserInteraction(ThreeDsData threeDsData) {
if (threeDsData.getHttpMethod() == HttpMethod.GET) {
return createGetUserInteraction(threeDsData.getAcsUrl());
} else {
return createPostUserInteraction(threeDsData.getAcsUrl(), threeDsData.getParameters());
}
}
public Intent createFinishIntentSuccess() {
return Intent.finish(new FinishIntent(FinishStatus.success(new Success())));
}
public Intent createSleepIntentForReinvocation() {
return Intent.sleep(new SleepIntent(Timer.timeout(0)));
}
public Intent createSleepIntentWithExponentialPolling(ExitStateModel exitStateModel) {
EntryStateModel entryStateModel = exitStateModel.getEntryStateModel();
PollingInfo pollingInfo = pollingInfoService.initPollingInfo(entryStateModel);