ialbert 2022-10-28 15:04:01 +03:00
parent 3193e7014f
commit 927b033763
5 changed files with 88 additions and 26 deletions

View file

@ -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;
}
}

View file

@ -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() {

View file

@ -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);
}
});
}
}

View file

@ -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) {

View file

@ -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();
}
}