diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/MoneyMarketSecurityNewAction.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/MoneyMarketSecurityNewAction.java index 69059d4d1..f96db5e09 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/MoneyMarketSecurityNewAction.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/MoneyMarketSecurityNewAction.java @@ -9,14 +9,17 @@ import ru.spcex.clearing.backendapi.errors.BackEndError; import ru.spcex.clearing.platform.messaging.domain.ActionType; import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityNewRequest; import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer; +import ru.spcex.platform.classes.base.interfaces.WithSecuritySymbol; import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.text.TextUtil; import java.time.LocalDate; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; -public class MoneyMarketSecurityNewAction implements IAction { +public class MoneyMarketSecurityNewAction implements IAction, WithSecuritySymbol { @ApiModelProperty(value = "Дата начала действия", example = "2022-01-20") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "Europe/Moscow") @JsonDeserialize(using = LocalDateDeserializer.class) @@ -48,9 +51,24 @@ public class MoneyMarketSecurityNewAction implements IAction validate() { + List errors = new ArrayList<>(); if (this.startDate == null) - return List.of(new EnumMessage(BackEndError.ValidationError, "startDate")); - else return Collections.emptyList(); + errors.add(new EnumMessage(BackEndError.ValidationError, "startDate")); + if (this.endDate == null) + errors.add(new EnumMessage(BackEndError.ValidationError, "endDate")); + if (this.nominalValue == null) + errors.add(new EnumMessage(BackEndError.ValidationError, "nominalValue")); + if (TextUtil.isEmpty(nominalCurrency)) + errors.add(new EnumMessage(BackEndError.ValidationError, "nominalCurrency")); + if (TextUtil.isEmpty(instrumentType)) + errors.add(new EnumMessage(BackEndError.ValidationError, "instrumentType")); + if (TextUtil.isEmpty(fullName)) + errors.add(new EnumMessage(BackEndError.ValidationError, "fullName")); + if (TextUtil.isEmpty(securitySymbol)) + errors.add(new EnumMessage(BackEndError.ValidationError, "securitySymbol")); + if (this.lotSize == null) + errors.add(new EnumMessage(BackEndError.ValidationError, "lotSize")); + return errors.size() > 0 ? errors : Collections.emptyList(); } @Override diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/MoneyMarketSecurityUpdateAction.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/MoneyMarketSecurityUpdateAction.java index 3928e8198..cc1eb8461 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/MoneyMarketSecurityUpdateAction.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/securities/MoneyMarketSecurityUpdateAction.java @@ -5,12 +5,19 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import io.swagger.annotations.ApiModelProperty; import ru.spcex.clearing.backendapi.domain.actions.IAction; +import ru.spcex.clearing.backendapi.errors.BackEndError; import ru.spcex.clearing.platform.messaging.domain.ActionType; import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityUpdateRequest; import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer; import ru.spcex.platform.classes.base.interfaces.WithId; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.text.TextUtil; import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; public class MoneyMarketSecurityUpdateAction implements IAction, WithId { @ApiModelProperty(hidden = true) @@ -56,6 +63,26 @@ public class MoneyMarketSecurityUpdateAction implements IAction validate() { + List errors = new ArrayList<>(); + if (this.startDate == null) + errors.add(new EnumMessage(BackEndError.ValidationError, "startDate")); + if (this.endDate == null) + errors.add(new EnumMessage(BackEndError.ValidationError, "endDate")); + if (this.nominalValue == null) + errors.add(new EnumMessage(BackEndError.ValidationError, "nominalValue")); + if (TextUtil.isEmpty(nominalCurrency)) + errors.add(new EnumMessage(BackEndError.ValidationError, "nominalCurrency")); + if (TextUtil.isEmpty(instrumentType)) + errors.add(new EnumMessage(BackEndError.ValidationError, "instrumentType")); + if (TextUtil.isEmpty(fullName)) + errors.add(new EnumMessage(BackEndError.ValidationError, "fullName")); + if (this.lotSize == null) + errors.add(new EnumMessage(BackEndError.ValidationError, "lotSize")); + return errors.size() > 0 ? errors : Collections.emptyList(); + } + @ApiModelProperty(hidden = true) @Override public ActionType getActionType() { diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/system/RequestStatusController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/system/RequestStatusController.java index cebfc2d57..31cfce2c9 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/system/RequestStatusController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/system/RequestStatusController.java @@ -43,6 +43,7 @@ public class RequestStatusController { } RequestInfoResponse response = new RequestInfoResponse(); response.setStatus(singleObjectByID.getStatus()); + response.setMessage(singleObjectByID.getMessage()); return response; } } diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/RequestInfoAccepter.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/RequestInfoAccepter.java index a1eaff115..698d281a6 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/RequestInfoAccepter.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/RequestInfoAccepter.java @@ -43,6 +43,7 @@ public class RequestInfoAccepter extends QueueConsumer implements InitializingBe return; } requestInfo.setStatus(statusInfo.getStatus()); + requestInfo.setMessage(statusInfo.getMessage()); requestInfoImdg.update(requestInfo); } } diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/validation/ActionValidationProvider.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/validation/ActionValidationProvider.java index 87152db3e..d0a6cf9a5 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/validation/ActionValidationProvider.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/validation/ActionValidationProvider.java @@ -5,8 +5,8 @@ import org.springframework.stereotype.Component; import ru.clearing.platform.dictionary.AbstractDictionary; import ru.spcex.clearing.backendapi.controller.request.cud.schedule.LauncherNew; import ru.spcex.clearing.backendapi.domain.actions.IAction; +import ru.spcex.clearing.backendapi.errors.BackEndError; import ru.spcex.clearing.backendapi.service.validation.rules.LauncherNewValidationRule; -import ru.spcex.clearing.backendapi.service.validation.rules.PresentById; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.platform.classes.base.SpcexObjectBase; @@ -14,9 +14,11 @@ import ru.spcex.platform.classes.base.interfaces.WithId; 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; +import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.function.Function; @@ -35,10 +37,6 @@ public class ActionValidationProvider implements InitializingBean { @Override public void afterPropertiesSet() { - getImdg(IMDGDistributedNames.Map_TaskDictionary, AbstractDictionary.class); - getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, SpcexObjectBase.class); - getImdg(IMDGDistributedNames.Map_Relation, SpcexObjectBase.class); - validators.put(Consts.DESTINATION_MONEY_MARKET_SECURITY_UPDATE, idPresent(IMDGDistributedNames.Map_MoneyMarketSecurity)); validators.put(Consts.DESTINATION_MONEY_MARKET_SECURITY_DELETE, idPresent(IMDGDistributedNames.Map_MoneyMarketSecurity)); validators.put(Consts.DESTINATION_RELATION_UPDATE, idPresent(IMDGDistributedNames.Map_Relation)); @@ -53,21 +51,35 @@ public class ActionValidationProvider implements InitializingBean { return null; } + + + private > Function defaultConstructor(Class clazz, Imdg... imdgs) { + return iAcc -> { + ImdgValidationContext ctx = new ImdgValidationContext<>(); + ctx.setValidatedObject(iAcc); + Arrays.stream(imdgs).forEach(imdg -> ctx.addImdg(imdg.getMapName(), imdg)); + return new ValidatorImpl<>(ctx); + }; + } + private & WithId> Function idPresent(String mapName) { + Imdg targetMap = getImdg(mapName, SpcexObjectBase.class); return iAction -> { ImdgValidationContext ctx = new ImdgValidationContext<>(); ctx.setValidatedObject(iAction); + ctx.addImdg(mapName, targetMap); ValidatorImpl> iValidator = new ValidatorImpl<>(ctx); - iValidator.addRule(new PresentById(getImdg(mapName, SpcexObjectBase.class))); + iValidator.addRule(new PresentById(mapName, BackEndError.ResourceNotFound)); return iValidator; }; } private Function taskRunnerNew() { + Imdg tskDctnrImdg = getImdg(IMDGDistributedNames.Map_TaskDictionary, AbstractDictionary.class); return taskRunnerNew -> { ImdgValidationContext ctx = new ImdgValidationContext<>(); ctx.setValidatedObject(taskRunnerNew); - ctx.addImdg(IMDGDistributedNames.Map_TaskDictionary, getImdg(IMDGDistributedNames.Map_TaskDictionary, AbstractDictionary.class)); + ctx.addImdg(IMDGDistributedNames.Map_TaskDictionary, tskDctnrImdg); ValidatorImpl> iValidator = new ValidatorImpl<>(ctx); iValidator.addRule(LauncherNewValidationRule.knownTaskDictionary); return iValidator; diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/validation/rules/PresentById.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/validation/rules/PresentById.java deleted file mode 100644 index 032767967..000000000 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/validation/rules/PresentById.java +++ /dev/null @@ -1,28 +0,0 @@ -package ru.spcex.clearing.backendapi.service.validation.rules; -import ru.spcex.clearing.backendapi.errors.BackEndError; -import ru.spcex.platform.classes.base.SpcexObjectBase; -import ru.spcex.platform.classes.base.interfaces.WithId; -import ru.spcex.platform.imdg.api.Imdg; -import ru.spcex.platform.imdg.validation.ImdgValidationContext; -import ru.spcex.platform.utils.enumeration.EnumMessage; -import ru.spcex.platform.utils.validation.IValidationRule; - -import java.util.Optional; - -public class PresentById implements IValidationRule> { - private final Imdg map; - - public PresentById(Imdg map) { - this.map = map; - } - - @Override - public Optional validate(ImdgValidationContext context) { - WithId actionById = context.getValidatedObject(); - if (map.getSingleObjectByID(actionById.getId()) == null) { - return of(BackEndError.ResourceNotFound, actionById.getId()); - } else { - return empty(); - } - } -} diff --git a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/MessageResolverConfig.java b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/MessageResolverConfig.java index 09157e14d..6ef39cec8 100644 --- a/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/MessageResolverConfig.java +++ b/clearing-parent/clearing-service/src/main/java/ru/spcex/clearing/config/MessageResolverConfig.java @@ -3,16 +3,12 @@ package ru.spcex.clearing.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import ru.spcex.platform.utils.enumeration.IMessageResolver; - -import java.util.Arrays; +import ru.spcex.platform.utils.enumeration.SimpleMessageResolver; @Configuration public class MessageResolverConfig { @Bean public IMessageResolver messageResolver() { - return errorMessage -> { - if (errorMessage == null) return "null"; - return String.format("(%d) args %s", errorMessage.getSubject().getId(), Arrays.toString(errorMessage.getArgs())); - }; + return new SimpleMessageResolver(); } } diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/component/ListingBuilder.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/component/ListingBuilder.java new file mode 100644 index 000000000..812556ee3 --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/component/ListingBuilder.java @@ -0,0 +1,24 @@ +package ru.spcex.clearing.securities.component; + +import ru.clearing.classes.statics.data.misc.Listing; +import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity; +import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityNewRequest; +import ru.spcex.platform.enumeration.Market; +import ru.spcex.platform.enumeration.Status; + +import java.math.BigDecimal; + +public class ListingBuilder { + public Listing byNewMms(MoneyMarketSecurity mms, MoneyMarketSecurityNewRequest mmsReq) { + Listing listing = new Listing(); + listing.setCreated(mms.getCreated()); + listing.setSecurityId(mms.getId()); + listing.setLotSize(BigDecimal.valueOf(mmsReq.getLotSize())); + listing.setMarket(Market.mkrs.getKey()); + listing.setSymbolCode(mms.getSecuritySymbol()); + listing.setSymbolName(mms.getFullName()); + listing.setTradingCurrency(mms.getNominalCurrency()); + listing.setWorkflowStatus(Status.Active.getKey()); + return listing; + } +} diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/config/ErrorResolverConfig.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/config/ErrorResolverConfig.java new file mode 100644 index 000000000..38d1bdd66 --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/config/ErrorResolverConfig.java @@ -0,0 +1,14 @@ +package ru.spcex.clearing.securities.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import ru.spcex.platform.utils.enumeration.IMessageResolver; +import ru.spcex.platform.utils.enumeration.SimpleMessageResolver; + +@Configuration +public class ErrorResolverConfig { + @Bean + public IMessageResolver messageResolver() { + return new SimpleMessageResolver(); + } +} diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/errors/SecuritiesError.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/errors/SecuritiesError.java new file mode 100644 index 000000000..5b26bbe62 --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/errors/SecuritiesError.java @@ -0,0 +1,21 @@ +package ru.spcex.clearing.securities.errors; + +import ru.spcex.platform.utils.enumeration.IEnumId; + +public enum SecuritiesError implements IEnumId { + WrongFieldValue(1004L), + InstrumentAlreadyExists(1010L), + InstrumentNotActive(1012L), + InstrumentNotFound(1011L), + ; + private final Long id; + + SecuritiesError(Long id) { + this.id = id; + } + + @Override + public Long getId() { + return id; + } +} diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/MoneyMarketSecurityService.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/MoneyMarketSecurityService.java index 18029734e..37b92222a 100644 --- a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/MoneyMarketSecurityService.java +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/service/cud/MoneyMarketSecurityService.java @@ -7,6 +7,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import ru.clearing.classes.statics.data.misc.Listing; import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; @@ -16,29 +17,48 @@ import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSe import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityUpdateRequest; import ru.spcex.clearing.platform.messaging.service.QueueConsumer; import ru.spcex.clearing.platform.messaging.service.RequestInfo; +import ru.spcex.clearing.platform.messaging.service.RequestInfoUpdate; import ru.spcex.clearing.platform.messaging.service.Status; +import ru.spcex.clearing.securities.component.ListingBuilder; +import ru.spcex.clearing.securities.validation.ValidationProvider; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgId; import ru.spcex.platform.imdg.api.ImdgProvider; import ru.spcex.platform.imdg.api.ImdgTransaction; +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; import java.math.BigDecimal; import java.time.Instant; +import java.util.Map; +import java.util.Optional; @Service public class MoneyMarketSecurityService extends QueueConsumer implements InitializingBean { private final Logger log = LoggerFactory.getLogger(getClass()); private final Imdg moneyMarketSecurityMap; + private final Imdg listingImdg; private final ImdgProvider imdgProvider; private final ImdgId idGenerator; + private final ValidationProvider validation; + private final IMessageResolver messageResolver; + private final ListingBuilder listingBuilder = new ListingBuilder(); @Autowired - public MoneyMarketSecurityService(Consumer kafkaQueue, Producer kafkaProducer, - ImdgProvider imdgProvider) { + public MoneyMarketSecurityService(Consumer kafkaQueue, + Producer kafkaProducer, + ImdgProvider imdgProvider, + ValidationProvider validation, + IMessageResolver messageResolver) { super(kafkaQueue, kafkaProducer); + this.validation = validation; this.moneyMarketSecurityMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class); + this.listingImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); this.imdgProvider = imdgProvider; this.idGenerator = imdgProvider.getImdgIdGenerator(); + this.messageResolver = messageResolver; } @Override @@ -59,23 +79,32 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial @Override public void afterPropertiesSet() { callback(MoneyMarketSecurityNewRequest.class) - .setConsumer(this::newMoneyMarket) + .setFunction(this::newMoneyMarket) .forDestination(Consts.DESTINATION_MONEY_MARKET_SECURITY_NEW, callbacks::put); callback(MoneyMarketSecurityUpdateRequest.class) - .setConsumer(this::updateMoneyMarket) + .setFunction(this::updateMoneyMarket) .forDestination(Consts.DESTINATION_MONEY_MARKET_SECURITY_UPDATE, callbacks::put); callback(CommonDeleteRequest.class) - .setConsumer(this::deleteMoneyMarket) + .setFunction(this::deleteMoneyMarket) .forDestination(Consts.DESTINATION_MONEY_MARKET_SECURITY_DELETE, callbacks::put); imdgProvider.waitAvailable(); init(); } - private void newMoneyMarket(BaseRequest userRequest) { -// Imdg requestInfoImdg = imdgProvider.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class); -// RequestInfo reqInfo = requestInfoImdg.getSingleObjectByID(userRequest.getId()); + private RequestInfoUpdate newMoneyMarket(BaseRequest userRequest) { ImdgTransaction transaction = imdgProvider.newTransaction(); MoneyMarketSecurityNewRequest req = userRequest.getRequestPayload(); + Optional validationError = validation.mmsNewValidator() + .apply(req) + .tillFirstError(); + if (validationError.isPresent()) { + String errorMsg = messageResolver.resolve(validationError.get()); + log.error("cannot process MoneyMarketSecurityNewRequest id={}: {}", userRequest.getId(), errorMsg); + return new RequestInfoUpdate() + .setId(userRequest.getId()) + .setStatus(Status.Error) + .setMessage(errorMsg); + } log.debug("MoneyMarketSecurityNewRequest received"); MoneyMarketSecurity mms = new MoneyMarketSecurity(); mms.setId(idGenerator.nextId()); @@ -92,10 +121,11 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial try { transaction.beginTransaction(); Imdg moneyMarketSecurityMap = transaction.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class); - Imdg reqInfoMap = transaction.getImdg(IMDGDistributedNames.Map_RequestInfo, RequestInfo.class); + Imdg listingMap = transaction.getImdg(IMDGDistributedNames.Map_Listing, Listing.class); //одним скопом выполняем реквест moneyMarketSecurityMap.insert(mms); -// RequestInfo.update(reqInfo, Status.Success, "success"); + Listing listing = listingBuilder.byNewMms(mms, req); + listingMap.insert(listing); //и сохраняем обновленный // reqInfoMap.insert(reqInfo); transaction.commitTransaction(); @@ -105,13 +135,25 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial // requestInfoImdg.insert(reqInfo); } log.debug("successfully processed, request id {}, new object id {}", userRequest.getId(), mms.getId()); + return null; // default success } - private void updateMoneyMarket(BaseRequest userRequest) { + private RequestInfoUpdate updateMoneyMarket(BaseRequest userRequest) { MoneyMarketSecurityUpdateRequest req = userRequest.getRequestPayload(); log.debug("MoneyMarketSecurityUpdateRequest received id = {}", req.getId()); - MoneyMarketSecurity mms = moneyMarketSecurityMap.getSingleObjectByID(req.getId()); - mms.setUpdated(Instant.now()); + IValidator validator = validation.mmsUpdateValidator().apply(req); + Optional validationError = validator.tillFirstError(); + if (validationError.isPresent()) { + String errorMsg = messageResolver.resolve(validationError.get()); + log.error("cannot process MoneyMarketSecurityUpdateRequest id={}: {}", userRequest.getId(), errorMsg); + return new RequestInfoUpdate() + .setId(userRequest.getId()) + .setStatus(Status.Error) + .setMessage(errorMsg); + } + MoneyMarketSecurity mms = validator.getStored(Stored.PresentById); + Instant updateTime = Instant.now(); + mms.setUpdated(updateTime); mms.setStartDate(req.getStartDate()); mms.setEndDate(req.getEndDate()); mms.setNominalValue(req.getNominalValue() != null ? BigDecimal.valueOf(req.getNominalValue()) : null); @@ -119,12 +161,43 @@ public class MoneyMarketSecurityService extends QueueConsumer implements Initial mms.setInstrumentType(req.getInstrumentType()); mms.setFullName(req.getFullName()); moneyMarketSecurityMap.update(mms); + Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", mms.getId())); + if (listing == null) { + log.error("MoneyMarketSecurityUpdateRequest id {} couldn't find listing with securityId {}", req.getId(), mms.getId()); + return null; + } + listing.setLotSize(BigDecimal.valueOf(req.getLotSize())); + listing.setUpdated(updateTime); + listingImdg.update(listing); + return null; } - private void deleteMoneyMarket(BaseRequest userRequest) { + private RequestInfoUpdate deleteMoneyMarket(BaseRequest userRequest) { CommonDeleteRequest req = userRequest.getRequestPayload(); log.debug("CommonDeleteRequest received id = {}", req.getId()); - MoneyMarketSecurity mms = moneyMarketSecurityMap.getSingleObjectByID(req.getId()); - moneyMarketSecurityMap.delete(mms); + IValidator validator = validation.mmsDeleteValidator().apply(req); + Optional validationError = validator.tillFirstError(); + if (validationError.isPresent()) { + String errorMsg = messageResolver.resolve(validationError.get()); + log.error("cannot process CommonDeleteRequest id={}: {}", userRequest.getId(), errorMsg); + return new RequestInfoUpdate() + .setId(userRequest.getId()) + .setStatus(Status.Error) + .setMessage(errorMsg); + } + MoneyMarketSecurity mms = validator.getStored(Stored.PresentById); + mms.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Blocked.getKey()); + Instant.now(); + mms.setUpdated(Instant.now()); + moneyMarketSecurityMap.update(mms); + Listing listing = listingImdg.getSingleObjectByFieldValues(Map.of("securityId", mms.getId())); + if (listing == null) { + log.error("CommonDeleteRequest id {} couldn't find listing with securityId {}", req.getId(), mms.getId()); + return null; + } + listing.setWorkflowStatus(ru.spcex.platform.enumeration.Status.Blocked.getKey()); + listing.setUpdated(Instant.now()); + listingImdg.update(listing); + return null; } } diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ValidationProvider.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ValidationProvider.java new file mode 100644 index 000000000..1f6ca6675 --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/ValidationProvider.java @@ -0,0 +1,66 @@ +package ru.spcex.clearing.securities.validation; + +import org.springframework.stereotype.Component; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityNewRequest; +import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityUpdateRequest; +import ru.spcex.clearing.securities.errors.SecuritiesError; +import ru.spcex.clearing.securities.validation.rule.EndDtAfterStartDt; +import ru.spcex.clearing.securities.validation.rule.MmsNewValidationRule; +import ru.spcex.clearing.securities.validation.rule.MmsUpdateValidationRule; +import ru.spcex.platform.classes.base.SpcexObjectBase; +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; + +import java.util.function.Function; + +@Component +public class ValidationProvider { + private final Imdg mmsMap; + + + public ValidationProvider(ImdgProvider imdgProvider) { + this.mmsMap = imdgProvider.getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, SpcexObjectBase.class); + } + + public Function mmsNewValidator() { + return mmsRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(mmsRequest); + context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, mmsMap); + return new ValidatorImpl<>(context, + EndDtAfterStartDt.instance(MoneyMarketSecurityNewRequest.class), + MmsNewValidationRule.SecuritySymbolUniq + ); + }; + } + + public Function mmsUpdateValidator() { + return mmsRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(mmsRequest); + context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, mmsMap); + return new ValidatorImpl<>(context, + EndDtAfterStartDt.instance(MoneyMarketSecurityUpdateRequest.class), + new PresentById(IMDGDistributedNames.Map_MoneyMarketSecurity, SecuritiesError.InstrumentNotFound, true), + MmsUpdateValidationRule.StatusIsActive + ); + }; + } + + public Function mmsDeleteValidator() { + return mmsRequest -> { + ImdgValidationContext context = new ImdgValidationContext<>(); + context.setValidatedObject(mmsRequest); + context.addImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, mmsMap); + return new ValidatorImpl<>(context, + new PresentById(IMDGDistributedNames.Map_MoneyMarketSecurity, SecuritiesError.InstrumentNotFound, true) + ); + }; + } +} diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/EndDtAfterStartDt.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/EndDtAfterStartDt.java new file mode 100644 index 000000000..c565f5f83 --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/EndDtAfterStartDt.java @@ -0,0 +1,28 @@ +package ru.spcex.clearing.securities.validation.rule; + +import ru.spcex.clearing.securities.errors.SecuritiesError; +import ru.spcex.platform.classes.base.interfaces.WithEndDt; +import ru.spcex.platform.classes.base.interfaces.WithStartDt; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.validation.IValidationRule; + +import java.util.Optional; + +public class EndDtAfterStartDt implements IValidationRule> { + + public EndDtAfterStartDt() {} + + public static EndDtAfterStartDt instance(Class clazz) { + return new EndDtAfterStartDt<>(); + } + + @Override + public Optional validate(ImdgValidationContext context) { + T validatedObject = context.getValidatedObject(); + if (validatedObject.getEndDate().isBefore(validatedObject.getStartDate())) { + return of(SecuritiesError.WrongFieldValue, "endDate"); + } + return empty(); + } +} diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsNewValidationRule.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsNewValidationRule.java new file mode 100644 index 000000000..550491385 --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsNewValidationRule.java @@ -0,0 +1,37 @@ +package ru.spcex.clearing.securities.validation.rule; + +import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityNewRequest; +import ru.spcex.clearing.securities.errors.SecuritiesError; +import ru.spcex.platform.enumeration.Status; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.validation.IValidationRule; + +import java.util.Map; +import java.util.Optional; + +public enum MmsNewValidationRule implements IValidationRule> { + SecuritySymbolUniq() { + @Override + public Optional validate(ImdgValidationContext context) { + MoneyMarketSecurityNewRequest action = context.getValidatedObject(); + Imdg mmsImdg = context.obtainMap(IMDGDistributedNames.Map_MoneyMarketSecurity, MoneyMarketSecurity.class); + MoneyMarketSecurity mms = mmsImdg.getSingleObjectByFieldValues(Map.of( + "securitySymbol", action.getSecuritySymbol(), + "workflowStatus", Status.Active.getKey())); + if (mms != null) { + return of(SecuritiesError.InstrumentAlreadyExists); + } else { + return empty(); + } + } + }; + + @Override + public String ruleName() { + return "MmsNewValidationRule." + name(); + } +} diff --git a/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsUpdateValidationRule.java b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsUpdateValidationRule.java new file mode 100644 index 000000000..2bf92e6c4 --- /dev/null +++ b/clearing-parent/securities-service/src/main/java/ru/spcex/clearing/securities/validation/rule/MmsUpdateValidationRule.java @@ -0,0 +1,32 @@ +package ru.spcex.clearing.securities.validation.rule; + +import ru.clearing.classes.statics.data.misc.MoneyMarketSecurity; +import ru.spcex.clearing.platform.messaging.domain.cud.securitites.MoneyMarketSecurityUpdateRequest; +import ru.spcex.clearing.securities.errors.SecuritiesError; +import ru.spcex.platform.enumeration.Status; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.imdg.validation.Stored; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.validation.IValidationRule; + +import java.util.Optional; + +public enum MmsUpdateValidationRule implements IValidationRule> { + StatusIsActive() { + @Override + public Optional validate(ImdgValidationContext context) { + MoneyMarketSecurity mms = context.getStoredObject(Stored.PresentById); + //проверка только если PresentById найдет объект и сохранит его + if (mms != null && !Status.Active.getKey().equals(mms.getWorkflowStatus())) { + return of(SecuritiesError.InstrumentNotActive); + } else { + return empty(); + } + } + }; + + @Override + public String ruleName() { + return "MmsNewValidationRule." + name(); + } +} diff --git a/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/service/MoneyMarketSecurityServiceDisabled.java b/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/service/MoneyMarketSecurityServiceDisabled.java index e35e6b816..971c65732 100644 --- a/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/service/MoneyMarketSecurityServiceDisabled.java +++ b/clearing-parent/securities-service/src/test/java/ru/spcex/clearing/securities/service/MoneyMarketSecurityServiceDisabled.java @@ -29,7 +29,9 @@ import ru.spcex.clearing.securities.config.HazelcastInstanceTestConfiguration; import ru.spcex.clearing.securities.config.HazelcastServiceTestConfiguration; import ru.spcex.clearing.securities.service.cud.MoneyMarketSecurityService; import ru.spcex.clearing.securities.utils.MatcherFactory; +import ru.spcex.clearing.securities.validation.ValidationProvider; import ru.spcex.platform.imdg.iml.hazelcast.service.HazelcastService; +import ru.spcex.platform.utils.enumeration.SimpleMessageResolver; import java.math.BigDecimal; import java.time.LocalDate; @@ -84,7 +86,8 @@ public class MoneyMarketSecurityServiceDisabled { private void startService() throws InterruptedException { MoneyMarketSecurityService keyRateService = - new MoneyMarketSecurityService(kafkaMockQueue, mockProducer, hazelcastService); + new MoneyMarketSecurityService(kafkaMockQueue, mockProducer, hazelcastService, + new ValidationProvider(hazelcastService), new SimpleMessageResolver()); keyRateService.afterPropertiesSet(); } diff --git a/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithEndDt.java b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithEndDt.java new file mode 100644 index 000000000..411e55415 --- /dev/null +++ b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithEndDt.java @@ -0,0 +1,7 @@ +package ru.spcex.platform.classes.base.interfaces; + +import java.time.LocalDate; + +public interface WithEndDt { + LocalDate getEndDate(); +} diff --git a/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithSecuritySymbol.java b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithSecuritySymbol.java new file mode 100644 index 000000000..d9a9cbe82 --- /dev/null +++ b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithSecuritySymbol.java @@ -0,0 +1,5 @@ +package ru.spcex.platform.classes.base.interfaces; + +public interface WithSecuritySymbol { + String getSecuritySymbol(); +} diff --git a/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithStartDt.java b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithStartDt.java new file mode 100644 index 000000000..990e36b68 --- /dev/null +++ b/platform-parent/platform-classes-base/src/main/java/ru/spcex/platform/classes/base/interfaces/WithStartDt.java @@ -0,0 +1,7 @@ +package ru.spcex.platform.classes.base.interfaces; + +import java.time.LocalDate; + +public interface WithStartDt { + LocalDate getStartDate(); +} diff --git a/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Market.java b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Market.java new file mode 100644 index 000000000..79d820bb0 --- /dev/null +++ b/platform-parent/platform-enum/src/main/java/ru/spcex/platform/enumeration/Market.java @@ -0,0 +1,18 @@ +package ru.spcex.platform.enumeration; + +import ru.spcex.platform.utils.enumeration.IEnumKey; + +public enum Market implements IEnumKey { + mkrs("MKRS"); + + private final String key; + + Market(String key) { + this.key = key; + } + + @Override + public String getKey() { + return key; + } +} diff --git a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java index b1e431044..ac3b60fa3 100644 --- a/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java +++ b/platform-parent/platform-imdg-api-hazelcast-impl/src/main/java/ru/spcex/platform/imdg/iml/hazelcast/adapter/ImdgHazelcast.java @@ -164,6 +164,7 @@ public class ImdgHazelcast implements Imdg { this.hzInstance = hzInstance; } + @Override public String getMapName() { return mapName; } diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/Imdg.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/Imdg.java index ca765d5b5..2784cc2dd 100644 --- a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/Imdg.java +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/api/Imdg.java @@ -6,6 +6,10 @@ import java.util.Collection; import java.util.Map; public interface Imdg { + default String getMapName() { + throw new UnsupportedOperationException("not implemented name"); + } + default void insert(T paramT) { throw new UnsupportedOperationException("not implemented insert"); } diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/ImdgValidationContext.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/ImdgValidationContext.java index 3d853cff4..2e7242a0f 100644 --- a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/ImdgValidationContext.java +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/ImdgValidationContext.java @@ -29,6 +29,9 @@ public class ImdgValidationContext implements IValidatorContext { return validatedObject; } + /** + * !!!не использовать один Enum в разных местах + */ public void storeObject(Enum storedObject, Object anyObject) { storedObjects.put(storedObject, anyObject); } diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/Stored.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/Stored.java new file mode 100644 index 000000000..c9f6ff542 --- /dev/null +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/Stored.java @@ -0,0 +1,11 @@ +package ru.spcex.platform.imdg.validation; + +/** + * !!!не использовать один Enum в разных местах - по энуму на один класс IValidationRule. + */ +public enum Stored { + /** + * если выполняется проверка наличия объекта по Id (см. ru.spcex.platform.imdg.validation.rule.PresentById) + */ + PresentById +} diff --git a/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/rule/PresentById.java b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/rule/PresentById.java new file mode 100644 index 000000000..a69cab7b9 --- /dev/null +++ b/platform-parent/platform-imdg-api/src/main/java/ru/spcex/platform/imdg/validation/rule/PresentById.java @@ -0,0 +1,43 @@ +package ru.spcex.platform.imdg.validation.rule; +import ru.spcex.platform.classes.base.SpcexObjectBase; +import ru.spcex.platform.classes.base.interfaces.WithId; +import ru.spcex.platform.imdg.api.Imdg; +import ru.spcex.platform.imdg.validation.ImdgValidationContext; +import ru.spcex.platform.imdg.validation.Stored; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IEnumId; +import ru.spcex.platform.utils.validation.IValidationRule; + +import java.util.Optional; + +public class PresentById implements IValidationRule> { + private final String mapName; + private final IEnumId errorEnum; + private boolean storeEnabled = false; + + public PresentById(String mapName, IEnumId errorEnum) { + this.mapName = mapName; + this.errorEnum = errorEnum; + } + public PresentById(String mapName, IEnumId errorEnum, Boolean storeEnabled) { + this.mapName = mapName; + this.errorEnum = errorEnum; + this.storeEnabled = storeEnabled; + } + + + @Override + public Optional validate(ImdgValidationContext context) { + WithId actionById = context.getValidatedObject(); + Imdg targetMap = context.obtainMap(mapName, SpcexObjectBase.class); + SpcexObjectBase obj = targetMap.getSingleObjectByID(actionById.getId()); + if (obj == null) { + return of(errorEnum, actionById.getId()); + } else { + if (storeEnabled) { + context.storeObject(Stored.PresentById, obj); + } + return empty(); + } + } +} diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityNewRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityNewRequest.java index 979f8b28e..0527de865 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityNewRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityNewRequest.java @@ -5,10 +5,12 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer; import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer; +import ru.spcex.platform.classes.base.interfaces.WithEndDt; +import ru.spcex.platform.classes.base.interfaces.WithStartDt; import java.time.LocalDate; -public class MoneyMarketSecurityNewRequest { +public class MoneyMarketSecurityNewRequest implements WithStartDt, WithEndDt { @JsonProperty @JsonSerialize(using = LocalDateSerializer.class) @JsonDeserialize(using = LocalDateDeserializer.class) diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityUpdateRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityUpdateRequest.java index 220e52c8a..6af0bbbd6 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityUpdateRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/securitites/MoneyMarketSecurityUpdateRequest.java @@ -6,10 +6,12 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import ru.spcex.clearing.platform.messaging.domain.json.deserialize.LocalDateDeserializer; import ru.spcex.clearing.platform.messaging.domain.json.serialize.LocalDateSerializer; +import ru.spcex.platform.classes.base.interfaces.WithEndDt; +import ru.spcex.platform.classes.base.interfaces.WithStartDt; import java.time.LocalDate; -public class MoneyMarketSecurityUpdateRequest { +public class MoneyMarketSecurityUpdateRequest implements WithStartDt, WithEndDt { @JsonProperty public Long id; @JsonFormat(pattern = "yyyy-MM-dd", timezone = "Europe/Moscow") diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/service/RequestInfoUpdate.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/service/RequestInfoUpdate.java index d83b8e9c1..24e8a1562 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/service/RequestInfoUpdate.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/service/RequestInfoUpdate.java @@ -3,20 +3,40 @@ package ru.spcex.clearing.platform.messaging.service; public class RequestInfoUpdate { private Long id; private Status status; + private String message; + + public RequestInfoUpdate() {} + + public RequestInfoUpdate(Long id, Status status, Long errorId, String message) { + this.id = id; + this.status = status; + this.message = message; + } public Long getId() { return id; } - public void setId(Long id) { + public RequestInfoUpdate setId(Long id) { this.id = id; + return this; } public Status getStatus() { return status; } - public void setStatus(Status status) { + public RequestInfoUpdate setStatus(Status status) { this.status = status; + return this; + } + + public String getMessage() { + return message; + } + + public RequestInfoUpdate setMessage(String message) { + this.message = message; + return this; } } diff --git a/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/enumeration/SimpleMessageResolver.java b/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/enumeration/SimpleMessageResolver.java new file mode 100644 index 000000000..38d9a81fc --- /dev/null +++ b/platform-parent/platform-utils/src/main/java/ru/spcex/platform/utils/enumeration/SimpleMessageResolver.java @@ -0,0 +1,11 @@ +package ru.spcex.platform.utils.enumeration; + +import java.util.Arrays; + +public class SimpleMessageResolver implements IMessageResolver { + @Override + public String resolve(EnumMessage errorMessage) { + if (errorMessage == null) return "null"; + return String.format("(%d) args %s", errorMessage.getSubject().getId(), Arrays.toString(errorMessage.getArgs())); + } +}