diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/MessageResolverConfig.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/MessageResolverConfig.java new file mode 100644 index 000000000..7cd42a1b2 --- /dev/null +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/MessageResolverConfig.java @@ -0,0 +1,16 @@ +package ru.spcex.clearing.dflt.management.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.spcex.clearing.util.services.IMDGMessageResolver; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.enumeration.IMessageResolver; + +@Configuration +public class MessageResolverConfig { + @Bean + public IMessageResolver + messageResolver(ImdgProvider imdgProvider) { + return new IMDGMessageResolver(imdgProvider); + } +} diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/ValidationConfig.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/ValidationConfig.java new file mode 100644 index 000000000..4179ea94a --- /dev/null +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/config/ValidationConfig.java @@ -0,0 +1,106 @@ +package ru.spcex.clearing.dflt.management.config; + +import java.util.function.Function; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.clearing.classes.statics.data.company.Company; +import ru.clearing.classes.statics.data.misc.Market; +import ru.clearing.classes.statics.data.misc.OvernightSettings; +import ru.clearing.platform.dictionary.OvernightTypeDictionary; +import ru.spcex.clearing.dflt.management.error.DefaultManagementErrors; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.misc.OvernightSettingsNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.misc.OvernightSettingsUpdateRequest; +import ru.spcex.clearing.validation.common.rules.DictionaryPresentRule; +import ru.spcex.clearing.validation.common.rules.IdPresentRule; +import ru.spcex.clearing.validation.common.rules.SpecialIdPresentRule; +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.imdg.validation.rule.PresentById; +import ru.spcex.platform.utils.validation.IValidator; +import ru.spcex.platform.utils.validation.ValidatorImpl; + +@Configuration +public class ValidationConfig { + + private final Imdg overnightSettingsImdg; + private final Imdg companyImdg; + private final Imdg marketImdg; + private final Imdg osTypeDictionaryImdg; + + @Autowired + public ValidationConfig(ImdgProvider imdgProvider) { + this.overnightSettingsImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OvernightSettings, OvernightSettings.class); + this.companyImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Company, Company.class); + this.marketImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Market, Market.class); + this.osTypeDictionaryImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OvernightTypeDictionary, OvernightTypeDictionary.class); + } + + public enum OvernightSettingsValidationStorage { + company, market, overnightType + } + + @Bean("overnightSettingsNewValidator") + public Function overnightSettingsNewValidator() { + return (req) -> { + ImdgValidationContext ctx = new ImdgValidationContext<>(); + ctx.setValidatedObject(req); + ctx.addImdg(IMDGDistributedNames.Map_Company, companyImdg); + ctx.addImdg(IMDGDistributedNames.Map_Market, marketImdg); + ctx.addImdg(IMDGDistributedNames.Map_OvernightTypeDictionary, osTypeDictionaryImdg); + //fixme error codes + return new ValidatorImpl<>(ctx, + IdPresentRule.instance("companyId", + OvernightSettingsNewRequest::getCompanyId, + IMDGDistributedNames.Map_Company, + Company.class, + DefaultManagementErrors.RequiredFieldIsEmpty, + DefaultManagementErrors.DictionaryNotFound, + true), + SpecialIdPresentRule.instance("market", + OvernightSettingsNewRequest::getMarket, "code", + IMDGDistributedNames.Map_Market, + ru.clearing.classes.statics.data.misc.Market.class, + DefaultManagementErrors.RequiredFieldIsEmpty, + DefaultManagementErrors.DictionaryNotFound, + true + ), + DictionaryPresentRule.instance("overnightType", OvernightSettingsNewRequest::getOvernightType, IMDGDistributedNames.Map_OvernightTypeDictionary, OvernightTypeDictionary.class, DefaultManagementErrors.RequiredFieldIsEmpty, DefaultManagementErrors.DictionaryNotFound, true) //fixme + ); + }; + } + + @Bean("overnightSettingsUpdateValidator") + public Function overnightSettingsUpdateValidator() { + return (req) -> { + ImdgValidationContext ctx = new ImdgValidationContext<>(); + ctx.setValidatedObject(req); + ctx.addImdg(IMDGDistributedNames.Map_Company, companyImdg); + ctx.addImdg(IMDGDistributedNames.Map_Market, marketImdg); + ctx.addImdg(IMDGDistributedNames.Map_OvernightTypeDictionary, osTypeDictionaryImdg); + ctx.addImdg(IMDGDistributedNames.Map_OvernightSettings, overnightSettingsImdg); + //fixme error codes + return new ValidatorImpl<>(ctx, + IdPresentRule.instance("companyId", + OvernightSettingsUpdateRequest::getCompanyId, + IMDGDistributedNames.Map_Company, + Company.class, + DefaultManagementErrors.RequiredFieldIsEmpty, + DefaultManagementErrors.DictionaryNotFound, + true), + SpecialIdPresentRule.instance("market", + OvernightSettingsUpdateRequest::getMarket, "code", + IMDGDistributedNames.Map_Market, + ru.clearing.classes.statics.data.misc.Market.class, + DefaultManagementErrors.RequiredFieldIsEmpty, + DefaultManagementErrors.DictionaryNotFound, + true + ), + DictionaryPresentRule.instance("overnightType", OvernightSettingsUpdateRequest::getOvernightType, IMDGDistributedNames.Map_OvernightTypeDictionary, OvernightTypeDictionary.class, DefaultManagementErrors.RequiredFieldIsEmpty, DefaultManagementErrors.DictionaryNotFound, true), + new PresentById(IMDGDistributedNames.Map_OvernightSettings, DefaultManagementErrors.DictionaryNotFound, true) + ); + }; + } +} diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/error/DefaultManagementErrors.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/error/DefaultManagementErrors.java index fdc0f1a7e..e9ea0423c 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/error/DefaultManagementErrors.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/error/DefaultManagementErrors.java @@ -6,7 +6,10 @@ public enum DefaultManagementErrors implements IErrorEnumId { //todo уточнить порядковый номер ошибки модуля GeneralError(3000L), // Общая ошибка модуля - UserVerifyDenial(3001L); // 'Нет прав на проведение данной операции + UserVerifyDenial(3001L), // 'Нет прав на проведение данной операции + RequiredFieldIsEmpty(3002L), + DictionaryNotFound(3003L) + ; private final Long id; DefaultManagementErrors(Long id) { diff --git a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/OvernightSettingsListener.java b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/OvernightSettingsListener.java index 471dcb2e3..aac0402af 100644 --- a/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/OvernightSettingsListener.java +++ b/clearing-parent/default-management/src/main/java/ru/spcex/clearing/dflt/management/listener/OvernightSettingsListener.java @@ -1,32 +1,58 @@ package ru.spcex.clearing.dflt.management.listener; +import java.util.Optional; +import java.util.function.Function; import org.apache.kafka.clients.consumer.Consumer; import org.apache.kafka.clients.producer.Producer; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.misc.OvernightSettings; +import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.clearing.platform.messaging.domain.cud.misc.OvernightSettingsNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.misc.OvernightSettingsUpdateRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.clearing.platform.messaging.service.Status; import ru.spcex.clearing.util.security.UserRoleVerification; +import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.imdg.validation.Stored; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.validation.IValidator; @Service public class OvernightSettingsListener extends QueueConsumer implements InitializingBean { protected final Logger log = LoggerFactory.getLogger(getClass()); - protected ImdgProvider imdgProvider; + private final UserRoleVerification userRoleVerification; + private final Function osNewValidator; + private final Function osUpdateValidator; + private final IMessageResolver msgResolver; + private final Imdg osImdg; @Autowired public OvernightSettingsListener(Consumer kafkaQueue, - Producer kafkaProducer, - ImdgProvider imdgProvider, - UserRoleVerification userRoleVerification) { + Producer kafkaProducer, + ImdgProvider imdgProvider, + UserRoleVerification userRoleVerification, + IMessageResolver msgResolver, + @Qualifier("overnightSettingsNewValidator") + Function osNewValidator, + @Qualifier("overnightSettingsUpdateValidator") + Function osUpdateValidator + ) { super(kafkaQueue, kafkaProducer); - this.imdgProvider = imdgProvider; + this.userRoleVerification = userRoleVerification; + this.osNewValidator = osNewValidator; + this.osUpdateValidator = osUpdateValidator; + this.msgResolver = msgResolver; + this.osImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_OvernightSettings, OvernightSettings.class); } @Override @@ -34,10 +60,45 @@ public class OvernightSettingsListener extends QueueConsumer implements Initiali callback(OvernightSettingsNewRequest.class) .setFunction(this::processNewReq) .forDestination(Consts.OVERNIGHT_SETTINGS_NEW, callbacks::put); + callback(OvernightSettingsUpdateRequest.class) + .setFunction(this::processUpdate) + .forDestination(Consts.OVERNIGHT_SETTINGS_UPDATE, callbacks::put); init(); } - private RequestInfoUpdate processNewReq(BaseRequest newReq) { + private RequestInfoUpdate processNewReq(BaseRequest req) { + //fixme userRoleVerification.validateRoleAndThrow(newReq); + log.info("New overnight settings request: {}", req); + OvernightSettingsNewRequest payload = req.getRequestPayload(); + IValidator validator = osNewValidator.apply(payload); + Optional err = validator.tillFirstError(); + if (err.isPresent()) { + return new RequestInfoUpdate(req.getId(), Status.Error, msgResolver.resolve(err.get())); + } + OvernightSettings os = new OvernightSettings(); + os.setMarket(payload.getMarket()); + os.setCompanyId(payload.getCompanyId()); + os.setOvernightType(payload.getOvernightType()); + osImdg.insert(os); + log.info("new overnight system request.id[{}]: {}/{}/{}", os.getId(), os.getCompanyId(), os.getMarket(), os.getOvernightType()); + return null; + } + + private RequestInfoUpdate processUpdate(BaseRequest req) { + //fixme userRoleVerification.validateRoleAndThrow(newReq); + log.info("Update overnight system request: {}", req); + OvernightSettingsUpdateRequest payload = req.getRequestPayload(); + IValidator validator = osUpdateValidator.apply(payload); + Optional err = validator.tillFirstError(); + if (err.isPresent()) { + return new RequestInfoUpdate(req.getId(), Status.Error, msgResolver.resolve(err.get())); + } + OvernightSettings os = validator.getStored(Stored.PresentById); + os.setMarket(payload.getMarket()); + os.setCompanyId(payload.getCompanyId()); + os.setOvernightType(payload.getOvernightType()); + osImdg.update(os); + log.info("updated overnight system request.id[{}]: {}/{}/{}", os.getId(), os.getCompanyId(), os.getMarket(), os.getOvernightType()); return null; } } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/misc/OvernightSettingsUpdateRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/misc/OvernightSettingsUpdateRequest.java index de468b79f..d3ad0f00c 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/misc/OvernightSettingsUpdateRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/misc/OvernightSettingsUpdateRequest.java @@ -1,8 +1,9 @@ package ru.spcex.clearing.platform.messaging.domain.cud.misc; import com.fasterxml.jackson.annotation.JsonProperty; +import ru.spcex.platform.classes.base.interfaces.WithId; -public class OvernightSettingsUpdateRequest { +public class OvernightSettingsUpdateRequest implements WithId { @JsonProperty public Long id; @JsonProperty