validators
This commit is contained in:
parent
05dfccf5e2
commit
5b82cf4d22
4 changed files with 223 additions and 0 deletions
|
|
@ -0,0 +1,179 @@
|
|||
package ru.spcex.clearing.scheduler;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteRequest;
|
||||
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.*;
|
||||
import ru.spcex.platform.enumeration.DayStatus;
|
||||
import ru.spcex.platform.enumeration.Market;
|
||||
import ru.spcex.platform.enumeration.Status;
|
||||
import ru.spcex.platform.enumeration.Task;
|
||||
import ru.spcex.platform.utils.enumeration.IEnumKey;
|
||||
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalTime;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
public interface IRequestValidator<T> {
|
||||
List<ValidationError> validate(T req);
|
||||
|
||||
/**
|
||||
* Общий запрос на удаление
|
||||
*/
|
||||
IRequestValidator<CommonDeleteRequest> COMMON_DELETE_REQUEST = req -> {
|
||||
var errors = new LinkedList<ValidationError>();
|
||||
validateLong(req.id, "id", true, errors);
|
||||
return errors;
|
||||
};
|
||||
|
||||
/**
|
||||
* Запрос на добавление ClearingCalendar
|
||||
*/
|
||||
IRequestValidator<ClearingCalendarNewRequest> CLEARING_CALENDAR_NEW_REQUEST = req -> {
|
||||
var errors = new LinkedList<ValidationError>();
|
||||
validateDate(req.clearingDate, "clearingDate", true, true, errors);
|
||||
validateLong(req.companyId, "companyId", false, errors);
|
||||
validateEnum(req.dayStatus, "dayStatus", true, errors, DayStatus.values());
|
||||
return errors;
|
||||
};
|
||||
|
||||
/**
|
||||
* Запрос на обновление ClearingCalendar
|
||||
*/
|
||||
IRequestValidator<ClearingCalendarUpdateRequest> CLEARING_CALENDAR_UPDATE_REQUEST = req -> {
|
||||
var errors = new LinkedList<ValidationError>();
|
||||
validateLong(req.id, "id", true, errors);
|
||||
validateLong(req.companyId, "companyId", false, errors);
|
||||
validateDate(req.clearingDate, "clearingDate", false, true, errors);
|
||||
validateEnum(req.dayStatus, "dayStatus", false, errors, DayStatus.values());
|
||||
return errors;
|
||||
};
|
||||
|
||||
/**
|
||||
* Запрос на добавление Planner
|
||||
*/
|
||||
IRequestValidator<PlannerNewRequest> PLANNER_NEW_REQUEST = req -> {
|
||||
var errors = new LinkedList<ValidationError>();
|
||||
validateEnum(req.task, "task", true, errors, Task.values());
|
||||
validateDate(req.clearingDate, "clearingDate", true, true, errors);
|
||||
validateTime(req.taskTime, "taskTime", true, true, errors);
|
||||
validateEnum(req.market, "market", false, errors, Market.values());
|
||||
validateEnum(req.taskStatus, "taskStatus", true, errors, Status.values());
|
||||
validateLong(req.companyId, "companyId", false, errors);
|
||||
validateLong(req.securityId, "securityId", false, errors);
|
||||
return errors;
|
||||
};
|
||||
|
||||
/**
|
||||
* Запрос на обновление Planner
|
||||
*/
|
||||
IRequestValidator<PlannerUpdateRequest> PLANNER_UPDATE_REQUEST = req -> {
|
||||
var errors = new LinkedList<ValidationError>();
|
||||
validateLong(req.id, "id", true, errors);
|
||||
validateEnum(req.task, "task", false, errors, Task.values());
|
||||
validateDate(req.clearingDate, "clearingDate", false, true, errors);
|
||||
validateTime(req.taskTime, "taskTime", false, true, errors);
|
||||
validateEnum(req.market, "market", false, errors, Market.values());
|
||||
validateEnum(req.taskStatus, "taskStatus", false, errors, Status.values());
|
||||
validateLong(req.companyId, "companyId", false, errors);
|
||||
validateLong(req.securityId, "securityId", false, errors);
|
||||
return errors;
|
||||
};
|
||||
|
||||
/**
|
||||
* Запрос на добавление PlannerTemplate
|
||||
*/
|
||||
IRequestValidator<PlannerTemplateNewRequest> PLANNER_TEMPLATE_NEW_REQUEST = req -> {
|
||||
var errors = new LinkedList<ValidationError>();
|
||||
validateEnum(req.task, "task", true, errors, Task.values());
|
||||
validateTime(req.taskTime, "taskTime", true, true, errors);
|
||||
validateEnum(req.taskStatus, "taskStatus", true, errors, Status.values());
|
||||
validateLong(req.companyId, "companyId", false, errors);
|
||||
validateLong(req.securityId, "securityId", false, errors);
|
||||
return errors;
|
||||
};
|
||||
|
||||
/**
|
||||
* Запрос на обновление PlannerTemplate
|
||||
*/
|
||||
IRequestValidator<PlannerTemplateUpdateRequest> PLANNER_TEMPLATE_UPDATE_REQUEST = req -> {
|
||||
var errors = new LinkedList<ValidationError>();
|
||||
validateLong(req.id, "id", true, errors);
|
||||
validateEnum(req.task, "task", false, errors, Task.values());
|
||||
validateTime(req.taskTime, "taskTime", false, true, errors);
|
||||
validateEnum(req.taskStatus, "taskStatus", false, errors, Status.values());
|
||||
validateLong(req.companyId, "companyId", false, errors);
|
||||
validateLong(req.securityId, "securityId", false, errors);
|
||||
return errors;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
static <T extends Enum<T> & IEnumKey> void validateEnum(String enumStr,
|
||||
String fieldName,
|
||||
boolean required,
|
||||
List<ValidationError> errors,
|
||||
T... enumSet) {
|
||||
if (enumStr != null) {
|
||||
boolean correctTask = IEnumKey.contains(enumStr, enumSet);
|
||||
if (!correctTask)
|
||||
errors.add(new ValidationError(fieldName, ErrorType.UNKNOWN_VALUE));
|
||||
} else if (required) errors.add(new ValidationError(fieldName, ErrorType.MISSING_REQUIRED));
|
||||
}
|
||||
|
||||
static void validateLong(Long value, String fieldName, boolean required, List<ValidationError> errors) {
|
||||
if (value != null) {
|
||||
if (value < 0 || value == Long.MAX_VALUE)
|
||||
errors.add(new ValidationError(fieldName, ErrorType.INVALID_VALUE));
|
||||
} else if (required) errors.add(new ValidationError(fieldName, ErrorType.MISSING_REQUIRED));
|
||||
}
|
||||
|
||||
static void validateDate(LocalDate value,
|
||||
String fieldName,
|
||||
boolean required,
|
||||
boolean checkDate,
|
||||
List<ValidationError> errors) {
|
||||
if (value != null) {
|
||||
if (checkDate && (value.isBefore(LocalDate.now())))
|
||||
errors.add(new ValidationError(fieldName, ErrorType.INVALID_VALUE));
|
||||
} else if (required) errors.add(new ValidationError(fieldName, ErrorType.MISSING_REQUIRED));
|
||||
}
|
||||
|
||||
static void validateTime(LocalTime value,
|
||||
String fieldName,
|
||||
boolean required,
|
||||
boolean checkDate,
|
||||
List<ValidationError> errors) {
|
||||
if (value != null) {
|
||||
if (checkDate && (value.isBefore(LocalTime.now())))
|
||||
errors.add(new ValidationError(fieldName, ErrorType.INVALID_VALUE));
|
||||
} else if (required) errors.add(new ValidationError(fieldName, ErrorType.MISSING_REQUIRED));
|
||||
}
|
||||
|
||||
/**
|
||||
* Временный метод
|
||||
*/
|
||||
static boolean checkErrorList(List<IRequestValidator.ValidationError> errors, Logger log) {
|
||||
if (!errors.isEmpty()) {
|
||||
log.error("Validation error: [{}]",
|
||||
errors.stream().map(IRequestValidator.ValidationError::toString).collect(Collectors.joining(", "))
|
||||
);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
enum ErrorType {
|
||||
MISSING_REQUIRED, UNKNOWN_VALUE, INVALID_VALUE
|
||||
}
|
||||
|
||||
record ValidationError(String fieldName, ErrorType errorType) {
|
||||
@Override
|
||||
public String toString() {
|
||||
return "%s: %s".formatted(fieldName, errorType);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -15,15 +15,21 @@ import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteReques
|
|||
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.ClearingCalendarNewRequest;
|
||||
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.ClearingCalendarUpdateRequest;
|
||||
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
|
||||
import ru.spcex.clearing.scheduler.IRequestValidator;
|
||||
import ru.spcex.platform.imdg.api.Imdg;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
public class ClearingCalendarService extends QueueConsumer implements InitializingBean {
|
||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||
private final Imdg<ClearingCalendar> clearingCalendarMap;
|
||||
private final IRequestValidator<ClearingCalendarNewRequest> newRequestValidator = IRequestValidator.CLEARING_CALENDAR_NEW_REQUEST;
|
||||
private final IRequestValidator<ClearingCalendarUpdateRequest> updateRequestValidator = IRequestValidator.CLEARING_CALENDAR_UPDATE_REQUEST;
|
||||
private final IRequestValidator<CommonDeleteRequest> deleteRequestValidator = IRequestValidator.COMMON_DELETE_REQUEST;
|
||||
|
||||
@Autowired
|
||||
public ClearingCalendarService(Consumer<String, Object> kafkaQueue, Producer<String, Object> kafkaProducer,
|
||||
|
|
@ -49,6 +55,8 @@ public class ClearingCalendarService extends QueueConsumer implements Initializi
|
|||
private void newClearingCalendar(BaseRequest<ClearingCalendarNewRequest> userRequest) {
|
||||
ClearingCalendarNewRequest req = userRequest.getRequestPayload();
|
||||
log.debug("ClearingCalendarNewRequest received");
|
||||
List<IRequestValidator.ValidationError> errors = newRequestValidator.validate(req);
|
||||
if (IRequestValidator.checkErrorList(errors, log)) return;
|
||||
ClearingCalendar clearingCalendar = new ClearingCalendar();
|
||||
Instant created = Instant.now();
|
||||
clearingCalendar.setCreated(created);
|
||||
|
|
@ -62,6 +70,8 @@ public class ClearingCalendarService extends QueueConsumer implements Initializi
|
|||
private void updateClearingCalendar(BaseRequest<ClearingCalendarUpdateRequest> userRequest) {
|
||||
ClearingCalendarUpdateRequest req = userRequest.getRequestPayload();
|
||||
log.debug("ClearingCalendarUpdateRequest received");
|
||||
List<IRequestValidator.ValidationError> errors = updateRequestValidator.validate(req);
|
||||
if (IRequestValidator.checkErrorList(errors, log)) return;
|
||||
Instant updated = Instant.now();
|
||||
ClearingCalendar clearingCalendar = clearingCalendarMap.getSingleObjectByID(req.getId());
|
||||
clearingCalendar.setClearingDate(req.getClearingDate());
|
||||
|
|
@ -74,8 +84,20 @@ public class ClearingCalendarService extends QueueConsumer implements Initializi
|
|||
|
||||
private void deleteClearingCalendar(BaseRequest<CommonDeleteRequest> userRequest) {
|
||||
CommonDeleteRequest req = userRequest.getRequestPayload();
|
||||
List<IRequestValidator.ValidationError> errors = deleteRequestValidator.validate(req);
|
||||
if (IRequestValidator.checkErrorList(errors, log)) return;
|
||||
log.debug("CommonDeleteRequest received id = {}", req.getId());
|
||||
ClearingCalendar clearingCalendar = clearingCalendarMap.getSingleObjectByID(req.getId());
|
||||
clearingCalendarMap.delete(clearingCalendar);
|
||||
}
|
||||
|
||||
static boolean checkErrors(List<IRequestValidator.ValidationError> errors, Logger log) {
|
||||
if (!errors.isEmpty()) {
|
||||
log.error("Validation error: [{}]",
|
||||
errors.stream().map(IRequestValidator.ValidationError::toString).collect(Collectors.joining(", "))
|
||||
);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,15 +15,20 @@ import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteReques
|
|||
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.PlannerNewRequest;
|
||||
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.PlannerUpdateRequest;
|
||||
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
|
||||
import ru.spcex.clearing.scheduler.IRequestValidator;
|
||||
import ru.spcex.platform.imdg.api.Imdg;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
public class PlannerService extends QueueConsumer implements InitializingBean {
|
||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||
private final Imdg<Planner> plannerMap;
|
||||
private final IRequestValidator<PlannerNewRequest> plannerNewRequest = IRequestValidator.PLANNER_NEW_REQUEST;
|
||||
private final IRequestValidator<PlannerUpdateRequest> plannerUpdateRequest = IRequestValidator.PLANNER_UPDATE_REQUEST;
|
||||
private final IRequestValidator<CommonDeleteRequest> deleteRequestValidator = IRequestValidator.COMMON_DELETE_REQUEST;
|
||||
|
||||
@Autowired
|
||||
public PlannerService(Consumer<String, Object> kafkaQueue, Producer<String, Object> kafkaProducer,
|
||||
|
|
@ -49,6 +54,8 @@ public class PlannerService extends QueueConsumer implements InitializingBean {
|
|||
private void newScheduler(BaseRequest<PlannerNewRequest> userRequest) {
|
||||
PlannerNewRequest req = userRequest.getRequestPayload();
|
||||
log.debug("PlannerNewRequest received");
|
||||
List<IRequestValidator.ValidationError> errors = plannerNewRequest.validate(req);
|
||||
if (IRequestValidator.checkErrorList(errors, log)) return;
|
||||
Planner planner = new Planner();
|
||||
planner.setCreated(Instant.now());
|
||||
planner.setTask(req.getTask());
|
||||
|
|
@ -65,6 +72,8 @@ public class PlannerService extends QueueConsumer implements InitializingBean {
|
|||
private void updateScheduler(BaseRequest<PlannerUpdateRequest> userRequest) {
|
||||
PlannerUpdateRequest req = userRequest.getRequestPayload();
|
||||
log.debug("PlannerUpdateRequest received id = {}", req.getId());
|
||||
List<IRequestValidator.ValidationError> errors = plannerUpdateRequest.validate(req);
|
||||
if (IRequestValidator.checkErrorList(errors, log)) return;
|
||||
Planner planner = plannerMap.getSingleObjectByID(req.getId());
|
||||
planner.setUpdated(Instant.now());
|
||||
planner.setTask(req.getTask());
|
||||
|
|
@ -80,6 +89,8 @@ public class PlannerService extends QueueConsumer implements InitializingBean {
|
|||
private void deleteScheduler(BaseRequest<CommonDeleteRequest> userRequest) {
|
||||
CommonDeleteRequest req = userRequest.getRequestPayload();
|
||||
log.debug("CommonDeleteRequest received id = {}", req.getId());
|
||||
List<IRequestValidator.ValidationError> errors = deleteRequestValidator.validate(req);
|
||||
if (IRequestValidator.checkErrorList(errors, log)) return;
|
||||
Planner planner = plannerMap.getSingleObjectByID(req.getId());
|
||||
plannerMap.delete(planner);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -15,15 +15,20 @@ import ru.spcex.clearing.platform.messaging.domain.cud.common.CommonDeleteReques
|
|||
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.PlannerTemplateNewRequest;
|
||||
import ru.spcex.clearing.platform.messaging.domain.cud.schedule.PlannerTemplateUpdateRequest;
|
||||
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
|
||||
import ru.spcex.clearing.scheduler.IRequestValidator;
|
||||
import ru.spcex.platform.imdg.api.Imdg;
|
||||
import ru.spcex.platform.imdg.api.ImdgProvider;
|
||||
|
||||
import java.time.Instant;
|
||||
import java.util.List;
|
||||
|
||||
@Service
|
||||
public class PlannerTemplateService extends QueueConsumer implements InitializingBean {
|
||||
private final Logger log = LoggerFactory.getLogger(getClass());
|
||||
private final Imdg<PlannerTemplate> plannerTemplateMap;
|
||||
private final IRequestValidator<PlannerTemplateNewRequest> plannerTemplateNewRequest = IRequestValidator.PLANNER_TEMPLATE_NEW_REQUEST;
|
||||
private final IRequestValidator<PlannerTemplateUpdateRequest> plannerTemplateUpdateRequest = IRequestValidator.PLANNER_TEMPLATE_UPDATE_REQUEST;
|
||||
private final IRequestValidator<CommonDeleteRequest> deleteRequestValidator = IRequestValidator.COMMON_DELETE_REQUEST;
|
||||
|
||||
@Autowired
|
||||
public PlannerTemplateService(Consumer<String, Object> kafkaQueue, Producer<String, Object> kafkaProducer,
|
||||
|
|
@ -49,6 +54,8 @@ public class PlannerTemplateService extends QueueConsumer implements Initializin
|
|||
private void newTimetable(BaseRequest<PlannerTemplateNewRequest> userRequest) {
|
||||
PlannerTemplateNewRequest req = userRequest.getRequestPayload();
|
||||
log.debug("PlannerTemplateNewRequest received");
|
||||
List<IRequestValidator.ValidationError> errors = plannerTemplateNewRequest.validate(req);
|
||||
if (IRequestValidator.checkErrorList(errors, log)) return;
|
||||
PlannerTemplate plannerTemplate = new PlannerTemplate();
|
||||
Instant created = Instant.now();
|
||||
plannerTemplate.setCreated(created);
|
||||
|
|
@ -65,6 +72,8 @@ public class PlannerTemplateService extends QueueConsumer implements Initializin
|
|||
PlannerTemplateUpdateRequest req = userRequest.getRequestPayload();
|
||||
log.debug("PlannerTemplateUpdateRequest received");
|
||||
PlannerTemplate plannerTemplate = plannerTemplateMap.getSingleObjectByID(req.getId());
|
||||
List<IRequestValidator.ValidationError> errors = plannerTemplateUpdateRequest.validate(req);
|
||||
if (IRequestValidator.checkErrorList(errors, log)) return;
|
||||
Instant updated = Instant.now();
|
||||
plannerTemplate.setUpdated(updated);
|
||||
plannerTemplate.setTask(req.getTask());
|
||||
|
|
@ -79,6 +88,8 @@ public class PlannerTemplateService extends QueueConsumer implements Initializin
|
|||
private void deleteTimetable(BaseRequest<CommonDeleteRequest> userRequest) {
|
||||
CommonDeleteRequest req = userRequest.getRequestPayload();
|
||||
log.debug("CommonDeleteRequest received id = {}", req.getId());
|
||||
List<IRequestValidator.ValidationError> errors = deleteRequestValidator.validate(req);
|
||||
if (IRequestValidator.checkErrorList(errors, log)) return;
|
||||
PlannerTemplate plannerTemplate = plannerTemplateMap.getSingleObjectByID(req.getId());
|
||||
plannerTemplateMap.delete(plannerTemplate);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue