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 # adapter-flow-lib
### License
[Apache 2.0 License.](/LICENSE)

View File

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

View File

@ -13,7 +13,7 @@
</parent> </parent>
<artifactId>adapter-flow-lib</artifactId> <artifactId>adapter-flow-lib</artifactId>
<version>0.0.11</version> <version>0.1.0</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>adapter-flow-lib</name> <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)) .refundData(initRefundData(paymentInfo))
.paymentId(idGenerator.get(paymentInfo.getInvoice().getId())) .paymentId(idGenerator.get(paymentInfo.getInvoice().getId()))
.createdAt(paymentInfo.getPayment().getCreatedAt()) .createdAt(paymentInfo.getPayment().getCreatedAt())
.currency(payment.getCost().getCurrency().getSymbolicCode()) .currency(Currency.builder()
.amount(payment.getCost().getAmount()) .symbolicCode(payment.getCost().getCurrency().getSymbolicCode())
.numericCode(payment.getCost().getCurrency().getNumericCode())
.build()
).amount(payment.getCost().getAmount())
.details(paymentInfo.getInvoice().getDetails().getDescription()) .details(paymentInfo.getInvoice().getDetails().getDescription())
.payerInfo(PayerInfo.builder() .payerInfo(PayerInfo.builder()
.ip(ProxyProviderPackageCreators.extractIpAddress(context)) .ip(ProxyProviderPackageCreators.extractIpAddress(context))

View File

@ -65,7 +65,13 @@ public class RecCtxToEntryModelConverter implements Converter<RecurrentTokenCont
.cardData(cardData) .cardData(cardData)
.refundData(initRefundData(recurrentPaymentTool, orderId)) .refundData(initRefundData(recurrentPaymentTool, orderId))
.paymentId(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()) .amount(recurrentPaymentTool.getMinimalPaymentCost().getAmount())
.details(recurrentPaymentTool.getId()) .details(recurrentPaymentTool.getId())
.payerInfo(PayerInfo.builder() .payerInfo(PayerInfo.builder()

View File

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

View File

@ -17,7 +17,7 @@ import java.util.Map;
public class BaseRequestModel { public class BaseRequestModel {
/** /**
* Uniq Long identifier for payment. * Uniq Long identifier for payment.
*/ */
private Long paymentId; private Long paymentId;
/** /**
@ -29,12 +29,12 @@ public class BaseRequestModel {
*/ */
private Long amount; private Long amount;
/** /**
* Currency in symbolic formats (example: "USD"). * Code and symbolic code of currency.
*/ */
private String currency; private Currency currency;
/** /**
* Timestamp RFC 3339. * Timestamp RFC 3339.
* * <p>
* The string must contain the date and time in UTC in the following format: * The string must contain the date and time in UTC in the following format:
* `2016-03-22T06:12:27Z` * `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; package dev.vality.adapter.flow.lib.model;
import dev.vality.adapter.flow.lib.constant.HttpMethod;
import dev.vality.adapter.flow.lib.constant.ThreeDsType; import dev.vality.adapter.flow.lib.constant.ThreeDsType;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
@ -14,6 +15,10 @@ import java.util.Map;
@AllArgsConstructor @AllArgsConstructor
public class ThreeDsData { public class ThreeDsData {
/**
* Http method type.
*/
private HttpMethod httpMethod = HttpMethod.GET;
/** /**
* Use type to select desired 3ds flow. * Use type to select desired 3ds flow.
*/ */

View File

@ -1,5 +1,6 @@
package dev.vality.adapter.flow.lib.service; 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.constant.RedirectFields;
import dev.vality.adapter.flow.lib.model.EntryStateModel; import dev.vality.adapter.flow.lib.model.EntryStateModel;
import dev.vality.adapter.flow.lib.model.ExitStateModel; 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.base.Timer;
import dev.vality.damsel.proxy_provider.*; import dev.vality.damsel.proxy_provider.*;
import dev.vality.damsel.timeout_behaviour.TimeoutBehaviour; import dev.vality.damsel.timeout_behaviour.TimeoutBehaviour;
import dev.vality.damsel.user_interaction.UserInteraction;
import dev.vality.error.mapping.ErrorMapping; import dev.vality.error.mapping.ErrorMapping;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -81,18 +83,22 @@ public class IntentResultFactory {
Timer.timeout(TimeoutUtils.toSeconds(timerRedirectTimeoutMin))) Timer.timeout(TimeoutUtils.toSeconds(timerRedirectTimeoutMin)))
.setTimeoutBehaviour(TimeoutBehaviour.callback( .setTimeoutBehaviour(TimeoutBehaviour.callback(
ByteBuffer.wrap(parametersSerializer.writeByte(params))) 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() { public Intent createFinishIntentSuccess() {
return Intent.finish(new FinishIntent(FinishStatus.success(new Success()))); 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) { public Intent createSleepIntentWithExponentialPolling(ExitStateModel exitStateModel) {
EntryStateModel entryStateModel = exitStateModel.getEntryStateModel(); EntryStateModel entryStateModel = exitStateModel.getEntryStateModel();
PollingInfo pollingInfo = pollingInfoService.initPollingInfo(entryStateModel); PollingInfo pollingInfo = pollingInfoService.initPollingInfo(entryStateModel);