From f4529a2fc73ced85d7ffce1595d3434577ebee95 Mon Sep 17 00:00:00 2001 From: "adel.ka" Date: Fri, 12 Sep 2025 16:51:03 +0300 Subject: [PATCH] SUPPORT-9389: add server validation --- .../validator/RequiredFieldValidator.java | 51 ++++++ .../service/UserAuthorityFormService.java | 65 ++++++- .../common_errors_messages.properties | 2 + .../common_errors_messages_ru_RU.properties | 1 + .../Создать заявку на изменение.page | 169 ++++++++++++++++-- 5 files changed, 271 insertions(+), 17 deletions(-) create mode 100644 backend/src/main/java/ru/micord/ervu/account_applications/component/validator/RequiredFieldValidator.java create mode 100644 backend/src/main/resources/messages/common_errors_messages.properties create mode 100644 backend/src/main/resources/messages/common_errors_messages_ru_RU.properties diff --git a/backend/src/main/java/ru/micord/ervu/account_applications/component/validator/RequiredFieldValidator.java b/backend/src/main/java/ru/micord/ervu/account_applications/component/validator/RequiredFieldValidator.java new file mode 100644 index 00000000..7ed5d01f --- /dev/null +++ b/backend/src/main/java/ru/micord/ervu/account_applications/component/validator/RequiredFieldValidator.java @@ -0,0 +1,51 @@ +package ru.micord.ervu.account_applications.component.validator; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import model.FieldData; +import model.FormValidationResult; +import model.SimpleFormValidationResult; +import org.springframework.context.support.MessageSourceAccessor; +import service.FormValidatorWithCode; + +import ru.cg.webbpm.modules.core.runtime.api.MessageBundleUtils; +import ru.cg.webbpm.modules.database.bean.entity_graph.EntityColumn; + +public class RequiredFieldValidator extends FormValidatorWithCode { + private static final MessageSourceAccessor MESSAGE_SOURCE = MessageBundleUtils.createAccessor( + "messages/common_errors_messages"); + public String[] requiredFields; + + @Override + public FormValidationResult validate(Map values, + List fieldData) { + List missingFields = new ArrayList<>(); + + for (String fieldName : requiredFields) { + if (isFieldNull(fieldName, values, fieldData)) { + missingFields.add(fieldName); + } + } + + if (!missingFields.isEmpty()) { + String message = + MESSAGE_SOURCE.getMessage("form_field_required") + String.join(", ", missingFields); + return SimpleFormValidationResult.invalid(code, message); + } + + return SimpleFormValidationResult.valid(code); + } + + private boolean isFieldNull(String fieldName, Map values, + List fieldData) { + for (Map.Entry entry : values.entrySet()) { + if (fieldName.equals(entry.getKey().getName())) { + return entry.getValue() == null; + } + } + + return true; + } +} diff --git a/backend/src/main/java/ru/micord/ervu/account_applications/service/UserAuthorityFormService.java b/backend/src/main/java/ru/micord/ervu/account_applications/service/UserAuthorityFormService.java index bf1dfc12..5bdac16f 100644 --- a/backend/src/main/java/ru/micord/ervu/account_applications/service/UserAuthorityFormService.java +++ b/backend/src/main/java/ru/micord/ervu/account_applications/service/UserAuthorityFormService.java @@ -1,31 +1,88 @@ package ru.micord.ervu.account_applications.service; +import exception.FormValidationException; import model.BpmnVariableForSave; import model.FieldData; + +import ru.cg.webbpm.modules.core.error_handling.api.ErrorMetadata; +import ru.cg.webbpm.modules.core.error_handling.api.ErrorMetadataItem; +import ru.cg.webbpm.modules.core.runtime.api.LocalizedException; +import ru.cg.webbpm.modules.core.runtime.api.MessageBundleUtils; +import ru.cg.webbpm.modules.database.bean.entity_graph.EntityColumn; import ru.cg.webbpm.modules.webkit.annotations.RpcSharedProperty; + +import model.FormValidationResult; +import org.springframework.context.support.MessageSourceAccessor; +import service.FormValidator; import service.container.AbstractGraphFormService; import service.container.FormMode; import service.container.FormService; +import java.util.LinkedList; import java.util.List; +import java.util.Map; /** - * Обрезанный FormServiceImpl из платформы, отвязанный от BPMN зависимостей - * Поддержку BMPN решели из этого проекта убрать + * Обрезанный FormServiceImpl из платформы, отвязанный от BPMN зависимостей Поддержку BMPN решели из + * этого проекта убрать + * * @author Denis Ivanov */ public class UserAuthorityFormService extends AbstractGraphFormService implements FormService { - + private static final MessageSourceAccessor MESSAGE_SOURCE = MessageBundleUtils.createAccessor( + "messages/form_messages"); @RpcSharedProperty public FormMode mode = FormMode.SIMPLE; // this is to share property with the default Form.ts @Override public Object saveData(String s, List list, Boolean aBoolean, - List list1) throws Exception { + List list1) throws Exception { throw new UnsupportedOperationException("BPMN operations are unsupported"); } + protected Object saveDataById(Object selectedId, List fieldData) { + Map valuesForSave = this.getValuesForSave(selectedId, fieldData); + if (valuesForSave.isEmpty()) { + throw new LocalizedException("form_field.entity_not_exists", MESSAGE_SOURCE, + new Object[] {selectedId} + ); + } + else { + executeValidators(valuesForSave, fieldData); + return this.save(fieldData, valuesForSave); + } + } + + protected void executeValidators(Map valuesForSave, + List fieldData) { + if (this.formValidators != null && this.formValidators.length > 0) { + StringBuilder errorMessageBuilder = new StringBuilder(); + ErrorMetadata errorMetadata = new ErrorMetadata(); + List errorMessages = new LinkedList(); + + for (FormValidator formValidator : this.formValidators) { + FormValidationResult result = formValidator.validate(valuesForSave, fieldData); + if (!result.isValid()) { + String validationResultMessage = result.getMessage(); + errorMessages.add(validationResultMessage); + errorMessageBuilder.append(String.join("\n", validationResultMessage)); + ErrorMetadataItem errorMetadataItem = new ErrorMetadataItem(result.getCode(), + validationResultMessage + ); + errorMetadata.getItems().add(errorMetadataItem); + } + } + + if (!errorMessages.isEmpty()) { + throw new FormValidationException(errorMessageBuilder.toString(), errorMetadata, + errorMessages + ); + } + } + } + + @Override public List loadData() { throw new UnsupportedOperationException("Loading with no id is unsupported"); diff --git a/backend/src/main/resources/messages/common_errors_messages.properties b/backend/src/main/resources/messages/common_errors_messages.properties new file mode 100644 index 00000000..372167d4 --- /dev/null +++ b/backend/src/main/resources/messages/common_errors_messages.properties @@ -0,0 +1,2 @@ +form_field_required=Обязательные поля не заполнены: + diff --git a/backend/src/main/resources/messages/common_errors_messages_ru_RU.properties b/backend/src/main/resources/messages/common_errors_messages_ru_RU.properties new file mode 100644 index 00000000..77b83cd2 --- /dev/null +++ b/backend/src/main/resources/messages/common_errors_messages_ru_RU.properties @@ -0,0 +1 @@ +form_field_required=Обязательные поля не заполнены: \ No newline at end of file diff --git a/resources/src/main/resources/business-model/Список заявок на пользователя/Создать заявку на изменение.page b/resources/src/main/resources/business-model/Список заявок на пользователя/Создать заявку на изменение.page index 92a9d2c3..2fee2e04 100644 --- a/resources/src/main/resources/business-model/Список заявок на пользователя/Создать заявку на изменение.page +++ b/resources/src/main/resources/business-model/Список заявок на пользователя/Создать заявку на изменение.page @@ -4280,7 +4280,22 @@ Form1 true false - + + + + cssClasses + + + + + + showServerValidationErrors + +null + + + + @@ -4304,6 +4319,52 @@ + + formValidators + + + + + + requiredFields + + + + "application_kind" + + + + + "user_login" + + + + + "secondname" + + + + + "firstname" + + + + + "application_status" + + + + + + false + + RequiredFieldValidator + ru.micord.ervu.account_applications.component.validator + + + + + mode @@ -9301,6 +9362,55 @@ + + formValidators + + + + + + requiredFields + + + + "application_kind" + + + + + "user_login" + + + + + "secondname" + + + + + "firstname" + + + + + "application_status" + + + + + + + RequiredFieldValidator + ru.micord.ervu.account_applications.component.validator + + + + + + + + + mode @@ -12430,12 +12540,6 @@ "btn-main" - - - -disabled - - true @@ -13692,6 +13796,51 @@ + + formValidators + + + + + + requiredFields + + + + "application_kind" + + + + + "user_login" + + + + + "secondname" + + + + + "firstname" + + + + + "application_status" + + + + + + + RequiredFieldValidator + ru.micord.ervu.account_applications.component.validator + + + + + mode @@ -16880,12 +17029,6 @@ "btn-main" - - - -disabled - - true