diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/RatesNewAction.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/RatesNewAction.java index ab617f400..e5109727e 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/RatesNewAction.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/RatesNewAction.java @@ -28,7 +28,7 @@ public class RatesNewAction implements IAction { RatesNewRequest request = new RatesNewRequest(); request.setValue(this.value); request.setValueDate(this.valueDate); - request.setCurrencyPairId(this.currencyPairId); + request.setCurrencyId(this.currencyPairId); request.setStatus(this.status); return request; } diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/RatesUpdateAction.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/RatesUpdateAction.java index d5107dce3..cdb630797 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/RatesUpdateAction.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/RatesUpdateAction.java @@ -5,9 +5,9 @@ import io.swagger.annotations.ApiModelProperty; import java.math.BigDecimal; import ru.spcex.clearing.backendapi.domain.actions.IAction; import ru.spcex.clearing.platform.messaging.domain.ActionType; -import ru.spcex.clearing.platform.messaging.domain.cud.security.RatesNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.security.RatesUpdateRequest; -public class RatesUpdateAction implements IAction { +public class RatesUpdateAction implements IAction { @ApiModelProperty(hidden = true) @JsonProperty @@ -20,8 +20,9 @@ public class RatesUpdateAction implements IAction { private String status; @Override - public RatesNewRequest toRequest() { - RatesNewRequest request = new RatesNewRequest(); + public RatesUpdateRequest toRequest() { + RatesUpdateRequest request = new RatesUpdateRequest(); + request.setId(this.id); request.setValue(this.value); request.setStatus(this.status); return request; diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/RiskParameterUpdateAction.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/RiskParameterUpdateAction.java index 46bbbac7e..538222a29 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/RiskParameterUpdateAction.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/RiskParameterUpdateAction.java @@ -22,6 +22,7 @@ public class RiskParameterUpdateAction implements IAction ratesValidator(Map> imdgForValidation) { + @Bean("ratesNewValidator") + public Function ratesNewValidator(Map> imdgForValidation) { return ratesRequest -> { ImdgValidationContext context = new ImdgValidationContext<>(); context.setValidatedObject(ratesRequest); Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); addImdg.accept(IMDGDistributedNames.Map_Rates); return new ValidatorImpl<>(context, - FieldRequiredRule.instance("currencyPairUd", RatesNewRequest::getCurrencyPairId, SecuritiesError.RequiredFieldIsEmpty), + FieldRequiredRule.instance("currencyPairUd", RatesNewRequest::getCurrencyId, SecuritiesError.RequiredFieldIsEmpty), FieldRequiredRule.instance("value", RatesNewRequest::getValue, SecuritiesError.RequiredFieldIsEmpty), FieldRequiredRule.instance("settlementType", RatesNewRequest::getValueDate, SecuritiesError.RequiredFieldIsEmpty), RatesValidationRule.CHECK_ON_EXIST ); }; } + + @Bean("ratesUpdateValidator") + public Function ratesUpdateValidator(Map> imdgForValidation) { + return ratesUpdateRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(ratesUpdateRequest); + Consumer addImdg = (s) -> context.addImdg(s, imdgForValidation.get(s)); + addImdg.accept(IMDGDistributedNames.Map_Rates); + return new ValidatorImpl<>(context, + IdPresentRule.instance("id", + RatesUpdateRequest::getId, + IMDGDistributedNames.Map_Rates, + RiskParameter.class, + SecuritiesError.RequiredFieldIsEmpty, + SecuritiesError.RequiredFieldIsEmpty) + ); + }; + } } diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/facade/RatesFacade.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/facade/RatesFacade.java new file mode 100644 index 000000000..4b7aa39f9 --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/facade/RatesFacade.java @@ -0,0 +1,65 @@ +package ru.spcex.clearing.securities.service.facade; + +import java.time.Instant; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.security.Rates; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.security.RatesNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.security.RatesUpdateRequest; +import ru.spcex.platform.classes.base.interfaces.IClearingFacade; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.api.ImdgId; +import ru.spcex.platform.imdg.api.ImdgProvider; + +@Service +public class RatesFacade implements IClearingFacade { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final ImdgId idGenerator; + private final ImdgProvider imdgProvider; + private final Imdg ratesImdg; + + public RatesFacade(ImdgProvider imdgProvider) { + this.idGenerator = imdgProvider.getImdgIdGenerator(); + this.imdgProvider = imdgProvider; + this.ratesImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Rates, Rates.class); + } + + /** + * Создает clientCode, TCR и опционально TCRList, если указаны валюты. + */ + public void createRates(RatesNewRequest request) { + log.trace("Start process creating new rates"); + Rates rates = new Rates(); + + rates.setCurrencyId(request.getCurrencyId()); + rates.setValue(request.getValue()); + rates.setValueDate(request.getValueDate()); + rates.setWorkflowStatus(request.getStatus()); + rates.setCreated(Instant.now()); + + ratesImdg.insert(rates); + log.debug("successfully processed, new rates id {}", rates.getId()); + } + + public void updateRates(RatesUpdateRequest request) { + log.trace("Start process update rates"); + Rates ratesForUpdate = ratesImdg.getSingleObjectByID(request.getId()); + + ratesForUpdate.setValue(request.getValue()); + ratesForUpdate.setWorkflowStatus(request.getStatus()); + + ratesImdg.update(ratesForUpdate); + log.debug("successfully processed, updated rates id {}", ratesForUpdate.getId()); + } + @Override + public void lock() { + + } + + @Override + public void unlock() { + + } +} diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/listeners/RatesMessageListener.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/listeners/RatesMessageListener.java new file mode 100644 index 000000000..69e9b2bb6 --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/listeners/RatesMessageListener.java @@ -0,0 +1,100 @@ +package ru.spcex.clearing.securities.service.listeners; + +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.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.security.RatesNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.security.RatesUpdateRequest; +import ru.spcex.clearing.platform.messaging.service.QueueConsumer; +import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; +import ru.spcex.clearing.securities.service.facade.RatesFacade; +import ru.spcex.clearing.util.security.UserRoleVerification; +import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.validation.IValidator; + +@Service +public class RatesMessageListener extends QueueConsumer implements InitializingBean { + private final Logger log = LoggerFactory.getLogger(getClass()); + private final ImdgProvider imdgProvider; + private final RatesFacade ratesFacade; + private final Function ratesNewValidator; + private final Function ratesUpdateValidator; + private final UserRoleVerification userRoleVerification; + private final IMessageResolver messageResolver; + + public RatesMessageListener(Consumer kafkaQueue, + Producer kafkaProducer, + ImdgProvider imdgProvider, + RatesFacade ratesFacade, + Function ratesNewValidator, + Function ratesUpdateValidator, + UserRoleVerification userRoleVerification, + IMessageResolver messageResolver) { + super(kafkaQueue, kafkaProducer); + this.imdgProvider = imdgProvider; + this.ratesFacade = ratesFacade; + this.ratesNewValidator = ratesNewValidator; + this.ratesUpdateValidator = ratesUpdateValidator; + this.userRoleVerification = userRoleVerification; + this.messageResolver = messageResolver; + } + + @Override + public void afterPropertiesSet() { + imdgProvider.waitAvailable(); + + //from backend-api requests + callback(RatesNewRequest.class) + .setFunction(this::ratesNew) + .forDestination(Consts.DESTINATION_RATES_NEW, callbacks::put); + callback(RatesUpdateRequest.class) + .setFunction(this::ratesUpdate) + .forDestination(Consts.DESTINATION_RATES_UPDATE, callbacks::put); + init(); + } + + private RequestInfoUpdate ratesNew(BaseRequest ratesNewRequest) { + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(ratesNewRequest); + if (requestInfoUpdate != null) return requestInfoUpdate; + RatesNewRequest request = ratesNewRequest.getRequestPayload(); + IValidator validator = ratesNewValidator.apply(request); + Optional error = validator.tillFirstError(); + if (error.isPresent()) { + String errMsg = messageResolver.resolve(error.get()); + return new RequestInfoUpdate() + .setId(ratesNewRequest.getId()) + .setStatus(ru.spcex.clearing.platform.messaging.service.Status.Error) + .setMessage(errMsg); + } + + ratesFacade.createRates(request); + return null; + } + + private RequestInfoUpdate ratesUpdate(BaseRequest ratesUpdateRequest) { + RequestInfoUpdate requestInfoUpdate = userRoleVerification.validateRoleAndGetResult(ratesUpdateRequest); + if (requestInfoUpdate != null) return requestInfoUpdate; + RatesUpdateRequest request = ratesUpdateRequest.getRequestPayload(); + IValidator validator = ratesUpdateValidator.apply(request); + Optional error = validator.tillFirstError(); + if (error.isPresent()) { + String errMsg = messageResolver.resolve(error.get()); + return new RequestInfoUpdate() + .setId(ratesUpdateRequest.getId()) + .setStatus(ru.spcex.clearing.platform.messaging.service.Status.Error) + .setMessage(errMsg); + } + + ratesFacade.updateRates(request); + return null; + } +} diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/RatesValidationRule.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/RatesValidationRule.java index e7773f170..6c69dc9ad 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/RatesValidationRule.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/RatesValidationRule.java @@ -22,13 +22,13 @@ public enum RatesValidationRule implements IValidationRule