SUPPORT-9389: add server validation

This commit is contained in:
adel.ka 2025-09-12 16:51:03 +03:00
parent d2db023bb1
commit f4529a2fc7
5 changed files with 271 additions and 17 deletions

View file

@ -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<EntityColumn, Object> values,
List<FieldData> fieldData) {
List<String> 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<EntityColumn, Object> values,
List<FieldData> fieldData) {
for (Map.Entry<EntityColumn, Object> entry : values.entrySet()) {
if (fieldName.equals(entry.getKey().getName())) {
return entry.getValue() == null;
}
}
return true;
}
}

View file

@ -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<FieldData> list, Boolean aBoolean,
List<BpmnVariableForSave> list1) throws Exception {
List<BpmnVariableForSave> list1) throws Exception {
throw new UnsupportedOperationException("BPMN operations are unsupported");
}
protected Object saveDataById(Object selectedId, List<FieldData> fieldData) {
Map<EntityColumn, Object> 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<EntityColumn, Object> valuesForSave,
List<FieldData> fieldData) {
if (this.formValidators != null && this.formValidators.length > 0) {
StringBuilder errorMessageBuilder = new StringBuilder();
ErrorMetadata errorMetadata = new ErrorMetadata();
List<String> 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<FieldData> loadData() {
throw new UnsupportedOperationException("Loading with no id is unsupported");

View file

@ -0,0 +1,2 @@
form_field_required=Обязательные поля не заполнены:

View file

@ -0,0 +1 @@
form_field_required=Обязательные поля не заполнены:

View file

@ -4280,7 +4280,22 @@
<name>Form1</name>
<container>true</container>
<childrenReordered>false</childrenReordered>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f"/>
<scripts id="bf098f19-480e-44e4-9084-aa42955c4d0f">
<properties>
<entry>
<key>cssClasses</key>
<value>
<item id="92d2eaad-00c8-4c34-83c8-0df2a27bb794" removed="true"/>
</value>
</entry>
<entry>
<key>showServerValidationErrors</key>
<value>
<simple>null</simple>
</value>
</entry>
</properties>
</scripts>
<scripts id="c0bf7050-bd39-426a-8f1e-1600bbd4b9bb">
<properties>
<entry>
@ -4304,6 +4319,52 @@
</implRef>
</value>
</entry>
<entry>
<key>formValidators</key>
<value>
<item id="b217b0bc-42a1-4d28-880d-36d0080d3038" removed="false">
<value>
<complex>
<entry>
<key>requiredFields</key>
<value>
<item id="f84415d3-14f8-41e1-8ea0-46252fb46642" removed="false">
<value>
<simple>"application_kind"</simple>
</value>
</item>
<item id="8954ce7f-8f29-4d5c-8fe6-bc721cfa73fc" removed="false">
<value>
<simple>"user_login"</simple>
</value>
</item>
<item id="cc9e1215-b578-4917-88f1-a62e3009b757" removed="false">
<value>
<simple>"secondname"</simple>
</value>
</item>
<item id="7c489802-7ac8-4ad7-812c-4fd0e88d73e3" removed="false">
<value>
<simple>"firstname"</simple>
</value>
</item>
<item id="1aef3d97-6409-4de0-b911-11181fb57fa5" removed="false">
<value>
<simple>"application_status"</simple>
</value>
</item>
</value>
</entry>
</complex>
<expanded>false</expanded>
<implRef type="JAVA">
<className>RequiredFieldValidator</className>
<packageName>ru.micord.ervu.account_applications.component.validator</packageName>
</implRef>
</value>
</item>
</value>
</entry>
<entry>
<key>mode</key>
<value>
@ -9301,6 +9362,55 @@
</implRef>
</value>
</entry>
<entry>
<key>formValidators</key>
<value>
<item id="fd720809-4cb5-475b-a86d-b6eb5ba85f77" removed="false">
<value>
<complex>
<entry>
<key>requiredFields</key>
<value>
<item id="013a8262-26a9-45f2-ab43-136bd0f64868" removed="false">
<value>
<simple>"application_kind"</simple>
</value>
</item>
<item id="2dca08b6-fa69-4325-bb9d-4c9568c112c0" removed="false">
<value>
<simple>"user_login"</simple>
</value>
</item>
<item id="e85a4b5b-876a-4737-9767-0bf5aa3d3a10" removed="false">
<value>
<simple>"secondname"</simple>
</value>
</item>
<item id="493dc756-4d47-450d-a878-4cc1d4276eeb" removed="false">
<value>
<simple>"firstname"</simple>
</value>
</item>
<item id="7eaef52d-1a3a-401c-9921-e5cc9a1a0ea9" removed="false">
<value>
<simple>"application_status"</simple>
</value>
</item>
</value>
</entry>
</complex>
<implRef type="JAVA">
<className>RequiredFieldValidator</className>
<packageName>ru.micord.ervu.account_applications.component.validator</packageName>
</implRef>
</value>
</item>
<item id="e9713085-43b4-4342-b03f-3cb85a2a07fd" removed="true"/>
<item id="19c2ffbd-24a4-4d18-b58b-2bb1565fbed1" removed="true"/>
<item id="9f5154a3-ab2b-44ed-9119-b4e0133397e8" removed="true"/>
<item id="80e67982-87b0-499a-93a5-885df6939d23" removed="true"/>
</value>
</entry>
<entry>
<key>mode</key>
<value>
@ -12430,12 +12540,6 @@
<simple>"btn-main"</simple>
</value>
</item>
</value>
</entry>
<entry>
<key>disabled</key>
<value>
<simple>true</simple>
</value>
</entry>
</properties>
@ -13692,6 +13796,51 @@
</implRef>
</value>
</entry>
<entry>
<key>formValidators</key>
<value>
<item id="5418ccb0-8f0b-4dd3-8ff1-db313a673dcc" removed="false">
<value>
<complex>
<entry>
<key>requiredFields</key>
<value>
<item id="d3a90814-af6b-49a6-99e0-a8a439a7d0af" removed="false">
<value>
<simple>"application_kind"</simple>
</value>
</item>
<item id="3433096e-85f7-4c39-87fa-48aa410bfda6" removed="false">
<value>
<simple>"user_login"</simple>
</value>
</item>
<item id="be29a25b-86e7-40d9-bacd-d098fbed1b41" removed="false">
<value>
<simple>"secondname"</simple>
</value>
</item>
<item id="40aca80c-9e5e-43e9-8837-d0f7bf510d39" removed="false">
<value>
<simple>"firstname"</simple>
</value>
</item>
<item id="356e3761-05ce-4801-9b71-d941c0010520" removed="false">
<value>
<simple>"application_status"</simple>
</value>
</item>
</value>
</entry>
</complex>
<implRef type="JAVA">
<className>RequiredFieldValidator</className>
<packageName>ru.micord.ervu.account_applications.component.validator</packageName>
</implRef>
</value>
</item>
</value>
</entry>
<entry>
<key>mode</key>
<value>
@ -16880,12 +17029,6 @@
<simple>"btn-main"</simple>
</value>
</item>
</value>
</entry>
<entry>
<key>disabled</key>
<value>
<simple>true</simple>
</value>
</entry>
</properties>