EndDtAfterStartDtRule

This commit is contained in:
akulikov 2023-04-04 11:29:09 +03:00
parent 536df6a156
commit f334a31b10

View file

@ -0,0 +1,86 @@
package ru.spcex.clearing.validation.common.rules;
import ru.spcex.platform.imdg.validation.ImdgValidationContext;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IEnumId;
import ru.spcex.platform.utils.validation.IValidationRule;
import java.time.LocalDate;
import java.util.Optional;
import java.util.function.Function;
/**
* Проверка EndDt < StartDt
* @param <R> Класс проверяемого объекта
*/
public record EndDtAfterStartDtRule<R>(
String endDtFieldName,
String startDtFieldName,
Function<R, LocalDate> getterEndDt,
Function<R, LocalDate> getterStartDt,
IEnumId errorEmptyRequiredValue,
IEnumId errorEndDtAfterStartDt,
boolean required
) implements IValidationRule<ImdgValidationContext<R>> {
/**
* @param endDtFieldName Название поля класса, содержащий EndDt
* @param startDtFieldName Название поля класса, содержащий StartDt
* @param getterEndDt Метод получения проверяемой EndDt
* @param getterStartDt Метод получения проверяемой StartDt
* @param errorEmptyRequiredValue Ошибка, которая будет возвращена, если одна из дат пустая
* @param errorEndDtAfterStartDt Ошибка, которая будет возвращена, если EndDt > StartDt
* @param required Флаг обязательности поля
* @param <R> Класс проверяемого объекта
*/
public static <R> EndDtAfterStartDtRule<R> instance(String endDtFieldName,
String startDtFieldName,
Function<R, LocalDate> getterEndDt,
Function<R, LocalDate> getterStartDt,
IEnumId errorEmptyRequiredValue,
IEnumId errorEndDtAfterStartDt,
boolean required) {
return new EndDtAfterStartDtRule<>(endDtFieldName,
startDtFieldName,
getterEndDt,
getterStartDt,
errorEmptyRequiredValue,
errorEndDtAfterStartDt,
required);
}
/**
* @param endDtFieldName Название поля класса, содержащий EndDt
* @param startDtFieldName Название поля класса, содержащий StartDt
* @param getterEndDt Метод получения проверяемой EndDt
* @param getterStartDt Метод получения проверяемой StartDt
* @param errorEmptyRequiredValue Ошибка, которая будет возвращена, если одна из дат пустая
* @param errorEndDtAfterStartDt Ошибка, которая будет возвращена, если EndDt > StartDt
* @param <R> Класс проверяемого объекта
*/
public static <R> EndDtAfterStartDtRule<R> instance(String endDtFieldName,
String startDtFieldName,
Function<R, LocalDate> getterEndDt,
Function<R, LocalDate> getterStartDt,
IEnumId errorEmptyRequiredValue,
IEnumId errorEndDtAfterStartDt) {
return new EndDtAfterStartDtRule<>(endDtFieldName,
startDtFieldName,
getterEndDt,
getterStartDt,
errorEmptyRequiredValue,
errorEndDtAfterStartDt,
true);
}
@Override
public Optional<EnumMessage> validate(ImdgValidationContext<R> context) {
R validatedObject = context.getValidatedObject();
LocalDate endDt = getterEndDt.apply(validatedObject);
LocalDate startDt = getterStartDt.apply(validatedObject);
if (endDt == null) return required ? of(errorEmptyRequiredValue, endDtFieldName) : Optional.empty();
if (startDt == null) return required ? of(errorEmptyRequiredValue, startDtFieldName) : Optional.empty();
if (endDt.isAfter(startDt)) return of(errorEndDtAfterStartDt);
return Optional.empty();
}
}