mirror of
https://github.com/valitydev/adapter-flow-lib.git
synced 2024-11-06 00:05:22 +00:00
Refactor lib (#16)
This commit is contained in:
parent
063586c512
commit
6ffe114df5
@ -1 +1,4 @@
|
|||||||
# adapter-flow-lib
|
# adapter-flow-lib
|
||||||
|
|
||||||
|
### License
|
||||||
|
[Apache 2.0 License.](/LICENSE)
|
@ -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. Реализация тестов
|
@ -1 +0,0 @@
|
|||||||
### Простой процесс с редиректом и поллингом статусов после всех операций
|
|
Before Width: | Height: | Size: 119 KiB After Width: | Height: | Size: 119 KiB |
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 67 KiB |
8
docs/flows/simple_redirect_with_polling_flow_steps.md
Normal file
8
docs/flows/simple_redirect_with_polling_flow_steps.md
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
### Простой процесс с редиректом и поллингом статусов после всех операций
|
||||||
|
|
||||||
|
![alt text](imgs/simple_redirect_with_polling_flow_steps.drawio.svg)
|
||||||
|
|
||||||
|
1. Запрос на авторизацию
|
||||||
|
2. Получение ссылки для перенаправления клиента
|
||||||
|
3. Перенаправление клиента
|
||||||
|
4. Опрос статуса после прохождения таймаута
|
@ -1 +1,2 @@
|
|||||||
### Конфигурация Spring Boot?
|
### Конфигурация Spring Boot?
|
||||||
|
|
||||||
|
2
pom.xml
2
pom.xml
@ -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>
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
package dev.vality.adapter.flow.lib.constant;
|
||||||
|
|
||||||
|
public enum HttpMethod {
|
||||||
|
|
||||||
|
GET, POST;
|
||||||
|
|
||||||
|
}
|
@ -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))
|
||||||
|
@ -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()
|
||||||
|
@ -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)
|
||||||
|
@ -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`
|
||||||
*/
|
*/
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
}
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user