From 0022cb6b22ae9d5902dcc49eadf6c5b5510b23db Mon Sep 17 00:00:00 2001 From: akulikov Date: Thu, 11 May 2023 13:57:29 +0300 Subject: [PATCH] cls-283 base service --- clearing-parent/reports-service/pom.xml | 8 ++ .../reports/config/BeanConfiguration.java | 27 +++++ .../config/validation/ValidationConfig.java | 103 ++++++++++++++++++ .../clearing/reports/errors/ReportError.java | 23 ++++ .../reports/services/ReportService.java | 81 ++++++++++++++ .../platform/enumeration/ReportType.java | 30 +++++ .../platform/messaging/domain/Consts.java | 3 + .../domain/cud/reports/ReportRequest.java | 3 +- .../reports/ReportRequestFromExecution.java | 22 ++++ .../reports/ReportRequestFromRegistry.java | 7 ++ 10 files changed, 306 insertions(+), 1 deletion(-) create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/BeanConfiguration.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/errors/ReportError.java create mode 100644 clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportService.java create mode 100644 platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ReportType.java create mode 100644 platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequestFromExecution.java create mode 100644 platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequestFromRegistry.java diff --git a/clearing-parent/reports-service/pom.xml b/clearing-parent/reports-service/pom.xml index 4c4ff1026..cfc872733 100644 --- a/clearing-parent/reports-service/pom.xml +++ b/clearing-parent/reports-service/pom.xml @@ -93,6 +93,14 @@ mockito-core test + + ru.spcex.clearing + security-util + + + ru.spcex.clearing + clearing-validation + diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/BeanConfiguration.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/BeanConfiguration.java new file mode 100644 index 000000000..da06a010e --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/BeanConfiguration.java @@ -0,0 +1,27 @@ +package ru.spcex.clearing.reports.config; + +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Scope; +import ru.spcex.clearing.reports.errors.ReportError; +import ru.spcex.clearing.util.security.UserRoleVerification; +import ru.spcex.clearing.util.services.IMDGMessageResolver; +import ru.spcex.platform.enumeration.UserRole; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.enumeration.IMessageResolver; + +@Configuration +public class BeanConfiguration { + @Bean + public IMessageResolver messageResolver(ImdgProvider imdgProvider) { + return new IMDGMessageResolver(imdgProvider); + } + + @Bean + @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE) + public UserRoleVerification userRoleVerification(ImdgProvider imdgProvider, IMessageResolver messageResolver) { + return new UserRoleVerification(imdgProvider, messageResolver, UserRole.Admin, ReportError.UserVerifyDenial); + } + +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java new file mode 100644 index 000000000..26513b3e3 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/config/validation/ValidationConfig.java @@ -0,0 +1,103 @@ +package ru.spcex.clearing.reports.config.validation; + + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.clearing.classes.statics.data.company.Company; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestFromExecution; +import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestFromRegistry; +import ru.spcex.clearing.reports.errors.ReportError; +import ru.spcex.clearing.validation.common.ValidationHelper; +import ru.spcex.clearing.validation.common.rules.EnumPresentRule; +import ru.spcex.clearing.validation.common.rules.FieldRequiredRule; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.enumeration.ReportType; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.validation.IValidator; +import ru.spcex.platform.utils.validation.ValidatorImpl; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.function.Function; + +@Configuration +public class ValidationConfig { + + @Bean("imdgForValidation") + public Map> imdgForValidation(ImdgProvider imdgProvider) { + final Map> imdg = new HashMap<>(); + BiConsumer> addImdg = (s, aClass) -> imdg.put(s, imdgProvider.getImdg(s, aClass)); + + addImdg.accept(IMDGDistributedNames.Map_Company, Company.class); + + return imdg; + } + + @Bean("validationHelper") + public ValidationHelper validationHelper(IMessageResolver messageResolver) { + return new ValidationHelper(messageResolver); + } + + @Bean("reportRequestFromExecutionValidator") + public Function reportRequestFromExecutionValidator( + Map> imdgForValidation + ) { + return reportRequestFromExecution -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(reportRequestFromExecution); + + Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); + // todo add dictionary for check reportId + + return new ValidatorImpl<>(context, + EnumPresentRule.instance("reportId", + ReportRequestFromExecution::getReportId, + new ReportType[]{ + ReportType.OPERATIONAL_LIABILITIES_CLAIMS, + ReportType.SUMMARY_LIABILITIES_CLAIMS, + ReportType.PERIOD_LIABILITIES_CLAIMS, + ReportType.EXECUTED_DEAL_REPORT, + ReportType.UNFULFILLED_DEAL_REPORT + }, + ReportError.WrongFieldValue, + ReportError.RequiredFieldEmpty), + FieldRequiredRule.instance("sessionId", + ReportRequestFromExecution::getSessionId, + ReportError.RequiredFieldEmpty) + ); + }; + } + + @Bean("reportRequestFromRegistryValidator") + public Function reportRequestFromRegistryValidator( + Map> imdgForValidation + ) { + return reportRequestFromRegistry -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(reportRequestFromRegistry); + + Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); + // todo add dictionary for check reportId + + return new ValidatorImpl<>(context, + EnumPresentRule.instance("reportId", + ReportRequestFromRegistry::getReportId, + new ReportType[]{ + ReportType.OPERATIONAL_MONEY_CHANGE, + ReportType.SUMMARY_L_MONEY_CHANGE, + ReportType.PERIOD_MONEY_CHANGE + }, + ReportError.WrongFieldValue, + ReportError.RequiredFieldEmpty) + ); + }; + } + +} + diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/errors/ReportError.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/errors/ReportError.java new file mode 100644 index 000000000..55c3dfdbd --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/errors/ReportError.java @@ -0,0 +1,23 @@ +package ru.spcex.clearing.reports.errors; + +import ru.spcex.platform.utils.enumeration.IErrorEnumId; + +// todo codes +public enum ReportError implements IErrorEnumId { + InternalError(99000L), + UserVerifyDenial(99001L), + RequiredFieldEmpty(99002L), + WrongFieldValue(99004L), + ; + + private final Long id; + + ReportError(Long id) { + this.id = id; + } + + @Override + public Long getId() { + return id; + } +} diff --git a/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportService.java b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportService.java new file mode 100644 index 000000000..4665d9d52 --- /dev/null +++ b/clearing-parent/reports-service/src/main/java/ru/spcex/clearing/reports/services/ReportService.java @@ -0,0 +1,81 @@ +package ru.spcex.clearing.reports.services; + +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.producer.Producer; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; +import ru.spcex.clearing.platform.messaging.domain.BaseRequest; +import ru.spcex.clearing.platform.messaging.domain.Consts; +import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestFromExecution; +import ru.spcex.clearing.platform.messaging.domain.cud.reports.ReportRequestFromRegistry; +import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.clearing.util.security.UserRoleVerification; +import ru.spcex.clearing.validation.common.ValidationHelper; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.validation.IValidator; + +import java.util.function.Function; + +@Service +public class ReportService extends QueueConsumer implements InitializingBean { + private final ImdgProvider imdgProvider; + private final IMessageResolver messageResolver; + private final UserRoleVerification userRoleVerification; + private final ValidationHelper validationHelper; + private final Function reportRequestFromExecutionValidator; + private final Function reportRequestFromRegistryValidator; + + public ReportService(Consumer kafkaQueue, + Producer kafkaResponseQueue, + ImdgProvider imdgProvider, + IMessageResolver messageResolver, + UserRoleVerification userRoleVerification, + ValidationHelper validationHelper, + @Qualifier("reportRequestFromExecutionValidator") + Function reportRequestFromExecutionValidator, + @Qualifier("reportRequestFromRegistryValidator") + Function reportRequestFromRegistryValidator) { + super(kafkaQueue, kafkaResponseQueue); + this.imdgProvider = imdgProvider; + this.messageResolver = messageResolver; + this.userRoleVerification = userRoleVerification; + this.validationHelper = validationHelper; + this.reportRequestFromExecutionValidator = reportRequestFromExecutionValidator; + this.reportRequestFromRegistryValidator = reportRequestFromRegistryValidator; + } + + @Override + public void afterPropertiesSet() throws Exception { + callback(ReportRequestFromRegistry.class) + .setConsumer(this::createReportFromRegistry) + .forDestination(Consts.DESTINATION_CREATE_REPORT_FROM_REGISTRY, callbacks::put); + callback(ReportRequestFromExecution.class) + .setConsumer(this::createReportFromExecution) + .forDestination(Consts.DESTINATION_CREATE_REPORT_FROM_EXECUTION, callbacks::put); + } + + public RequestInfoUpdate createReportFromRegistry(BaseRequest userRequest) { + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); + if (requestInfoUpdate != null) return null; + + requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestFromRegistryValidator); + if (requestInfoUpdate != null) return null; + + return null; + } + + public RequestInfoUpdate createReportFromExecution(BaseRequest userRequest) { + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest); + if (requestInfoUpdate != null) return null; + + requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestFromExecutionValidator); + if (requestInfoUpdate != null) return null; + + return null; + } + + +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ReportType.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ReportType.java new file mode 100644 index 000000000..d35875401 --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/ReportType.java @@ -0,0 +1,30 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +/** + * Идентификатор отчета + * todo сделать для них dictionary + */ +public enum ReportType implements IEnumKey { + OPERATIONAL_LIABILITIES_CLAIMS("operational_liabilities_claims"), + OPERATIONAL_MONEY_CHANGE("operational_money_change"), + SUMMARY_LIABILITIES_CLAIMS("summary_liabilities_claims"), + SUMMARY_L_MONEY_CHANGE("summary_lmoney_change"), // todo check typo + PERIOD_LIABILITIES_CLAIMS("period_liabilities_claims"), + PERIOD_MONEY_CHANGE("period_money_change"), + EXECUTED_DEAL_REPORT("executed_deal_report"), + UNFULFILLED_DEAL_REPORT("unfulfilled_deal_report"), + ; + + private final String key; + + ReportType(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java index c00ea09a8..c6ef5edef 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/Consts.java @@ -69,6 +69,9 @@ public interface Consts { String DESTINATION_BANK_ACCOUNT_UPDATE = "bank-account-update"; String DESTINATION_BANK_ACCOUNT_NEW = "bank-account-new"; + String DESTINATION_CREATE_REPORT_FROM_REGISTRY = "destination-create-report-from-registry"; + String DESTINATION_CREATE_REPORT_FROM_EXECUTION = "destination-create-report-from-execution"; + @Deprecated String ACCOUNT_NEW_SDF01 = "account-new-sdf01"; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequest.java index 17952def1..4b1da114d 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequest.java @@ -1,6 +1,7 @@ package ru.spcex.clearing.platform.messaging.domain.cud.reports; import com.fasterxml.jackson.annotation.JsonProperty; +import ru.spcex.platform.enumeration.ReportType; /** * Запрос отчёта (без параметров) report-service @@ -8,7 +9,7 @@ import com.fasterxml.jackson.annotation.JsonProperty; public class ReportRequest { /** * Идентификатор отчёта - * см. {@link ru.spcex.clearing.reports.reports.ReportsEnum} + * см. {@link ReportType} */ @JsonProperty protected String reportId; diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequestFromExecution.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequestFromExecution.java new file mode 100644 index 000000000..0ed78564b --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequestFromExecution.java @@ -0,0 +1,22 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.reports; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * Запрос на построение отчета на основе ExecutionDeposit/Fond + */ +public class ReportRequestFromExecution extends ReportRequest { + /** + * Идентификатор сессии + */ + @JsonProperty + protected Long sessionId; + + public Long getSessionId() { + return sessionId; + } + + public void setSessionId(Long sessionId) { + this.sessionId = sessionId; + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequestFromRegistry.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequestFromRegistry.java new file mode 100644 index 000000000..f35d0a717 --- /dev/null +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/reports/ReportRequestFromRegistry.java @@ -0,0 +1,7 @@ +package ru.spcex.clearing.platform.messaging.domain.cud.reports; + +/** + * Запрос на построение отчета на основе Registry + */ +public class ReportRequestFromRegistry extends ReportRequest { +}