http://jira.mfd.msk:8088/browse/CLS-70
This commit is contained in:
parent
3193e7014f
commit
927b033763
5 changed files with 88 additions and 26 deletions
|
|
@ -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<User> 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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<TaskRunnerCommandRequest> {
|
||||
|
|
@ -36,10 +36,10 @@ public class TaskRunnerNew implements IAction<TaskRunnerCommandRequest> {
|
|||
|
||||
@Override
|
||||
public Collection<EnumMessage> 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() {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<MoneyMarketSecurityUpdateAction, IValidator> mmsValidator() {
|
||||
return mmsObj -> {
|
||||
ImdgValidationContext<MoneyMarketSecurityUpdateAction> ctx = new ImdgValidationContext<>();
|
||||
ctx.setValidatedObject(mmsObj);
|
||||
ValidatorImpl<ImdgValidationContext<MoneyMarketSecurityUpdateAction>> iValidtor = new ValidatorImpl<>(ctx);
|
||||
iValidtor.addRule(new PresentById(getImdg(IMDGDistributedNames.Map_MoneyMarketSecurity, SpcexObjectBase.class)));
|
||||
return iValidtor;
|
||||
};
|
||||
}
|
||||
|
||||
private <T extends IAction<?> & WithId> Function<T, IValidator> idPresent(String mapName) {
|
||||
return iAction -> {
|
||||
ImdgValidationContext<T> ctx = new ImdgValidationContext<>();
|
||||
|
|
@ -65,6 +61,17 @@ public class ActionValidationProvider implements InitializingBean {
|
|||
};
|
||||
}
|
||||
|
||||
private Function<TaskRunnerNew, IValidator> taskRunnerNew() {
|
||||
return taskRunnerNew -> {
|
||||
ImdgValidationContext<TaskRunnerNew> ctx = new ImdgValidationContext<>();
|
||||
ctx.setValidatedObject(taskRunnerNew);
|
||||
ctx.addImdg(IMDGDistributedNames.Map_TaskDictionary, getImdg(IMDGDistributedNames.Map_TaskDictionary, AbstractDictionary.class));
|
||||
ValidatorImpl<ImdgValidationContext<TaskRunnerNew>> iValidator = new ValidatorImpl<>(ctx);
|
||||
iValidator.addRule(TaskRunnerNewValidationRule.knownTaskDictionary);
|
||||
return iValidator;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private <T extends SpcexObjectBase> Imdg<T> getImdg(String mapName, Class<T> clazz) {
|
||||
|
|
|
|||
|
|
@ -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<ImdgValidationContext<TaskRunnerNew>> {
|
||||
knownTaskDictionary() {
|
||||
@Override
|
||||
public Optional<EnumMessage> validate(ImdgValidationContext<TaskRunnerNew> context) {
|
||||
TaskRunnerNew validatedObject = context.getValidatedObject();
|
||||
Imdg<AbstractDictionary> 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();
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue