cls-283 base service

This commit is contained in:
akulikov 2023-05-11 13:57:29 +03:00
parent eed1e94f07
commit 0022cb6b22
10 changed files with 306 additions and 1 deletions

View file

@ -93,6 +93,14 @@
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>security-util</artifactId>
</dependency>
<dependency>
<groupId>ru.spcex.clearing</groupId>
<artifactId>clearing-validation</artifactId>
</dependency>
</dependencies>
<build>

View file

@ -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);
}
}

View file

@ -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)
);
};
}
}

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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";

View file

@ -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;

View file

@ -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;
}
}

View file

@ -0,0 +1,7 @@
package ru.spcex.clearing.platform.messaging.domain.cud.reports;
/**
* Запрос на построение отчета на основе Registry
*/
public class ReportRequestFromRegistry extends ReportRequest {
}