From 927b0337639b2627af913090afcf39430831beb2 Mon Sep 17 00:00:00 2001 From: ialbert Date: Fri, 28 Oct 2022 15:04:01 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-101 http://jira.mfd.msk:8088/browse/CLS-70 --- .../queue/scheduler/TaskRunnerController.java | 34 ++++++++++++++----- .../request/cud/schedule/TaskRunnerNew.java | 8 ++--- .../backendapi/service/impl/OperatorImpl.java | 8 ++++- .../validation/ActionValidationProvider.java | 31 ++++++++++------- .../rules/TaskRunnerNewValidationRule.java | 33 ++++++++++++++++++ 5 files changed, 88 insertions(+), 26 deletions(-) create mode 100644 clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/validation/rules/TaskRunnerNewValidationRule.java diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/scheduler/TaskRunnerController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/scheduler/TaskRunnerController.java index d90d3b877..b76a1f163 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/scheduler/TaskRunnerController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/scheduler/TaskRunnerController.java @@ -5,14 +5,12 @@ import io.swagger.annotations.ApiParam; import io.swagger.annotations.ApiResponse; import io.swagger.annotations.ApiResponses; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.*; import ru.clearing.classes.statics.data.scheduler.TaskRunner; import ru.clearing.classes.statics.data.user.User; import ru.spcex.clearing.backendapi.controller.queue.AbstractQueueController; @@ -20,6 +18,7 @@ import ru.spcex.clearing.backendapi.controller.request.cud.schedule.TaskRunnerNe import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse; import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse; import ru.spcex.clearing.backendapi.controller.response.entity.schedule.TaskRunnerBackendGetAll; +import ru.spcex.clearing.backendapi.errors.NotFound404Exception; import ru.spcex.clearing.backendapi.security.KeycloakUtils; import ru.spcex.clearing.backendapi.service.IOperator; import ru.spcex.clearing.backendapi.service.IStateLoader; @@ -27,13 +26,15 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.platform.imdg.api.Imdg; import ru.spcex.platform.imdg.api.ImdgProvider; +import ru.spcex.platform.utils.enumeration.EnumMessage; +import ru.spcex.platform.utils.enumeration.IMessageResolver; import java.util.Collection; import java.util.Map; import java.util.concurrent.ExecutionException; @Controller -@RequestMapping("/schedule/task-runners") +@RequestMapping("/task-runners") public class TaskRunnerController extends AbstractQueueController { private final IStateLoader stateLoader; private final Imdg userImdg; @@ -58,18 +59,33 @@ public class TaskRunnerController extends AbstractQueueController { @ApiOperation(value = "create task runner.") @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)}) - @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @RequestMapping(value = "/{task-code}", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody - public CudResponse add( - @ApiParam(value = "Параметры команды в JSON формате.", required = true) - @RequestBody TaskRunnerNew taskRunnerCommand) throws ExecutionException, InterruptedException { + public CudResponse add(@ApiParam(value = "Код задания из taskDictionary", required = true, example = "ABLK") + @PathVariable("task-code") String dictionaryName) throws ExecutionException, InterruptedException { + TaskRunnerNew taskRunnerCommand = new TaskRunnerNew(); Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); String username = KeycloakUtils.getUserNameFromAuthentication(authentication); User user = userImdg.getSingleObjectByFieldValues(Map.of("identifier", username)); if (user == null) { throw new IllegalStateException("cannot obtain userId from logged in user " + username); } + taskRunnerCommand.setTask(dictionaryName); taskRunnerCommand.setUserId(user.getId()); return processRequest(Consts.TASK_RUNNER_NEW, taskRunnerCommand); } + + @Autowired + private IMessageResolver errorResolver; + + @ResponseStatus(value = HttpStatus.NOT_FOUND) + @ResponseBody + @ExceptionHandler(NotFound404Exception.class) + public BasicSpcexResponse conflict(NotFound404Exception ex) { + BasicSpcexResponse response = new BasicSpcexResponse(); + EnumMessage message = ex.getError(); + response.setCode(message.getSubject().getId()); + response.setMessage(errorResolver.resolve(message)); + return response; + } } diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/schedule/TaskRunnerNew.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/schedule/TaskRunnerNew.java index 95f348e31..6c10f0c70 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/schedule/TaskRunnerNew.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/request/cud/schedule/TaskRunnerNew.java @@ -9,8 +9,8 @@ import ru.spcex.clearing.platform.messaging.domain.ActionType; import ru.spcex.clearing.platform.messaging.domain.cud.schedule.TaskRunnerCommandRequest; import ru.spcex.platform.utils.enumeration.EnumMessage; -import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.List; public class TaskRunnerNew implements IAction { @@ -36,10 +36,10 @@ public class TaskRunnerNew implements IAction { @Override public Collection validate() { - if (task == null || !Arrays.asList("addBalance", "getBalanceDiff").contains(task)) { - return List.of(new EnumMessage(BackEndError.ValidationError,"task")); + if (task == null) { + return List.of(new EnumMessage(BackEndError.ValidationError,"url parameter 'task-code'")); } - return IAction.super.validate(); + return Collections.emptyList(); } public String getTask() { 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 ab26c3e01..dedc83844 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 @@ -7,6 +7,8 @@ import org.springframework.stereotype.Service; 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.errors.BackEndError; +import ru.spcex.clearing.backendapi.errors.NotFound404Exception; import ru.spcex.clearing.backendapi.service.IOperator; import ru.spcex.clearing.backendapi.service.validation.ActionValidationProvider; import ru.spcex.clearing.imdg.IMDGDistributedNames; @@ -64,7 +66,11 @@ public class OperatorImpl implements IOperator { IValidator validator = validation.getValidator(destination, iAction); if (validator != null) { validator.tillFirstError().ifPresent(enumMessage -> { - throw new ActionValidationException(enumMessage); + if (enumMessage.getSubject().equalsById(BackEndError.ResourceNotFound.getId())) { + throw new NotFound404Exception((String) enumMessage.getArgs()[0]); + } else { + 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 index e12761076..d20ff3db8 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 @@ -2,9 +2,11 @@ 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.clearing.platform.dictionary.AbstractDictionary; +import ru.spcex.clearing.backendapi.controller.request.cud.schedule.TaskRunnerNew; import ru.spcex.clearing.backendapi.domain.actions.IAction; import ru.spcex.clearing.backendapi.service.validation.rules.PresentById; +import ru.spcex.clearing.backendapi.service.validation.rules.TaskRunnerNewValidationRule; import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.platform.messaging.domain.Consts; import ru.spcex.platform.classes.base.SpcexObjectBase; @@ -32,9 +34,13 @@ public class ActionValidationProvider implements InitializingBean { } @Override - public void afterPropertiesSet() throws Exception { + public void afterPropertiesSet() { + getImdg(IMDGDistributedNames.Map_TaskDictionary, AbstractDictionary.class); + getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, 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.TASK_RUNNER_NEW, taskRunnerNew()); } @SuppressWarnings("unchecked") @@ -45,16 +51,6 @@ public class ActionValidationProvider implements InitializingBean { 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<>(); @@ -65,6 +61,17 @@ public class ActionValidationProvider implements InitializingBean { }; } + private Function taskRunnerNew() { + return taskRunnerNew -> { + ImdgValidationContext ctx = new ImdgValidationContext<>(); + ctx.setValidatedObject(taskRunnerNew); + ctx.addImdg(IMDGDistributedNames.Map_TaskDictionary, getImdg(IMDGDistributedNames.Map_TaskDictionary, AbstractDictionary.class)); + ValidatorImpl> iValidator = new ValidatorImpl<>(ctx); + iValidator.addRule(TaskRunnerNewValidationRule.knownTaskDictionary); + return iValidator; + }; + } + @SuppressWarnings("unchecked") private Imdg getImdg(String mapName, Class clazz) { diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/validation/rules/TaskRunnerNewValidationRule.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/validation/rules/TaskRunnerNewValidationRule.java new file mode 100644 index 000000000..0b72d0a7d --- /dev/null +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/validation/rules/TaskRunnerNewValidationRule.java @@ -0,0 +1,33 @@ +package ru.spcex.clearing.backendapi.service.validation.rules; + +import ru.clearing.platform.dictionary.AbstractDictionary; +import ru.spcex.clearing.backendapi.controller.request.cud.schedule.TaskRunnerNew; +import ru.spcex.clearing.backendapi.errors.BackEndError; +import ru.spcex.clearing.imdg.IMDGDistributedNames; +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 TaskRunnerNewValidationRule implements IValidationRule> { + knownTaskDictionary() { + @Override + public Optional validate(ImdgValidationContext context) { + TaskRunnerNew validatedObject = context.getValidatedObject(); + Imdg taskDictionaryImdg = context.obtainMap(IMDGDistributedNames.Map_TaskDictionary, AbstractDictionary.class); + AbstractDictionary taskEnum = taskDictionaryImdg.getSingleObjectByFieldValues(Map.of("code", validatedObject.getTask())); + if (taskEnum == null) { + return of(BackEndError.ResourceNotFound, "taskDictionary " + validatedObject.getTask()); + } + return empty(); + } + }; + + @Override + public String ruleName() { + return "TaskRunnerNewValidationRule." + name(); + } +}