refactor project, update deps, add flow lib (#15)

This commit is contained in:
Anatoly Karlov 2022-05-20 18:58:45 +07:00 committed by GitHub
parent 4c5457466f
commit 55a702ab84
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
65 changed files with 1287 additions and 517 deletions

View File

@ -8,9 +8,10 @@ on:
jobs:
deploy:
uses: valitydev/base-workflow/.github/workflows/maven-library-deploy.yml@v1
uses: valitydev/java-workflow/.github/workflows/maven-library-deploy.yml@v1
secrets:
server-username: ${{ secrets.OSSRH_USERNAME }}
server-password: ${{ secrets.OSSRH_TOKEN }}
deploy-secret-key: ${{ secrets.OSSRH_GPG_SECRET_KEY }}
deploy-secret-key-password: ${{ secrets.OSSRH_GPG_SECRET_KEY_PASSWORD }}
mm-webhook-url: ${{ secrets.MATTERMOST_WEBHOOK_URL }}

View File

@ -1,21 +1,56 @@
### adapter-bank-spring-boot-starter
**Adapter-bank-spring-boot-starter** - это подключаемый Spring Boot модуль для стандартных
компонентов proxy-алаптеров.
**Adapter-bank-spring-boot-starter** - это подключаемый Spring Boot модуль для стандартных компонентов proxy-адаптеров.
Для корректной работы Вашего адаптера необходимо:
* подключить необходимые properties (AdapterProperties, TimerProperties). Если поля родителя
не покрывают всех необходимых бизнес-полей, то необходимо унаследоваться от родителя и
при помощи аннотаций @Configuration и @ConfigurationProperties создать соответствующий
класс конфигураций .Если поля родителя полностью покрывают case, то можно не создавать
класс-наследник, а создать соответствующий bean в конфигурации. Например:
```yaml
adapter:
url: http://127.0.0.1
callbackUrl: http://127.0.0.1:8080
pathCallbackUrl: /${server.rest.endpoint}/term_url
pathRecurrentCallbackUrl: /${server.rest.endpoint}/rec_term_url
defaultTermUrl: https://checkout.empayre.com/v1/finish-interaction.html
tagPrefix: adapter-
bender:
client:
url: http://127.0.0.1:8022/v1/bender
networkTimeout: 5000
namespace: namespace
@Bean
@Primary
@ConfigurationProperties("time.config")
public TimerProperties timerProperties() {
return new TimerProperties();
}
cds:
client:
identity-document-storage:
url: http://127.0.0.1:8022/v1/identity_document_storage
networkTimeout: 5000
storage:
url: http://127.0.0.1:8022/v1/storage
networkTimeout: 5000
hellgate:
client:
url: http://127.0.0.1:8022/v1/proxyhost/provider
networkTimeout: 30000
time:
config:
maxTimePollingMin: 60
pollingDelayMs: 1000
redirectTimeoutMin: 15
exponential: 2
defaultInitialExponential: 2
maxTimeBackOff: 600
maxTimeCoefficient: 2
rest-template:
requestTimeout: 60000
poolTimeout: 10000
connectionTimeout: 10000
maxTotalPooling: 200
defaultMaxPerRoute: 200
networkTimeout: 60000
connectTimeout: 10000
error-mapping:
file: classpath:fixture/errors.json
patternReason: "'%s' - '%s'" # 'code' - 'description'
```

102
pom.xml
View File

@ -12,7 +12,7 @@
</parent>
<artifactId>adapter-bank-spring-boot-starter</artifactId>
<version>0.0.1</version>
<version>0.0.2</version>
<packaging>jar</packaging>
<name>adapter-bank-spring-boot-starter</name>
<description>Spring boot starter for bank adapter</description>
@ -39,26 +39,16 @@
</scm>
<properties>
<maven.compiler.source>15</maven.compiler.source>
<maven.compiler.target>15</maven.compiler.target>
<java.version>15</java.version>
<adapter-client-lib.version>1.0.1</adapter-client-lib.version>
<adapter-thrift-lib.version>1.0.0</adapter-thrift-lib.version>
<adapter-common-lib.version>1.0.0</adapter-common-lib.version>
<damsel.version>1.544-dcd92dd</damsel.version>
<spring-boot.version>2.6.7</spring-boot.version>
<damsel.version>1.563-d384c12</damsel.version>
<cds-proto.version>1.66-01353ce</cds-proto.version>
<spring-boot.version>2.6.3</spring-boot.version>
<woody.version>1.0.4</woody.version>
<geck.version>0.0.1</geck.version>
<lombok.version>1.18.22</lombok.version>
<slf4j-api.version>1.7.30</slf4j-api.version>
<lombok.version>1.18.24</lombok.version>
<slf4j-api.version>1.7.36</slf4j-api.version>
<javax.servlet-api.version>4.0.1</javax.servlet-api.version>
<hibernate-validator.version>6.1.5.Final</hibernate-validator.version>
<error-mapping-java.version>1.0.0</error-mapping-java.version>
<junit.version>4.12</junit.version>
<jackson.version>2.13.2</jackson.version>
<adapter-flow-lib.version>0.1.5</adapter-flow-lib.version>
</properties>
<dependencies>
@ -82,9 +72,22 @@
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>${hibernate-validator.version}</version>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>${jackson.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
<scope>provided</scope>
</dependency>
<!--spring-->
@ -109,21 +112,30 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
<scope>provided</scope>
<exclusions>
<exclusion>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<!--vality-->
<dependency>
<groupId>dev.vality</groupId>
<artifactId>error-mapping-java</artifactId>
<version>${error-mapping-java.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>dev.vality.woody</groupId>
<artifactId>woody-thrift</artifactId>
@ -143,37 +155,37 @@
<scope>provided</scope>
</dependency>
<dependency>
<groupId>dev.vality.adapter-thrift-lib</groupId>
<artifactId>cds-utils</artifactId>
<version>${adapter-thrift-lib.version}</version>
</dependency>
<dependency>
<groupId>dev.vality.adapter-thrift-lib</groupId>
<artifactId>damsel-utils</artifactId>
<version>${adapter-thrift-lib.version}</version>
<groupId>dev.vality</groupId>
<artifactId>bender-proto</artifactId>
<version>1.20-be9cdeb</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>dev.vality.geck</groupId>
<artifactId>serializer</artifactId>
<version>${geck.version}</version>
</dependency>
<dependency>
<groupId>dev.vality.adapter-client-lib</groupId>
<artifactId>hellgate-adapter-client</artifactId>
<version>${adapter-client-lib.version}</version>
</dependency>
<dependency>
<groupId>dev.vality</groupId>
<artifactId>adapter-common-lib</artifactId>
<version>${adapter-common-lib.version}</version>
<artifactId>adapter-flow-lib</artifactId>
<version>${adapter-flow-lib.version}</version>
</dependency>
<!-- test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring-boot.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,25 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.bank.spring.boot.starter.configuration.properties.AdapterProperties;
import dev.vality.adapter.flow.lib.service.TagManagementService;
import dev.vality.adapter.flow.lib.utils.CallbackUrlExtractor;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties({AdapterProperties.class})
public class AdapterConfiguration {
@Bean
public TagManagementService tagManagementService(
dev.vality.adapter.flow.lib.utils.AdapterProperties adapterProperties) {
return new TagManagementService(adapterProperties);
}
@Bean
public CallbackUrlExtractor callbackUrlExtractor(
dev.vality.adapter.flow.lib.utils.AdapterProperties adapterProperties) {
return new CallbackUrlExtractor(adapterProperties);
}
}

View File

@ -0,0 +1,35 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.bank.spring.boot.starter.configuration.properties.BenderClientProperties;
import dev.vality.adapter.common.bender.BenderClient;
import dev.vality.adapter.flow.lib.service.IdGenerator;
import dev.vality.bender.BenderSrv;
import dev.vality.woody.thrift.impl.http.THSpawnClientBuilder;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
@Configuration
@EnableConfigurationProperties({BenderClientProperties.class})
public class BenderConfiguration {
@Bean
public BenderSrv.Iface benderSrv(BenderClientProperties properties) throws IOException {
return new THSpawnClientBuilder()
.withAddress(properties.getUrl().getURI())
.withNetworkTimeout(properties.getNetworkTimeout())
.build(BenderSrv.Iface.class);
}
@Bean
public BenderClient benderClient(BenderSrv.Iface benderSrv, BenderClientProperties properties) {
return new BenderClient(benderSrv, properties.getNamespace());
}
@Bean
public IdGenerator idGenerator(BenderSrv.Iface benderSrv) {
return new IdGenerator(benderSrv);
}
}

View File

@ -0,0 +1,30 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.bank.spring.boot.starter.configuration.properties.CdsIdStorageClientProperties;
import dev.vality.adapter.common.cds.CdsIdStorageClient;
import dev.vality.damsel.identity_document_storage.IdentityDocumentStorageSrv;
import dev.vality.woody.thrift.impl.http.THSpawnClientBuilder;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
@Configuration
@EnableConfigurationProperties(CdsIdStorageClientProperties.class)
public class CdsIdStorageClientConfiguration {
@Bean
public IdentityDocumentStorageSrv.Iface identityDocumentStorageSrv(CdsIdStorageClientProperties properties)
throws IOException {
return new THSpawnClientBuilder()
.withAddress(properties.getUrl().getURI())
.withNetworkTimeout(properties.getNetworkTimeout())
.build(IdentityDocumentStorageSrv.Iface.class);
}
@Bean
public CdsIdStorageClient cdsIdStorageClient(IdentityDocumentStorageSrv.Iface identityDocumentStorageSrv) {
return new CdsIdStorageClient(identityDocumentStorageSrv);
}
}

View File

@ -0,0 +1,29 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.bank.spring.boot.starter.configuration.properties.CdsStorageClientProperties;
import dev.vality.adapter.common.cds.CdsStorageClient;
import dev.vality.cds.storage.StorageSrv;
import dev.vality.woody.thrift.impl.http.THSpawnClientBuilder;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
@Configuration
@EnableConfigurationProperties({CdsStorageClientProperties.class})
public class CdsStorageClientConfiguration {
@Bean
public StorageSrv.Iface storageSrv(CdsStorageClientProperties properties) throws IOException {
return new THSpawnClientBuilder()
.withAddress(properties.getUrl().getURI())
.withNetworkTimeout(properties.getNetworkTimeout())
.build(StorageSrv.Iface.class);
}
@Bean
public CdsStorageClient cdsStorageClient(StorageSrv.Iface storageSrv) {
return new CdsStorageClient(storageSrv);
}
}

View File

@ -0,0 +1,29 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.common.cds.CdsStorageClient;
import dev.vality.adapter.flow.lib.converter.entry.CtxToEntryModelConverter;
import dev.vality.adapter.flow.lib.serde.TemporaryContextDeserializer;
import dev.vality.adapter.flow.lib.service.IdGenerator;
import dev.vality.adapter.flow.lib.service.TemporaryContextService;
import dev.vality.adapter.flow.lib.utils.CallbackUrlExtractor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class CtxToEntryModelConverterConfiguration {
@Bean
public CtxToEntryModelConverter ctxToEntryModelConverter(
CdsStorageClient cdsStorageClient,
TemporaryContextDeserializer temporaryContextDeserializer,
IdGenerator idGenerator,
TemporaryContextService temporaryContextService,
CallbackUrlExtractor callbackUrlExtractor) {
return new CtxToEntryModelConverter(
cdsStorageClient,
temporaryContextDeserializer,
idGenerator,
temporaryContextService,
callbackUrlExtractor);
}
}

View File

@ -1,30 +0,0 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import com.fasterxml.jackson.databind.ObjectMapper;
import dev.vality.adapter.common.state.deserializer.AdapterDeserializer;
import dev.vality.adapter.common.state.deserializer.CallbackDeserializer;
import dev.vality.adapter.common.state.deserializer.RecurrentTokenDeserializer;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@RequiredArgsConstructor
public class DeserializerConfiguration {
@Bean
public CallbackDeserializer callbackDeserializer(ObjectMapper objectMapper) {
return new CallbackDeserializer(objectMapper);
}
@Bean
public AdapterDeserializer adapterDeserializer(ObjectMapper objectMapper) {
return new AdapterDeserializer(objectMapper);
}
@Bean
public RecurrentTokenDeserializer recTokenDeserializer(ObjectMapper objectMapper) {
return new RecurrentTokenDeserializer(objectMapper);
}
}

View File

@ -0,0 +1,14 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.flow.lib.converter.base.EntryModelToBaseRequestModelConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class EntryModelToBaseRequestModelConverterConfiguration {
@Bean
public EntryModelToBaseRequestModelConverter entryModelToBaseRequestModelConverter() {
return new EntryModelToBaseRequestModelConverter();
}
}

View File

@ -0,0 +1,26 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.flow.lib.converter.ExitStateModelToTemporaryContextConverter;
import dev.vality.adapter.flow.lib.converter.exit.ExitModelToProxyResultConverter;
import dev.vality.adapter.flow.lib.flow.ResultIntentResolver;
import dev.vality.adapter.flow.lib.serde.TemporaryContextSerializer;
import dev.vality.adapter.flow.lib.service.IntentResultFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ExitModelToProxyResultConverterConfiguration {
@Bean
public ExitModelToProxyResultConverter exitModelToProxyResultConverter(
IntentResultFactory intentResultFactory,
TemporaryContextSerializer temporaryContextSerializer,
ResultIntentResolver resultIntentResolver,
ExitStateModelToTemporaryContextConverter exitStateModelToTemporaryContextConverter) {
return new ExitModelToProxyResultConverter(
intentResultFactory,
temporaryContextSerializer,
resultIntentResolver,
exitStateModelToTemporaryContextConverter);
}
}

View File

@ -0,0 +1,26 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.flow.lib.converter.ExitStateModelToTemporaryContextConverter;
import dev.vality.adapter.flow.lib.converter.exit.ExitModelToRecTokenProxyResultConverter;
import dev.vality.adapter.flow.lib.flow.RecurrentResultIntentResolver;
import dev.vality.adapter.flow.lib.serde.TemporaryContextSerializer;
import dev.vality.adapter.flow.lib.service.RecurrentIntentResultFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ExitModelToRecTokenProxyResultConverterConfiguration {
@Bean
public ExitModelToRecTokenProxyResultConverter exitModelToRecTokenProxyResultConverter(
RecurrentIntentResultFactory recurrentIntentResultFactory,
TemporaryContextSerializer temporaryContextSerializer,
RecurrentResultIntentResolver recurrentResultIntentResolver,
ExitStateModelToTemporaryContextConverter exitStateModelToTemporaryContextConverter) {
return new ExitModelToRecTokenProxyResultConverter(
recurrentIntentResultFactory,
temporaryContextSerializer,
recurrentResultIntentResolver,
exitStateModelToTemporaryContextConverter);
}
}

View File

@ -0,0 +1,14 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.flow.lib.converter.ExitStateModelToTemporaryContextConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ExitStateModelToTemporaryContextConverterConfiguration {
@Bean
public ExitStateModelToTemporaryContextConverter exitStateModelToTemporaryContextConverter() {
return new ExitStateModelToTemporaryContextConverter();
}
}

View File

@ -0,0 +1,14 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.flow.lib.service.ExponentialBackOffPollingService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ExponentialBackOffPollingServiceConfiguration {
@Bean
public ExponentialBackOffPollingService exponentialBackOffPollingService() {
return new ExponentialBackOffPollingService();
}
}

View File

@ -0,0 +1,29 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.bank.spring.boot.starter.configuration.properties.HellgateClientProperties;
import dev.vality.adapter.common.hellgate.HellgateClient;
import dev.vality.damsel.proxy_provider.ProviderProxyHostSrv;
import dev.vality.woody.thrift.impl.http.THSpawnClientBuilder;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
@Configuration
@EnableConfigurationProperties({HellgateClientProperties.class})
public class HellgateClientConfiguration {
@Bean
public ProviderProxyHostSrv.Iface providerProxyHostSrv(HellgateClientProperties properties) throws IOException {
return new THSpawnClientBuilder()
.withAddress(properties.getUrl().getURI())
.withNetworkTimeout(properties.getNetworkTimeout())
.build(ProviderProxyHostSrv.Iface.class);
}
@Bean
public HellgateClient hellgateClient(ProviderProxyHostSrv.Iface providerProxyHostSrv) {
return new HellgateClient(providerProxyHostSrv);
}
}

View File

@ -0,0 +1,35 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.common.mapper.ErrorMapping;
import dev.vality.adapter.flow.lib.serde.ParametersSerializer;
import dev.vality.adapter.flow.lib.service.ExponentialBackOffPollingService;
import dev.vality.adapter.flow.lib.service.IntentResultFactory;
import dev.vality.adapter.flow.lib.service.PollingInfoService;
import dev.vality.adapter.flow.lib.service.TagManagementService;
import dev.vality.adapter.flow.lib.utils.CallbackUrlExtractor;
import dev.vality.adapter.flow.lib.utils.TimerProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class IntentResultFactoryConfiguration {
@Bean
public IntentResultFactory intentResultFactory(
TimerProperties timerProperties,
CallbackUrlExtractor callbackUrlExtractor,
TagManagementService tagManagementService,
ParametersSerializer parametersSerializer,
PollingInfoService pollingInfoService,
ErrorMapping errorMapping,
ExponentialBackOffPollingService exponentialBackOffPollingService) {
return new IntentResultFactory(
timerProperties,
callbackUrlExtractor,
tagManagementService,
parametersSerializer,
pollingInfoService,
errorMapping,
exponentialBackOffPollingService);
}
}

View File

@ -0,0 +1,14 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.common.component.LoggingInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class LoggingInterceptorConfiguration {
@Bean
public LoggingInterceptor loggingInterceptor() {
return new LoggingInterceptor();
}
}

View File

@ -0,0 +1,23 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.flow.lib.handler.callback.PaymentCallbackHandler;
import dev.vality.adapter.flow.lib.serde.TemporaryContextDeserializer;
import dev.vality.adapter.flow.lib.serde.TemporaryContextSerializer;
import dev.vality.adapter.flow.lib.service.TemporaryContextService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class PaymentCallbackHandlerConfiguration {
@Bean
public PaymentCallbackHandler paymentCallbackHandler(
TemporaryContextDeserializer temporaryContextDeserializer,
TemporaryContextSerializer temporaryContextSerializer,
TemporaryContextService temporaryContextService) {
return new PaymentCallbackHandler(
temporaryContextDeserializer,
temporaryContextSerializer,
temporaryContextService);
}
}

View File

@ -0,0 +1,36 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.bank.spring.boot.starter.configuration.utils.CommonHandlerUtils;
import dev.vality.adapter.flow.lib.client.RemoteClient;
import dev.vality.adapter.flow.lib.converter.base.EntryModelToBaseRequestModelConverter;
import dev.vality.adapter.flow.lib.converter.entry.CtxToEntryModelConverter;
import dev.vality.adapter.flow.lib.converter.exit.ExitModelToProxyResultConverter;
import dev.vality.adapter.flow.lib.flow.StepResolver;
import dev.vality.adapter.flow.lib.handler.ServerFlowHandler;
import dev.vality.adapter.flow.lib.model.BaseResponseModel;
import dev.vality.adapter.flow.lib.model.EntryStateModel;
import dev.vality.adapter.flow.lib.model.ExitStateModel;
import dev.vality.adapter.flow.lib.processor.Processor;
import dev.vality.damsel.proxy_provider.PaymentContext;
import dev.vality.damsel.proxy_provider.PaymentProxyResult;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class PaymentServerFlowHandlerConfiguration {
@Bean
public ServerFlowHandler<PaymentContext, PaymentProxyResult> paymentServerFlowHandler(
RemoteClient remoteClient,
EntryModelToBaseRequestModelConverter entryModelToBaseRequestModelConverter,
Processor<ExitStateModel, BaseResponseModel, EntryStateModel> baseProcessor,
StepResolver<EntryStateModel, ExitStateModel> stepResolver,
CtxToEntryModelConverter ctxToEntryModelConverter,
ExitModelToProxyResultConverter exitModelToProxyResultConverter) {
return new ServerFlowHandler<>(
CommonHandlerUtils.getHandlers(remoteClient, entryModelToBaseRequestModelConverter, baseProcessor),
stepResolver,
ctxToEntryModelConverter,
exitModelToProxyResultConverter);
}
}

View File

@ -0,0 +1,20 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.flow.lib.model.BaseResponseModel;
import dev.vality.adapter.flow.lib.model.EntryStateModel;
import dev.vality.adapter.flow.lib.model.ExitStateModel;
import dev.vality.adapter.flow.lib.processor.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ProcessorConfiguration {
@Bean
public Processor<ExitStateModel, BaseResponseModel, EntryStateModel> baseProcessor() {
ErrorProcessor errorProcessor = new ErrorProcessor();
SuccessFinishProcessor baseProcessor = new SuccessFinishProcessor(errorProcessor);
RedirectProcessor redirectProcessor = new RedirectProcessor(baseProcessor);
return new RetryProcessor(redirectProcessor);
}
}

View File

@ -0,0 +1,26 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.common.cds.CdsStorageClient;
import dev.vality.adapter.flow.lib.converter.entry.RecCtxToEntryModelConverter;
import dev.vality.adapter.flow.lib.serde.TemporaryContextDeserializer;
import dev.vality.adapter.flow.lib.service.IdGenerator;
import dev.vality.adapter.flow.lib.service.TemporaryContextService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RecCtxToEntryModelConverterConfiguration {
@Bean
public RecCtxToEntryModelConverter recCtxToEntryModelConverter(
CdsStorageClient cdsStorageClient,
TemporaryContextDeserializer temporaryContextDeserializer,
IdGenerator idGenerator,
TemporaryContextService temporaryContextService) {
return new RecCtxToEntryModelConverter(
temporaryContextDeserializer,
cdsStorageClient,
idGenerator,
temporaryContextService);
}
}

View File

@ -0,0 +1,32 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.common.mapper.ErrorMapping;
import dev.vality.adapter.flow.lib.service.ExponentialBackOffPollingService;
import dev.vality.adapter.flow.lib.service.PollingInfoService;
import dev.vality.adapter.flow.lib.service.RecurrentIntentResultFactory;
import dev.vality.adapter.flow.lib.service.TagManagementService;
import dev.vality.adapter.flow.lib.utils.CallbackUrlExtractor;
import dev.vality.adapter.flow.lib.utils.TimerProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RecurrentIntentResultFactoryConfiguration {
@Bean
public RecurrentIntentResultFactory recurrentIntentResultFactory(
TimerProperties timerProperties,
CallbackUrlExtractor callbackUrlExtractor,
TagManagementService tagManagementService,
PollingInfoService pollingInfoService,
ErrorMapping errorMapping,
ExponentialBackOffPollingService exponentialBackOffPollingService) {
return new RecurrentIntentResultFactory(
timerProperties,
callbackUrlExtractor,
tagManagementService,
pollingInfoService,
errorMapping,
exponentialBackOffPollingService);
}
}

View File

@ -0,0 +1,17 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.flow.lib.flow.RecurrentResultIntentResolver;
import dev.vality.adapter.flow.lib.flow.simple.SimpleRedirectGenerateTokenResultIntentResolver;
import dev.vality.adapter.flow.lib.service.RecurrentIntentResultFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RecurrentResultIntentResolverConfiguration {
@Bean
public RecurrentResultIntentResolver recurrentResultIntentResolver(
RecurrentIntentResultFactory recurrentIntentResultFactory) {
return new SimpleRedirectGenerateTokenResultIntentResolver(recurrentIntentResultFactory);
}
}

View File

@ -0,0 +1,23 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.flow.lib.handler.callback.RecurrentTokenCallbackHandler;
import dev.vality.adapter.flow.lib.serde.TemporaryContextDeserializer;
import dev.vality.adapter.flow.lib.serde.TemporaryContextSerializer;
import dev.vality.adapter.flow.lib.service.TemporaryContextService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RecurrentTokenCallbackHandlerConfiguration {
@Bean
public RecurrentTokenCallbackHandler recurrentTokenCallbackHandler(
TemporaryContextDeserializer temporaryContextDeserializer,
TemporaryContextSerializer temporaryContextSerializer,
TemporaryContextService temporaryContextService) {
return new RecurrentTokenCallbackHandler(
temporaryContextDeserializer,
temporaryContextSerializer,
temporaryContextService);
}
}

View File

@ -0,0 +1,14 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.common.component.RequestLoggingAspect;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RequestLoggingAspectConfiguration {
@Bean
public RequestLoggingAspect requestLoggingAspect() {
return new RequestLoggingAspect();
}
}

View File

@ -0,0 +1,129 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import lombok.RequiredArgsConstructor;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.ssl.SSLContextBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.actuate.metrics.web.client.MetricsRestTemplateCustomizer;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.DefaultResponseErrorHandler;
import org.springframework.web.client.RestTemplate;
import javax.net.ssl.SSLContext;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.time.Duration;
@Configuration
@RequiredArgsConstructor
public class RestTemplateConfiguration {
@Value("${rest-template.maxTotalPooling}")
private int maxTotalPooling;
@Value("${rest-template.defaultMaxPerRoute}")
private int defaultMaxPerRoute;
@Value("${rest-template.requestTimeout}")
private int requestTimeout;
@Value("${rest-template.poolTimeout}")
private int poolTimeout;
@Value("${rest-template.connectionTimeout}")
private int connectionTimeout;
@Bean
public PoolingHttpClientConnectionManager poolingHttpClientConnectionManager() {
PoolingHttpClientConnectionManager result = new PoolingHttpClientConnectionManager();
result.setMaxTotal(maxTotalPooling);
result.setDefaultMaxPerRoute(defaultMaxPerRoute);
return result;
}
@Bean
public RequestConfig requestConfig() {
return RequestConfig.custom()
.setConnectionRequestTimeout(poolTimeout)
.setConnectTimeout(connectionTimeout)
.setSocketTimeout(requestTimeout)
.build();
}
@Bean
public SSLContext sslContext() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
return new SSLContextBuilder()
.loadTrustMaterial(null, (x509Certificates, s) -> true)
.build();
}
@Bean
public CloseableHttpClient httpClient(
PoolingHttpClientConnectionManager manager,
RequestConfig requestConfig,
SSLContext sslContext) {
return HttpClients.custom()
.setSSLHostnameVerifier(NoopHostnameVerifier.INSTANCE)
.setSSLContext(sslContext)
.setConnectionManager(manager)
.setDefaultRequestConfig(requestConfig)
.disableAutomaticRetries()
.setConnectionManagerShared(true)
.build();
}
@Bean
public HttpComponentsClientHttpRequestFactory requestFactory(CloseableHttpClient httpClient) {
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory();
requestFactory.setHttpClient(httpClient);
return requestFactory;
}
@Bean
public RestTemplateBuilder restTemplateBuilder(
HttpComponentsClientHttpRequestFactory requestFactory,
MetricsRestTemplateCustomizer metricsRestTemplateCustomizer) {
return new RestTemplateBuilder()
.requestFactory(() -> requestFactory)
.additionalCustomizers(metricsRestTemplateCustomizer);
}
@Bean
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
RestTemplate restTemplate = restTemplateBuilder
.setConnectTimeout(Duration.ofMillis(connectionTimeout))
.setReadTimeout(Duration.ofMillis(requestTimeout))
.build();
restTemplate.setErrorHandler(getDefaultResponseErrorHandler());
setMessageConverter(restTemplate);
return restTemplate;
}
private void setMessageConverter(RestTemplate restTemplate) {
for (HttpMessageConverter converter : restTemplate.getMessageConverters()) {
if (converter instanceof StringHttpMessageConverter) {
((StringHttpMessageConverter) converter).setWriteAcceptCharset(false);
}
}
}
private DefaultResponseErrorHandler getDefaultResponseErrorHandler() {
return new DefaultResponseErrorHandler() {
@Override
protected boolean hasError(HttpStatus statusCode) {
return false;
}
};
}
}

View File

@ -0,0 +1,16 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.flow.lib.flow.ResultIntentResolver;
import dev.vality.adapter.flow.lib.flow.simple.SimpleRedirectWithPollingResultIntentResolver;
import dev.vality.adapter.flow.lib.service.IntentResultFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ResultIntentResolverConfiguration {
@Bean
public ResultIntentResolver resultIntentResolver(IntentResultFactory intentResultFactory) {
return new SimpleRedirectWithPollingResultIntentResolver(intentResultFactory);
}
}

View File

@ -0,0 +1,33 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import com.fasterxml.jackson.databind.ObjectMapper;
import dev.vality.adapter.flow.lib.serde.ParametersDeserializer;
import dev.vality.adapter.flow.lib.serde.ParametersSerializer;
import dev.vality.adapter.flow.lib.serde.TemporaryContextDeserializer;
import dev.vality.adapter.flow.lib.serde.TemporaryContextSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SerdeConfiguration {
@Bean
public TemporaryContextDeserializer adapterDeserializer(ObjectMapper objectMapper) {
return new TemporaryContextDeserializer(objectMapper);
}
@Bean
public TemporaryContextSerializer adapterSerializer(ObjectMapper objectMapper) {
return new TemporaryContextSerializer(objectMapper);
}
@Bean
public ParametersDeserializer parametersDeserializer(ObjectMapper objectMapper) {
return new ParametersDeserializer(objectMapper);
}
@Bean
public ParametersSerializer parametersSerializer(ObjectMapper objectMapper) {
return new ParametersSerializer(objectMapper);
}
}

View File

@ -1,30 +0,0 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import com.fasterxml.jackson.databind.ObjectMapper;
import dev.vality.adapter.common.state.serializer.AdapterSerializer;
import dev.vality.adapter.common.state.serializer.CallbackSerializer;
import dev.vality.adapter.common.state.serializer.RecurrentTokenSerializer;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@RequiredArgsConstructor
public class SerializerConfiguration {
@Bean
public CallbackSerializer callbackSerializer(ObjectMapper objectMapper) {
return new CallbackSerializer(objectMapper);
}
@Bean
public AdapterSerializer adapterSerializer(ObjectMapper objectMapper) {
return new AdapterSerializer(objectMapper);
}
@Bean
public RecurrentTokenSerializer recTokenSerializer(ObjectMapper objectMapper) {
return new RecurrentTokenSerializer(objectMapper);
}
}

View File

@ -0,0 +1,30 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.flow.lib.handler.ProxyProviderServiceImpl;
import dev.vality.adapter.flow.lib.handler.ServerFlowHandler;
import dev.vality.adapter.flow.lib.handler.ServerHandlerLogDecorator;
import dev.vality.adapter.flow.lib.handler.callback.PaymentCallbackHandler;
import dev.vality.adapter.flow.lib.handler.callback.RecurrentTokenCallbackHandler;
import dev.vality.adapter.flow.lib.validator.AdapterConfigurationValidator;
import dev.vality.damsel.proxy_provider.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ServerHandlerLogDecoratorConfiguration {
@Bean
public ProviderProxySrv.Iface serverHandlerLogDecorator(
PaymentCallbackHandler paymentCallbackHandler,
RecurrentTokenCallbackHandler recurrentTokenCallbackHandler,
ServerFlowHandler<PaymentContext, PaymentProxyResult> paymentServerFlowHandler,
ServerFlowHandler<RecurrentTokenContext, RecurrentTokenProxyResult> tokenServerFlowHandler,
AdapterConfigurationValidator adapterConfigurationValidator) {
return new ServerHandlerLogDecorator(new ProxyProviderServiceImpl(
paymentCallbackHandler,
recurrentTokenCallbackHandler,
paymentServerFlowHandler,
tokenServerFlowHandler,
adapterConfigurationValidator));
}
}

View File

@ -1,17 +1,16 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import com.fasterxml.jackson.databind.ObjectMapper;
import dev.vality.adapter.common.mapper.SimpleErrorMapping;
import dev.vality.adapter.common.mapper.SimpleObjectMapper;
import dev.vality.error.mapping.ErrorMapping;
import java.io.IOException;
import dev.vality.adapter.common.component.SimpleErrorMapping;
import dev.vality.adapter.common.mapper.ErrorMapping;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import java.io.IOException;
@Configuration
public class AppConfiguration {
public class SimpleErrorMappingConfiguration {
@Value("${error-mapping.file}")
private Resource errorMappingFilePath;
@ -24,10 +23,4 @@ public class AppConfiguration {
return new SimpleErrorMapping(errorMappingFilePath, errorMappingPattern).createErrorMapping();
}
@Bean
public ObjectMapper objectMapper() {
return new SimpleObjectMapper().createSimpleObjectMapperFactory();
}
}

View File

@ -0,0 +1,16 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import com.fasterxml.jackson.databind.ObjectMapper;
import dev.vality.adapter.common.component.SimpleObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SimpleObjectMapperConfiguration {
@Bean
public ObjectMapper objectMapper() {
return new SimpleObjectMapper().createSimpleObjectMapperFactory();
}
}

View File

@ -0,0 +1,15 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.flow.lib.serde.ParametersDeserializer;
import dev.vality.adapter.flow.lib.service.TemporaryContextService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class TemporaryContextServiceConfiguration {
@Bean
public TemporaryContextService temporaryContextService(ParametersDeserializer parametersDeserializer) {
return new TemporaryContextService(parametersDeserializer);
}
}

View File

@ -0,0 +1,26 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.common.hellgate.HellgateClient;
import dev.vality.adapter.flow.lib.serde.ParametersDeserializer;
import dev.vality.adapter.flow.lib.serde.ParametersSerializer;
import dev.vality.adapter.flow.lib.service.TagManagementService;
import dev.vality.adapter.flow.lib.service.ThreeDsAdapterService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ThreeDsAdapterServiceConfiguration {
@Bean
public ThreeDsAdapterService threeDsAdapterService(
HellgateClient hellgateClient,
ParametersSerializer parametersSerializer,
ParametersDeserializer parametersDeserializer,
TagManagementService tagManagementService) {
return new ThreeDsAdapterService(
hellgateClient,
parametersSerializer,
parametersDeserializer,
tagManagementService);
}
}

View File

@ -0,0 +1,18 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.bank.spring.boot.starter.configuration.properties.TimerProperties;
import dev.vality.adapter.flow.lib.service.PollingInfoService;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties({TimerProperties.class})
public class TimerConfiguration {
@Bean
public PollingInfoService pollingInfoService(
dev.vality.adapter.flow.lib.utils.TimerProperties timerProperties) {
return new PollingInfoService(timerProperties);
}
}

View File

@ -0,0 +1,36 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.bank.spring.boot.starter.configuration.utils.CommonHandlerUtils;
import dev.vality.adapter.flow.lib.client.RemoteClient;
import dev.vality.adapter.flow.lib.converter.base.EntryModelToBaseRequestModelConverter;
import dev.vality.adapter.flow.lib.converter.entry.RecCtxToEntryModelConverter;
import dev.vality.adapter.flow.lib.converter.exit.ExitModelToRecTokenProxyResultConverter;
import dev.vality.adapter.flow.lib.flow.StepResolver;
import dev.vality.adapter.flow.lib.handler.ServerFlowHandler;
import dev.vality.adapter.flow.lib.model.BaseResponseModel;
import dev.vality.adapter.flow.lib.model.EntryStateModel;
import dev.vality.adapter.flow.lib.model.ExitStateModel;
import dev.vality.adapter.flow.lib.processor.Processor;
import dev.vality.damsel.proxy_provider.RecurrentTokenContext;
import dev.vality.damsel.proxy_provider.RecurrentTokenProxyResult;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class TokenServerFlowHandlerConfiguration {
@Bean
public ServerFlowHandler<RecurrentTokenContext, RecurrentTokenProxyResult> tokenServerFlowHandler(
RemoteClient remoteClient,
EntryModelToBaseRequestModelConverter entryModelToBaseRequestModelConverter,
Processor<ExitStateModel, BaseResponseModel, EntryStateModel> baseProcessor,
StepResolver<EntryStateModel, ExitStateModel> stepResolver,
RecCtxToEntryModelConverter recCtxToEntryStateModelConverter,
ExitModelToRecTokenProxyResultConverter exitModelToRecTokenProxyResultConverter) {
return new ServerFlowHandler<>(
CommonHandlerUtils.getHandlers(remoteClient, entryModelToBaseRequestModelConverter, baseProcessor),
stepResolver,
recCtxToEntryStateModelConverter,
exitModelToRecTokenProxyResultConverter);
}
}

View File

@ -0,0 +1,14 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration.properties;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;
@ConfigurationProperties(prefix = "adapter")
@Setter
@Getter
@Validated
public class AdapterProperties extends dev.vality.adapter.flow.lib.utils.AdapterProperties {
}

View File

@ -0,0 +1,26 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration.properties;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.core.io.Resource;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.NotNull;
@ConfigurationProperties(prefix = "bender.client")
@Getter
@Setter
@Validated
public class BenderClientProperties {
@NotNull
private Resource url;
@NotNull
private int networkTimeout = 5000;
@NotNull
private String namespace;
}

View File

@ -0,0 +1,23 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration.properties;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.core.io.Resource;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.NotNull;
@ConfigurationProperties(prefix = "cds.client.identity-document-storage")
@Validated
@Getter
@Setter
public class CdsIdStorageClientProperties {
@NotNull
private Resource url;
@NotNull
private int networkTimeout = 5000;
}

View File

@ -0,0 +1,23 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration.properties;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.core.io.Resource;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.NotNull;
@ConfigurationProperties(prefix = "cds.client.storage")
@Validated
@Getter
@Setter
public class CdsStorageClientProperties {
@NotNull
private Resource url;
@NotNull
private int networkTimeout = 5000;
}

View File

@ -0,0 +1,23 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration.properties;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.core.io.Resource;
import org.springframework.validation.annotation.Validated;
import javax.validation.constraints.NotNull;
@ConfigurationProperties(prefix = "hellgate.client")
@Validated
@Getter
@Setter
public class HellgateClientProperties {
@NotNull
private Resource url;
@NotNull
private int networkTimeout = 5000;
}

View File

@ -0,0 +1,14 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration.properties;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;
@ConfigurationProperties("time.config")
@Validated
@Getter
@Setter
public class TimerProperties extends dev.vality.adapter.flow.lib.utils.TimerProperties {
}

View File

@ -0,0 +1,30 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration.utils;
import dev.vality.adapter.flow.lib.client.RemoteClient;
import dev.vality.adapter.flow.lib.converter.base.EntryModelToBaseRequestModelConverter;
import dev.vality.adapter.flow.lib.handler.CommonHandler;
import dev.vality.adapter.flow.lib.handler.payment.*;
import dev.vality.adapter.flow.lib.model.BaseResponseModel;
import dev.vality.adapter.flow.lib.model.EntryStateModel;
import dev.vality.adapter.flow.lib.model.ExitStateModel;
import dev.vality.adapter.flow.lib.processor.Processor;
import java.util.List;
public class CommonHandlerUtils {
public static List<CommonHandler<ExitStateModel, EntryStateModel>> getHandlers(
RemoteClient remoteClient,
EntryModelToBaseRequestModelConverter entryModelToBaseRequestModelConverter,
Processor<ExitStateModel, BaseResponseModel, EntryStateModel> baseProcessor) {
return List.of(
new AuthHandler(remoteClient, entryModelToBaseRequestModelConverter, baseProcessor),
new CancelHandler(remoteClient, entryModelToBaseRequestModelConverter, baseProcessor),
new CaptureHandler(remoteClient, entryModelToBaseRequestModelConverter, baseProcessor),
new StatusHandler(remoteClient, entryModelToBaseRequestModelConverter, baseProcessor),
new DoNothingHandler(),
new PaymentHandler(remoteClient, entryModelToBaseRequestModelConverter, baseProcessor),
new GenerateTokenHandler(remoteClient, entryModelToBaseRequestModelConverter, baseProcessor),
new RefundHandler(remoteClient, entryModelToBaseRequestModelConverter, baseProcessor));
}
}

View File

@ -1,42 +0,0 @@
package dev.vality.adapter.bank.spring.boot.starter.controller;
import dev.vality.adapter.common.controller.AdapterController;
import dev.vality.adapter.common.state.deserializer.CallbackDeserializer;
import dev.vality.adapter.common.state.serializer.CallbackSerializer;
import dev.vality.adapter.helpers.hellgate.HellgateAdapterClient;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("/${server.rest.endpoint}")
public class AdapterControllerDecorator {
private AdapterController adapterController;
public AdapterControllerDecorator(
HellgateAdapterClient hgClient,
CallbackSerializer callbackSerializer,
CallbackDeserializer callbackDeserializer
) {
adapterController = new AdapterController(hgClient, callbackSerializer, callbackDeserializer);
}
@PostMapping(value = "term_url")
public String receivePaymentIncomingParameters(HttpServletRequest servletRequest,
HttpServletResponse servletResponse) throws IOException {
return adapterController.receivePaymentIncomingParameters(servletRequest, servletResponse);
}
@PostMapping(value = "rec_term_url")
public String receiveRecurrentIncomingParameters(HttpServletRequest servletRequest,
HttpServletResponse servletResponse) throws IOException {
return adapterController.receiveRecurrentIncomingParameters(servletRequest, servletResponse);
}
}

View File

@ -1,63 +0,0 @@
package dev.vality.adapter.bank.spring.boot.starter.flow;
import dev.vality.adapter.bank.spring.boot.starter.model.GeneralEntryStateModel;
import dev.vality.adapter.bank.spring.boot.starter.model.GeneralExitStateModel;
import dev.vality.adapter.common.enums.Step;
public class DefaultStepResolverImpl implements StepResolver<GeneralEntryStateModel, GeneralExitStateModel> {
@Override
public Step resolveEntry(GeneralEntryStateModel stateModel) {
switch (stateModel.getTargetStatus()) {
case PROCESSED:
return resolveProcessedSteps(stateModel);
case CAPTURED:
return Step.CAPTURE;
case REFUNDED:
return Step.REFUND;
case CANCELLED:
return Step.CANCEL;
default:
throw new IllegalStateException("Unknown status of entryState");
}
}
private Step resolveProcessedSteps(GeneralEntryStateModel stateModel) {
if (isNextThreeDs(stateModel)) {
return Step.FINISH_THREE_DS;
} else if (stateModel.isMakeRecurrent()) {
return Step.AUTH_RECURRENT;
} else if (stateModel.getRecToken() != null && !stateModel.getRecToken().isEmpty()) {
return Step.RECURRENT;
}
return Step.AUTH;
}
private static boolean isNextThreeDs(GeneralEntryStateModel stateModel) {
Step step = stateModel.getAdapterContext().getStep();
return stateModel.getAdapterContext() != null
&& (Step.FINISH_THREE_DS.equals(step) || Step.GENERATE_TOKEN_FINISH_THREE_DS.equals(step));
}
@Override
public Step resolveExit(GeneralExitStateModel stateModel) {
Step step = stateModel.getGeneralEntryStateModel().getAdapterContext().getStep();
Step nextStep = stateModel.getAdapterContext().getStep();
switch (step) {
case AUTH_RECURRENT:
if (Step.FINISH_THREE_DS.equals(nextStep)) {
return Step.GENERATE_TOKEN_FINISH_THREE_DS;
} else {
return Step.GENERATE_TOKEN_CAPTURE;
}
case GENERATE_TOKEN_FINISH_THREE_DS:
return Step.GENERATE_TOKEN_CAPTURE;
case GENERATE_TOKEN_CAPTURE:
return Step.GENERATE_TOKEN_REFUND;
case GENERATE_TOKEN_REFUND:
return Step.GENERATE_TOKEN_FINISH;
default:
return nextStep;
}
}
}

View File

@ -1,13 +0,0 @@
package dev.vality.adapter.bank.spring.boot.starter.flow;
import dev.vality.adapter.bank.spring.boot.starter.model.GeneralEntryStateModel;
import dev.vality.adapter.bank.spring.boot.starter.model.GeneralExitStateModel;
import dev.vality.adapter.common.enums.Step;
public interface StepResolver<T extends GeneralEntryStateModel, R extends GeneralExitStateModel> {
Step resolveEntry(T entryStateModel);
Step resolveExit(R exitStateModel);
}

View File

@ -1,22 +0,0 @@
package dev.vality.adapter.bank.spring.boot.starter.logging.annotation;
import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMethod;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface GetLogging {
@AliasFor("value")
String endpoint() default "/";
@AliasFor("endpoint")
String value() default "/";
RequestMethod method() default RequestMethod.GET;
}

View File

@ -1,22 +0,0 @@
package dev.vality.adapter.bank.spring.boot.starter.logging.annotation;
import org.springframework.core.annotation.AliasFor;
import org.springframework.web.bind.annotation.RequestMethod;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface PostLogging {
@AliasFor("value")
String endpoint() default "/";
@AliasFor("endpoint")
String value() default "/";
RequestMethod method() default RequestMethod.POST;
}

View File

@ -1,61 +0,0 @@
package dev.vality.adapter.bank.spring.boot.starter.logging.aspect;
import dev.vality.adapter.bank.spring.boot.starter.logging.annotation.GetLogging;
import dev.vality.adapter.bank.spring.boot.starter.logging.annotation.PostLogging;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.web.bind.annotation.RequestMethod;
@Slf4j
@Aspect
@Configuration
public class RequestLoggingAspect {
private static final String REQUEST_LOG = "Request [{} {}]: {}";
private static final String RESPONSE_LOG = "Response [{} {}]: {}";
@Around("@annotation(dev.vality.adapter.bank.spring.boot.starter.logging.annotation.GetLogging)")
public Object logGetRequest(ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
GetLogging getLogging = AnnotationUtils.findAnnotation(signature.getMethod(), GetLogging.class);
RequestMethod method = getLogging.method();
String endpoint = getLogging.value();
return log(joinPoint, method, endpoint);
}
@Around("@annotation(dev.vality.adapter.bank.spring.boot.starter.logging.annotation.PostLogging)")
public Object logPostRequest(ProceedingJoinPoint joinPoint) throws Throwable {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
PostLogging postLogging = AnnotationUtils.findAnnotation(signature.getMethod(), PostLogging.class);
RequestMethod method = postLogging.method();
String endpoint = postLogging.value();
return log(joinPoint, method, endpoint);
}
private Object log(
ProceedingJoinPoint joinPoint,
RequestMethod method,
String endpoint) throws Throwable {
if (joinPoint.getArgs().length != 1) {
log.debug("Unable to log request. Unsupported method signature with more than one argument: {}",
joinPoint.getArgs());
return joinPoint.proceed();
}
Object request = joinPoint.getArgs()[0];
log.info(REQUEST_LOG, method, endpoint, request);
Object response = joinPoint.proceed();
log.info(RESPONSE_LOG, method, endpoint, response);
return response;
}
}

View File

@ -1,60 +0,0 @@
package dev.vality.adapter.bank.spring.boot.starter.model;
import dev.vality.adapter.common.enums.TargetStatus;
import dev.vality.adapter.common.model.AdapterContext;
import java.util.Map;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GeneralEntryStateModel {
@ToString.Exclude
private String pan;
@ToString.Exclude
private Byte expMonth;
@ToString.Exclude
private Short expYear;
@ToString.Exclude
private String cvv2;
@ToString.Exclude
private String cardHolder;
private String orderId;
private Long amount;
private Short currencyCode;
private String currencySymbolCode;
private String createdAt;
private String ip;
private String email;
private String phone;
private Long refundAmount;
private String refundId;
private String invoiceDetails;
private String callbackUrl;
@ToString.Exclude
private Map<String, String> options;
private AdapterContext adapterContext;
private TargetStatus targetStatus;
private String recToken;
private boolean makeRecurrent;
private String tokenProvider;
private String cryptogram;
private String eci;
private String trxId;
private Map<String, String> trxExtra;
}

View File

@ -1,23 +0,0 @@
package dev.vality.adapter.bank.spring.boot.starter.model;
import dev.vality.adapter.common.model.AdapterContext;
import java.util.Map;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GeneralExitStateModel {
private String errorCode;
private String errorMessage;
private AdapterContext adapterContext;
private GeneralEntryStateModel generalEntryStateModel;
private Map<String, String> trxExtra;
}

View File

@ -1,9 +0,0 @@
package dev.vality.adapter.bank.spring.boot.starter.service;
import dev.vality.adapter.bank.spring.boot.starter.model.GeneralExitStateModel;
import java.util.Map;
public interface ThreeDsPropertiesService {
Map<String, String> initProperties(GeneralExitStateModel generalExitStateModel);
}

View File

@ -1,33 +0,0 @@
package dev.vality.adapter.bank.spring.boot.starter.service;
import dev.vality.adapter.bank.spring.boot.starter.model.GeneralExitStateModel;
import dev.vality.adapter.common.constants.ThreeDsFields;
import dev.vality.adapter.common.model.AdapterContext;
import dev.vality.adapter.common.properties.CommonAdapterProperties;
import dev.vality.adapter.common.utils.converter.RedirectUtils;
import java.util.HashMap;
import java.util.Map;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class ThreeDsPropertiesServiceImpl implements ThreeDsPropertiesService {
private final CommonAdapterProperties adapterProperties;
@Override
public Map<String, String> initProperties(GeneralExitStateModel generalExitStateModel) {
Map<String, String> params = new HashMap<>();
AdapterContext adapterContext = generalExitStateModel.getAdapterContext();
params.put(ThreeDsFields.PA_REQ.getValue(), adapterContext.getPaReq());
params.put(ThreeDsFields.MD.getValue(), adapterContext.getMd());
params.put(ThreeDsFields.TERM_URL.getValue(), RedirectUtils.getCallbackUrl(
adapterProperties.getCallbackUrl(),
adapterProperties.getPathCallbackUrl())
);
return params;
}
}

View File

@ -1,7 +1,33 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
dev.vality.adapter.bank.spring.boot.starter.configuration.AppConfiguration,\
dev.vality.adapter.bank.spring.boot.starter.configuration.SerializerConfiguration,\
dev.vality.adapter.bank.spring.boot.starter.configuration.DeserializerConfiguration,\
dev.vality.adapter.bank.spring.boot.starter.controller.AdapterControllerDecorator,\
dev.vality.adapter.bank.spring.boot.starter.service.ThreeDsPropertiesServiceImpl,\
dev.vality.adapter.bank.spring.boot.starter.logging.aspect.RequestLoggingAspect
dev.vality.adapter.bank.spring.boot.starter.configuration.SimpleObjectMapperConfiguration,\
dev.vality.adapter.bank.spring.boot.starter.configuration.SimpleErrorMappingConfiguration,\
dev.vality.adapter.bank.spring.boot.starter.configuration.RestTemplateConfiguration,\
dev.vality.adapter.bank.spring.boot.starter.configuration.RequestLoggingAspectConfiguration,\
dev.vality.adapter.bank.spring.boot.starter.configuration.NetworkConfiguration,\
dev.vality.adapter.bank.spring.boot.starter.configuration.LoggingInterceptorConfiguration,\
dev.vality.adapter.bank.spring.boot.starter.configuration.HellgateClientConfiguration,\
dev.vality.adapter.bank.spring.boot.starter.configuration.CdsStorageClientConfiguration,\
dev.vality.adapter.bank.spring.boot.starter.configuration.CdsIdStorageClientConfiguration,\
dev.vality.adapter.bank.spring.boot.starter.configuration.BenderConfiguration, \
dev.vality.adapter.bank.spring.boot.starter.configuration.AdapterConfiguration, \
dev.vality.adapter.bank.spring.boot.starter.configuration.TimerConfiguration, \
dev.vality.adapter.bank.spring.boot.starter.configuration.SerdeConfiguration, \
dev.vality.adapter.bank.spring.boot.starter.configuration.ProcessorConfiguration, \
dev.vality.adapter.bank.spring.boot.starter.configuration.CtxToEntryModelConverterConfiguration, \
dev.vality.adapter.bank.spring.boot.starter.configuration.EntryModelToBaseRequestModelConverterConfiguration, \
dev.vality.adapter.bank.spring.boot.starter.configuration.ExitModelToProxyResultConverterConfiguration, \
dev.vality.adapter.bank.spring.boot.starter.configuration.ExitModelToRecTokenProxyResultConverterConfiguration, \
dev.vality.adapter.bank.spring.boot.starter.configuration.ExitStateModelToTemporaryContextConverterConfiguration, \
dev.vality.adapter.bank.spring.boot.starter.configuration.ExponentialBackOffPollingServiceConfiguration, \
dev.vality.adapter.bank.spring.boot.starter.configuration.IntentResultFactoryConfiguration, \
dev.vality.adapter.bank.spring.boot.starter.configuration.PaymentCallbackHandlerConfiguration, \
dev.vality.adapter.bank.spring.boot.starter.configuration.PaymentServerFlowHandlerConfiguration, \
dev.vality.adapter.bank.spring.boot.starter.configuration.RecCtxToEntryModelConverterConfiguration, \
dev.vality.adapter.bank.spring.boot.starter.configuration.RecurrentIntentResultFactoryConfiguration, \
dev.vality.adapter.bank.spring.boot.starter.configuration.RecurrentResultIntentResolverConfiguration, \
dev.vality.adapter.bank.spring.boot.starter.configuration.RecurrentTokenCallbackHandlerConfiguration, \
dev.vality.adapter.bank.spring.boot.starter.configuration.ResultIntentResolverConfiguration, \
dev.vality.adapter.bank.spring.boot.starter.configuration.ServerHandlerLogDecoratorConfiguration, \
dev.vality.adapter.bank.spring.boot.starter.configuration.TemporaryContextServiceConfiguration, \
dev.vality.adapter.bank.spring.boot.starter.configuration.ThreeDsAdapterServiceConfiguration, \
dev.vality.adapter.bank.spring.boot.starter.configuration.TokenServerFlowHandlerConfiguration

View File

@ -1,9 +0,0 @@
---
time.config:
redirectTimeout: 600
maxTimePolling: 600
pollingDelay: 10
---
error-mapping:
file: classpath:fixture/errors.json
patternReason: "'%s' - '%s'" # 'code' - 'description'

View File

@ -1,7 +1 @@
[
{
"codeRegex": ".*",
"descriptionRegex": ".*",
"mapping": "ResultUnexpected"
}
]
[]

View File

@ -0,0 +1,9 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.flow.lib.client.RemoteClient;
import org.springframework.boot.test.context.TestComponent;
@TestComponent
public class RemoteClientImpl implements RemoteClient {
}

View File

@ -0,0 +1,50 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.PropertySource;
@SuppressWarnings({"all"})
@SpringBootTest(classes = {
RemoteClientImpl.class,
Validator.class,
StepResolver.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.SimpleObjectMapperConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.SimpleErrorMappingConfiguration.class,
// dev.vality.adapter.bank.spring.boot.starter.configuration.RestTemplateConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.RequestLoggingAspectConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.NetworkConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.LoggingInterceptorConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.HellgateClientConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.CdsStorageClientConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.CdsIdStorageClientConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.BenderConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.AdapterConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.TimerConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.SerdeConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.ProcessorConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.CtxToEntryModelConverterConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.EntryModelToBaseRequestModelConverterConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.ExitModelToProxyResultConverterConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.ExitModelToRecTokenProxyResultConverterConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.ExitStateModelToTemporaryContextConverterConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.ExponentialBackOffPollingServiceConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.IntentResultFactoryConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.PaymentCallbackHandlerConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.PaymentServerFlowHandlerConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.RecCtxToEntryModelConverterConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.RecurrentIntentResultFactoryConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.RecurrentResultIntentResolverConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.RecurrentTokenCallbackHandlerConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.ResultIntentResolverConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.ServerHandlerLogDecoratorConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.TemporaryContextServiceConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.ThreeDsAdapterServiceConfiguration.class,
dev.vality.adapter.bank.spring.boot.starter.configuration.TokenServerFlowHandlerConfiguration.class})
@PropertySource("classpath:application.yml")
public class StarterTest {
@Test
public void build() {
}
}

View File

@ -0,0 +1,9 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.flow.lib.flow.simple.SimpleRedirectWIthPollingStepResolverImpl;
import org.springframework.boot.test.context.TestComponent;
@TestComponent
public class StepResolver extends SimpleRedirectWIthPollingStepResolverImpl {
}

View File

@ -0,0 +1,15 @@
package dev.vality.adapter.bank.spring.boot.starter.configuration;
import dev.vality.adapter.flow.lib.validator.AdapterConfigurationValidator;
import org.springframework.boot.test.context.TestComponent;
import java.util.Map;
@TestComponent
public class Validator implements AdapterConfigurationValidator {
@Override
public void validate(Map<String, String> map) {
}
}

View File

@ -1,11 +1,11 @@
package dev.vality.adapter.bank.spring.boot.starter.utils;
import dev.vality.adapter.common.utils.converter.CardDataUtils;
import dev.vality.adapter.common.utils.CardDataUtils;
import dev.vality.cds.storage.AuthData;
import dev.vality.cds.storage.CardSecurityCode;
import dev.vality.cds.storage.SessionData;
import org.junit.Assert;
import org.junit.Test;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
public class SessionDataUtilsTest {
@ -16,25 +16,25 @@ public class SessionDataUtilsTest {
SessionData sessionData = new SessionData();
String cvv2 = CardDataUtils.extractCvv2(sessionData);
Assert.assertNull(cvv2);
Assertions.assertNull(cvv2);
AuthData authData = new AuthData();
sessionData.setAuthData(authData);
cvv2 = CardDataUtils.extractCvv2(sessionData);
Assert.assertNull(cvv2);
Assertions.assertNull(cvv2);
CardSecurityCode cardSecurityCode = new CardSecurityCode();
authData.setCardSecurityCode(cardSecurityCode);
cvv2 = CardDataUtils.extractCvv2(sessionData);
Assert.assertNull(cvv2);
Assertions.assertNull(cvv2);
cardSecurityCode.setValue(CARD_SECURITY_CODE);
cvv2 = CardDataUtils.extractCvv2(sessionData);
Assert.assertEquals(CARD_SECURITY_CODE, cvv2);
Assertions.assertEquals(CARD_SECURITY_CODE, cvv2);
}
}

View File

@ -1,8 +1,8 @@
package dev.vality.adapter.bank.spring.boot.starter.utils;
import dev.vality.adapter.common.utils.encryption.HmacEncryption;
import org.junit.Assert;
import org.junit.Test;
import dev.vality.adapter.common.utils.HmacEncryption;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.security.NoSuchAlgorithmException;
@ -15,6 +15,6 @@ public class SignGeneratorTest {
"142003010515302116F2B2DD7E603A7ADA33https://www.sample.com/shop/reply";
String s = HmacEncryption.calculateHMacSha1(test, "00112233445566778899AABBCCDDEEFF");
Assert.assertEquals("FACC882CA67E109E409E3974DDEDA8AAB13A5E48", s.toUpperCase());
Assertions.assertEquals("FACC882CA67E109E409E3974DDEDA8AAB13A5E48", s.toUpperCase());
}
}

View File

@ -0,0 +1,59 @@
adapter:
url: http://127.0.0.1
callbackUrl: http://127.0.0.1:8080
pathCallbackUrl: /${server.rest.endpoint}/term_url
pathRecurrentCallbackUrl: /${server.rest.endpoint}/rec_term_url
defaultTermUrl: https://checkout.empayre.com/v1/finish-interaction.html
tagPrefix: adapter-
bender:
client:
url: http://127.0.0.1:8022/v1/bender
networkTimeout: 5000
namespace: namespace
cds:
client:
identity-document-storage:
url: http://127.0.0.1:8022/v1/identity_document_storage
networkTimeout: 5000
storage:
url: http://127.0.0.1:8022/v1/storage
networkTimeout: 5000
hellgate:
client:
url: http://127.0.0.1:8022/v1/proxyhost/provider
networkTimeout: 30000
time:
config:
maxTimePollingMin: 60
pollingDelayMs: 1000
redirectTimeoutMin: 15
exponential: 2
defaultInitialExponential: 2
maxTimeBackOff: 600
maxTimeCoefficient: 2
rest-template:
requestTimeout: 60000
poolTimeout: 10000
connectionTimeout: 10000
maxTotalPooling: 200
defaultMaxPerRoute: 200
networkTimeout: 60000
connectTimeout: 10000
error-mapping:
file: classpath:fixture/errors.json
patternReason: "'%s' - '%s'" # 'code' - 'description'
server:
rest:
port: '8083'
endpoint: 'endpoint'
spring:
main:
allow-bean-definition-overriding: true

View File

@ -0,0 +1 @@
[]