diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/common/CommonDeleteAction.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/common/CommonDeleteAction.java index 7b09743f8..c2c72cd46 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/common/CommonDeleteAction.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/common/CommonDeleteAction.java @@ -5,13 +5,14 @@ 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.common.CommonDeleteRequest; +import ru.spcex.platform.classes.base.interfaces.WithId; import ru.spcex.platform.utils.enumeration.EnumMessage; import java.util.Collection; import java.util.Collections; import java.util.List; -public class CommonDeleteAction implements IAction { +public class CommonDeleteAction implements IAction, WithId { @JsonProperty public Long id; 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 047ba3748..62c6d933c 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 @@ -8,10 +8,11 @@ import ru.spcex.clearing.backendapi.domain.actions.IAction; 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 java.time.LocalDate; -public class MoneyMarketSecurityUpdateAction implements IAction { +public class MoneyMarketSecurityUpdateAction implements IAction, WithId { @ApiModelProperty(hidden = true) @JsonProperty public Long id; diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/impl/OperatorImpl.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/impl/OperatorImpl.java index 216b25f58..ab26c3e01 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/impl/OperatorImpl.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/impl/OperatorImpl.java @@ -8,6 +8,7 @@ import ru.spcex.clearing.backendapi.controller.response.cud.QueueSuccessResponse import ru.spcex.clearing.backendapi.domain.actions.IAction; import ru.spcex.clearing.backendapi.errors.ActionValidationException; import ru.spcex.clearing.backendapi.service.IOperator; +import ru.spcex.clearing.backendapi.service.validation.ActionValidationProvider; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.BaseRequest; import ru.spcex.clearing.platform.messaging.service.RequestInfo; @@ -15,6 +16,7 @@ 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.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.validation.IValidator; import java.util.Collection; import java.util.concurrent.ExecutionException; @@ -25,16 +27,18 @@ public class OperatorImpl implements IOperator { private final Producer kafka; private final ImdgId idGenerator; private final ImdgProvider imdgProvider; + private final ActionValidationProvider validation; - public OperatorImpl(Producer kafka, ImdgProvider imdgProvider) { + public OperatorImpl(Producer kafka, ImdgProvider imdgProvider, ActionValidationProvider validation) { this.kafka = kafka; this.idGenerator = imdgProvider.getImdgIdGenerator(); this.imdgProvider = imdgProvider; + this.validation = validation; } @Override public QueueSuccessResponse sendRequestToQueue(String destination, IAction iAction) throws ExecutionException, InterruptedException { - throwValidate(iAction); + throwValidate(destination, iAction); BaseRequest request = new BaseRequest<>(); request.setId(idGenerator.nextId()); request.setActionType(iAction.getActionType()); @@ -52,10 +56,16 @@ public class OperatorImpl implements IOperator { requestStorage.insert(requestInfo); } - private void throwValidate(IAction iAction) { + private void throwValidate(String destination, IAction iAction) { Collection validationErrors = iAction.validate(); if (validationErrors.size() > 0) { throw new ActionValidationException(validationErrors); } + IValidator validator = validation.getValidator(destination, iAction); + if (validator != null) { + validator.tillFirstError().ifPresent(enumMessage -> { + throw new ActionValidationException(enumMessage); + }); + } } } 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 new file mode 100644 index 000000000..e12761076 --- /dev/null +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/validation/ActionValidationProvider.java @@ -0,0 +1,75 @@ +package ru.spcex.clearing.backendapi.service.validation; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Component; +import ru.spcex.clearing.backendapi.controller.request.cud.securities.MoneyMarketSecurityUpdateAction; +import ru.spcex.clearing.backendapi.domain.actions.IAction; +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; +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.utils.validation.IValidator; +import ru.spcex.platform.utils.validation.ValidatorImpl; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +@Component +public class ActionValidationProvider implements InitializingBean { + private final Map> allImdgMaps; + private final ImdgProvider imdgProvider; + private final Map> validators; + + public ActionValidationProvider(ImdgProvider imdgProvider) { + this.validators = new HashMap<>(); + this.allImdgMaps = new HashMap<>(); + this.imdgProvider = imdgProvider; + } + + @Override + public void afterPropertiesSet() throws Exception { + validators.put(Consts.DESTINATION_MONEY_MARKET_SECURITY_UPDATE, idPresent(IMDGDistributedNames.Map_MoneyMarketSecurity)); + validators.put(Consts.DESTINATION_MONEY_MARKET_SECURITY_DELETE, idPresent(IMDGDistributedNames.Map_MoneyMarketSecurity)); + } + + @SuppressWarnings("unchecked") + public IValidator getValidator(String destination, Object action) { + Function constructor = (Function) validators.get(destination); + if (constructor != null) + return constructor.apply(action); + return null; + } + + private Function mmsValidator() { + return mmsObj -> { + ImdgValidationContext ctx = new ImdgValidationContext<>(); + ctx.setValidatedObject(mmsObj); + ValidatorImpl> iValidtor = new ValidatorImpl<>(ctx); + iValidtor.addRule(new PresentById(getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, SpcexObjectBase.class))); + return iValidtor; + }; + } + + private & WithId> Function idPresent(String mapName) { + return iAction -> { + ImdgValidationContext ctx = new ImdgValidationContext<>(); + ctx.setValidatedObject(iAction); + ValidatorImpl> iValidator = new ValidatorImpl<>(ctx); + iValidator.addRule(new PresentById(getImdg(mapName, SpcexObjectBase.class))); + return iValidator; + }; + } + + + @SuppressWarnings("unchecked") + private Imdg getImdg(String mapName, Class clazz) { + return (Imdg) allImdgMaps.computeIfAbsent(mapName, (mapName1) -> imdgProvider.getImdg(mapName, clazz)); + } + + +} 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 new file mode 100644 index 000000000..032767967 --- /dev/null +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/validation/rules/PresentById.java @@ -0,0 +1,28 @@ +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/classes/src/main/java/ru/clearing/common/interfaces/WithId.java b/clearing-parent/classes/src/main/java/ru/clearing/common/interfaces/WithId.java deleted file mode 100644 index 2db02001d..000000000 --- a/clearing-parent/classes/src/main/java/ru/clearing/common/interfaces/WithId.java +++ /dev/null @@ -1,5 +0,0 @@ -package ru.clearing.common.interfaces; - -public interface WithId { - Long getId(); -}