From 28b5ef8b4b1ef5baf819d7b1256c2f091d1ddc01 Mon Sep 17 00:00:00 2001 From: etreschenkov Date: Mon, 2 Jun 2025 16:18:23 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-827 --- .../validation/LauncherValidationConfig.java | 35 ++++++++++++ .../scheduler/error/ValidationError.java | 3 +- .../scheduler/service/LauncherService.java | 56 ++++++++++++++----- 3 files changed, 79 insertions(+), 15 deletions(-) create mode 100644 clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/validation/LauncherValidationConfig.java diff --git a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/validation/LauncherValidationConfig.java b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/validation/LauncherValidationConfig.java new file mode 100644 index 000000000..42987237f --- /dev/null +++ b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/config/validation/LauncherValidationConfig.java @@ -0,0 +1,35 @@ +package ru.spcex.clearing.scheduler.config.validation; + +import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.schedule.LauncherCommandRequest; +import ru.spcex.clearing.scheduler.error.ValidationError; +import ru.spcex.clearing.validation.common.rules.ValidateSymbolsRule; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.utils.validation.IValidator; +import ru.spcex.platform.utils.validation.ValidatorImpl; + +@Configuration +public class LauncherValidationConfig { + + @Bean("launcherRequestValidator") + public Function launcherRequestValidator(Map> imdgForValidation) { + return launcherCommandRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(launcherCommandRequest); + Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); + addImdg.accept(IMDGDistributedNames.Map_ValidationSymbols); + return new ValidatorImpl<>(context, + ValidateSymbolsRule.notRequired("PaymentPurpose", + LauncherCommandRequest::getPaymentPurpose, + ValidationError.IncorrectPaymentPurpose) + ); + }; + } +} diff --git a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/error/ValidationError.java b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/error/ValidationError.java index 68c1e5fb7..756cdbed6 100644 --- a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/error/ValidationError.java +++ b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/error/ValidationError.java @@ -13,7 +13,8 @@ public enum ValidationError implements IErrorEnumId { CompanyNotFound(7014L), SecurityNotFound(7012L), CompanyNotActive(7015L), - SecurityNotActive(7013L); + SecurityNotActive(7013L), + IncorrectPaymentPurpose(7018L); private final Long id; diff --git a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/LauncherService.java b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/LauncherService.java index c4a73ecfc..3de8250b0 100644 --- a/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/LauncherService.java +++ b/clearing-parent/scheduler-service/src/main/java/ru/spcex/clearing/scheduler/service/LauncherService.java @@ -1,5 +1,10 @@ package ru.spcex.clearing.scheduler.service; +import java.time.Instant; +import java.util.Optional; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; +import java.util.function.Function; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.ProducerRecord; @@ -24,13 +29,11 @@ import ru.spcex.clearing.util.security.UserRoleVerification; import ru.spcex.platform.enumeration.Task; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; -import ru.spcex.platform.utils.log.ExceptionUtils; - -import java.time.Instant; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.Future; - +import ru.spcex.platform.utils.enumeration.EnumMessage; import static ru.spcex.platform.utils.enumeration.IEnumKey.getEnumByKey; +import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.log.ExceptionUtils; +import ru.spcex.platform.utils.validation.IValidator; @Service public class LauncherService extends QueueConsumer implements InitializingBean { @@ -38,23 +41,30 @@ public class LauncherService extends QueueConsumer implements InitializingBean { private final Imdg launcherMap; private final Producer kafkaProducer; private final UserRoleVerification userRoleVerification; + private final Function launcherRequestValidator; + private final IMessageResolver messageResolver; @Autowired public LauncherService(Consumer kafkaQueue, Producer kafkaProducer, @Qualifier("userRoleVerificationBean") UserRoleVerification userRoleVerification, - ImdgProvider imdgProvider) { + ImdgProvider imdgProvider, + @Qualifier("launcherRequestValidator") + Function launcherRequestValidator, + IMessageResolver messageResolver) { super(kafkaQueue, kafkaProducer); this.kafkaProducer = kafkaProducer; this.userRoleVerification = userRoleVerification; this.launcherMap = imdgProvider.getImdg(IMDGDistributedNames.Map_Launcher, Launcher.class); + this.launcherRequestValidator = launcherRequestValidator; + this.messageResolver = messageResolver; } @Override public void afterPropertiesSet() { callback(LauncherCommandRequest.class) - .setFunction(this::newLauncher) - .forDestination(Consts.LAUNCHER_NEW, callbacks::put); + .setFunction(this::newLauncher) + .forDestination(Consts.LAUNCHER_NEW, callbacks::put); init(); } @@ -69,18 +79,27 @@ public class LauncherService extends QueueConsumer implements InitializingBean { throw new IllegalStateException(String.format("User id in request must match: baseRequest.userId = %s, launcherCommandRequest.userId = %s", userRequest.getUserId(), req.getUserId())); } - Instant created = Instant.now(); - Launcher launcher = new Launcher(); - if (getEnumByKey(Task.class, req.getTaskName()) == null) { + Task task = getEnumByKey(Task.class, req.getTaskName()); + if (task == null) { throw new IllegalStateException("Illegal task name:\t" + req.getTaskName()); } + if (Task.dbfExport_OUTV == task) { + IValidator validator = launcherRequestValidator.apply(req); + Optional errorMessage = validator.tillFirstError(); + if (errorMessage.isPresent()) { + String error = messageResolver.resolve(errorMessage.get()); + return makeErrorResponse(userRequest, error); + } + } + Instant created = Instant.now(); + Launcher launcher = new Launcher(); launcher.setTask(req.getTaskName()); launcher.setSenderId(req.getUserId()); launcher.setCreated(created); launcher.setUpdated(created); launcherMap.insert(launcher); log.debug("successfully processed, new id {}", launcher.getId()); - if (Task.dbfExport_OUTV.equalsByKey(req.getTaskName())) { + if (Task.dbfExport_OUTV == task) { return processRequestOUTV(userRequest, req); } else { kafkaProducer.send(new ProducerRecord<>("launcher-" + launcher.getTask(), userRequest)); @@ -90,7 +109,7 @@ public class LauncherService extends QueueConsumer implements InitializingBean { private RequestInfoUpdate processRequestOUTV(BaseRequest userRequest, LauncherCommandRequest launcherNew) { log.debug("Redirect {} (userRequest.id={}) to queue {}", launcherNew.getTaskName(), - userRequest.getId(), Consts.PAYMENT_INSTRUCTION_CLEARING_OUTBOUND_ACTION); + userRequest.getId(), Consts.PAYMENT_INSTRUCTION_CLEARING_OUTBOUND_ACTION); var req = new PIClearingOutbondActionNewRequest(); req.setSenderId(launcherNew.getSenderId()); req.setAddresseeId(launcherNew.getAddresseeId()); @@ -134,4 +153,13 @@ public class LauncherService extends QueueConsumer implements InitializingBean { return successRouting; } + private RequestInfoUpdate makeErrorResponse(BaseRequest launcherCommandRequest, + String errorMessage) { + RequestInfoUpdate requestInfoUpdate = new RequestInfoUpdate(); + requestInfoUpdate.setId(launcherCommandRequest.getId()); + requestInfoUpdate.setStatus(Status.Error); + requestInfoUpdate.setMessage(errorMessage); + return requestInfoUpdate; + } + }