diff --git a/application/Espo/Entities/Settings.php b/application/Espo/Entities/Settings.php new file mode 100644 index 0000000000..ca897f1dec --- /dev/null +++ b/application/Espo/Entities/Settings.php @@ -0,0 +1,35 @@ +$item); } + $entity = $this->getEntityManager()->getEntity('Settings'); + $entity->set($data); + $this->processValidation($entity, $data); + if ( (isset($data->useCache) && $data->useCache !== $this->getConfig()->get('useCache')) || @@ -297,4 +302,44 @@ class Settings extends \Espo\Core\Services\Base return $itemList; } + + protected function processValidation(Entity $entity, $data) + { + $fieldList = $this->getFieldManagerUtil()->getEntityTypeFieldList('Settings'); + + foreach ($fieldList as $field) { + if (!$this->isFieldSetInData($data, $field)) continue; + $this->processValidationField($entity, $field, $data); + } + } + + protected function processValidationField(Entity $entity, string $field, $data) + { + $fieldType = $this->getFieldManagerUtil()->getEntityTypeFieldParam('Settings', $field, 'type'); + $validationList = $this->getMetadata()->get(['fields', $fieldType, 'validationList'], []); + $mandatoryValidationList = $this->getMetadata()->get(['fields', $fieldType, 'mandatoryValidationList'], []); + $fieldValidatorManager = $this->getInjection('container')->get('fieldValidatorManager'); + + foreach ($validationList as $type) { + $value = $this->getFieldManagerUtil()->getEntityTypeFieldParam('Settings', $field, $type); + if (is_null($value) && !in_array($type, $mandatoryValidationList)) continue; + + if (!$fieldValidatorManager->check($entity, $field, $type, $data)) { + throw new BadRequest("Not valid data. Field: '{$field}', type: {$type}."); + } + } + } + + protected function isFieldSetInData($data, $field) + { + $attributeList = $this->getFieldManagerUtil()->getActualAttributeList('Settings', $field); + $isSet = false; + foreach ($attributeList as $attribute) { + if (property_exists($data, $attribute)) { + $isSet = true; + break; + } + } + return $isSet; + } }