Implement regex validation conditions in form logic (#645)

* Implement regex validation conditions in form logic

- Added support for 'matches_regex' and 'does_not_match_regex' conditions in FormPropertyLogicRule and FormLogicConditionChecker.
- Updated validation logic to handle regex patterns, including error handling for invalid patterns.
- Enhanced tests to cover scenarios for successful and failed regex validation, ensuring proper feedback for form submissions.
- Updated JSON schema to include new regex condition types.

These changes improve the flexibility of form validation by allowing regex-based conditions, enhancing user experience through more robust validation mechanisms.

* update resource filters

* Remove ray

---------

Co-authored-by: Julien Nahum <julien@nahum.net>
This commit is contained in:
Chirag Chhatrala
2024-12-16 21:47:29 +05:30
committed by GitHub
parent 25a1d032a1
commit 28019fc7a0
6 changed files with 303 additions and 0 deletions

View File

@@ -71,6 +71,18 @@ class FormPropertyLogicRule implements DataAwareRule, ValidationRule
'content_length_less_than_or_equal_to' => [
'expected_type' => 'number',
],
'matches_regex' => [
'expected_type' => 'string',
'format' => [
'type' => 'regex'
]
],
'does_not_match_regex' => [
'expected_type' => 'string',
'format' => [
'type' => 'regex'
]
],
],
],
'matrix' => [
@@ -672,6 +684,8 @@ class FormPropertyLogicRule implements DataAwareRule, ValidationRule
private $data = [];
private $operator = '';
private function checkBaseCondition($condition)
{
@@ -712,6 +726,7 @@ class FormPropertyLogicRule implements DataAwareRule, ValidationRule
$typeField = $condition['value']['property_meta']['type'];
$operator = $condition['value']['operator'];
$this->operator = $operator;
$value = $condition['value']['value'];
if (!isset(self::CONDITION_MAPPING[$typeField])) {
@@ -750,6 +765,19 @@ class FormPropertyLogicRule implements DataAwareRule, ValidationRule
private function valueHasCorrectType($type, $value)
{
if ($type === 'string' && isset(self::CONDITION_MAPPING[$this->field['type']]['comparators'][$this->operator]['format'])) {
$format = self::CONDITION_MAPPING[$this->field['type']]['comparators'][$this->operator]['format'];
if ($format['type'] === 'regex') {
try {
preg_match('/' . $value . '/', '');
return true;
} catch (\Exception $e) {
$this->conditionErrors[] = 'invalid regex pattern';
return false;
}
}
}
if (
($type === 'string' && gettype($value) !== 'string') ||
($type === 'boolean' && !is_bool($value)) ||

View File

@@ -306,6 +306,19 @@ class FormLogicConditionChecker
return $this->checkLength($propertyCondition, $value, '<');
case 'content_length_less_than_or_equal_to':
return $this->checkLength($propertyCondition, $value, '<=');
case 'matches_regex':
try {
return (bool) preg_match('/' . $propertyCondition['value'] . '/', $value);
} catch (\Exception $e) {
ray('matches_regex_error', $e);
return false;
}
case 'does_not_match_regex':
try {
return !(bool) preg_match('/' . $propertyCondition['value'] . '/', $value);
} catch (\Exception $e) {
return true;
}
}
return false;