cls-283 base service
This commit is contained in:
parent
eed1e94f07
commit
0022cb6b22
10 changed files with 306 additions and 1 deletions
|
|
@ -93,6 +93,14 @@
|
||||||
<artifactId>mockito-core</artifactId>
|
<artifactId>mockito-core</artifactId>
|
||||||
<scope>test</scope>
|
<scope>test</scope>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ru.spcex.clearing</groupId>
|
||||||
|
<artifactId>security-util</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>ru.spcex.clearing</groupId>
|
||||||
|
<artifactId>clearing-validation</artifactId>
|
||||||
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
<build>
|
<build>
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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<String, Imdg<? extends SpcexObjectBase>> imdgForValidation(ImdgProvider imdgProvider) {
|
||||||
|
final Map<String, Imdg<? extends SpcexObjectBase>> imdg = new HashMap<>();
|
||||||
|
BiConsumer<String, Class<? extends SpcexObjectBase>> 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<ReportRequestFromExecution, IValidator> reportRequestFromExecutionValidator(
|
||||||
|
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
|
||||||
|
) {
|
||||||
|
return reportRequestFromExecution -> {
|
||||||
|
ImdgValidationContext<ReportRequestFromExecution> context = new ImdgValidationContext<>();
|
||||||
|
context.setValidatedObject(reportRequestFromExecution);
|
||||||
|
|
||||||
|
Consumer<String> 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<ReportRequestFromRegistry, IValidator> reportRequestFromRegistryValidator(
|
||||||
|
Map<String, Imdg<? extends SpcexObjectBase>> imdgForValidation
|
||||||
|
) {
|
||||||
|
return reportRequestFromRegistry -> {
|
||||||
|
ImdgValidationContext<ReportRequestFromRegistry> context = new ImdgValidationContext<>();
|
||||||
|
context.setValidatedObject(reportRequestFromRegistry);
|
||||||
|
|
||||||
|
Consumer<String> 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)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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<ReportRequestFromExecution, IValidator> reportRequestFromExecutionValidator;
|
||||||
|
private final Function<ReportRequestFromRegistry, IValidator> reportRequestFromRegistryValidator;
|
||||||
|
|
||||||
|
public ReportService(Consumer<String, Object> kafkaQueue,
|
||||||
|
Producer<String, Object> kafkaResponseQueue,
|
||||||
|
ImdgProvider imdgProvider,
|
||||||
|
IMessageResolver messageResolver,
|
||||||
|
UserRoleVerification userRoleVerification,
|
||||||
|
ValidationHelper validationHelper,
|
||||||
|
@Qualifier("reportRequestFromExecutionValidator")
|
||||||
|
Function<ReportRequestFromExecution, IValidator> reportRequestFromExecutionValidator,
|
||||||
|
@Qualifier("reportRequestFromRegistryValidator")
|
||||||
|
Function<ReportRequestFromRegistry, IValidator> 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<ReportRequestFromRegistry> 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<ReportRequestFromExecution> userRequest) {
|
||||||
|
RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(userRequest);
|
||||||
|
if (requestInfoUpdate != null) return null;
|
||||||
|
|
||||||
|
requestInfoUpdate = validationHelper.validateTillFirstError(userRequest, reportRequestFromExecutionValidator);
|
||||||
|
if (requestInfoUpdate != null) return null;
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -69,6 +69,9 @@ public interface Consts {
|
||||||
String DESTINATION_BANK_ACCOUNT_UPDATE = "bank-account-update";
|
String DESTINATION_BANK_ACCOUNT_UPDATE = "bank-account-update";
|
||||||
String DESTINATION_BANK_ACCOUNT_NEW = "bank-account-new";
|
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
|
@Deprecated
|
||||||
String ACCOUNT_NEW_SDF01 = "account-new-sdf01";
|
String ACCOUNT_NEW_SDF01 = "account-new-sdf01";
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
package ru.spcex.clearing.platform.messaging.domain.cud.reports;
|
package ru.spcex.clearing.platform.messaging.domain.cud.reports;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
|
import ru.spcex.platform.enumeration.ReportType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Запрос отчёта (без параметров) report-service
|
* Запрос отчёта (без параметров) report-service
|
||||||
|
|
@ -8,7 +9,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
|
||||||
public class ReportRequest {
|
public class ReportRequest {
|
||||||
/**
|
/**
|
||||||
* Идентификатор отчёта
|
* Идентификатор отчёта
|
||||||
* см. {@link ru.spcex.clearing.reports.reports.ReportsEnum}
|
* см. {@link ReportType}
|
||||||
*/
|
*/
|
||||||
@JsonProperty
|
@JsonProperty
|
||||||
protected String reportId;
|
protected String reportId;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
package ru.spcex.clearing.platform.messaging.domain.cud.reports;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Запрос на построение отчета на основе Registry
|
||||||
|
*/
|
||||||
|
public class ReportRequestFromRegistry extends ReportRequest {
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue