From d8f6b6d27eda0338dca4884e8c52837fa8215d91 Mon Sep 17 00:00:00 2001 From: ghost Date: Sun, 24 Sep 2023 16:36:43 +0300 Subject: [PATCH] add required fields configuration, draft post request processing #14 --- src/app/controller/submit.php | 47 +++++ src/app/model/validator.php | 256 ++++++++++++++++++++++++ src/app/view/theme/default/submit.phtml | 5 +- src/config/validator.json | 12 ++ 4 files changed, 319 insertions(+), 1 deletion(-) diff --git a/src/app/controller/submit.php b/src/app/controller/submit.php index cc13f71..d72840a 100644 --- a/src/app/controller/submit.php +++ b/src/app/controller/submit.php @@ -64,6 +64,7 @@ class AppControllerSubmit 'attribute' => (object) [ 'value' => null, + 'required' => $this->_validator->getPageTitleRequired(), 'minlength' => $this->_validator->getPageTitleLengthMin(), 'maxlength' => $this->_validator->getPageTitleLengthMax(), 'placeholder' => sprintf( @@ -79,6 +80,7 @@ class AppControllerSubmit 'attribute' => (object) [ 'value' => null, + 'required' => $this->_validator->getPageDescriptionRequired(), 'minlength' => $this->_validator->getPageDescriptionLengthMin(), 'maxlength' => $this->_validator->getPageDescriptionLengthMax(), 'placeholder' => sprintf( @@ -94,6 +96,7 @@ class AppControllerSubmit 'attribute' => (object) [ 'value' => null, + 'required' => $this->_validator->getPageKeywordsRequired(), 'minlength' => $this->_validator->getPageKeywordsLengthMin(), 'maxlength' => $this->_validator->getPageKeywordsLengthMax(), 'placeholder' => sprintf( @@ -111,6 +114,7 @@ class AppControllerSubmit 'attribute' => (object) [ 'value' => null, + 'required' => $this->_validator->getPageTorrentRequired(), 'placeholder' => sprintf( _('Torrent file (use Ctrl to select multiple files)') ), @@ -123,9 +127,52 @@ class AppControllerSubmit ], ]; + // Submit request if (isset($_POST)) { + if (isset($_POST['title'])) + { + $error = []; + if ($this->_validator->pageTitle($_POST['title'], $error)) + { + $form->title->error = $error; + } + + // @TODO check for page duplicates + + $form->title->attribute->value = htmlentities($_POST['title']); + } + + if (isset($_POST['description'])) + { + $error = []; + + if ($this->_validator->pageDescription($_POST['description'], $error)) + { + $form->description->error = $error; + } + + $form->description->attribute->value = htmlentities($_POST['description']); + } + + if (isset($_POST['keywords'])) + { + $error = []; + + if ($this->_validator->pageKeywords($_POST['keywords'], $error)) + { + $form->keywords->error = $error; + } + + $form->keywords->attribute->value = htmlentities($_POST['keywords']); + } + + // Request valid + if (empty($error)) + { + // @TODO redirect + } } // Render diff --git a/src/app/model/validator.php b/src/app/model/validator.php index dfb99f7..8b3da69 100644 --- a/src/app/model/validator.php +++ b/src/app/model/validator.php @@ -14,6 +14,11 @@ class AppModelValidator // Page /// Page title + public function getPageTitleRequired() : bool + { + return $this->_config->page->title->required; + } + public function getPageTitleLengthMin() : int { return $this->_config->page->title->length->min; @@ -29,7 +34,65 @@ class AppModelValidator return $this->_config->page->title->regex; } + public function pageTitle(mixed $value, array &$error = []) : bool + { + if (!is_string($value)) + { + array_push( + $error, + _('Invalid page title data type') + ); + + return false; + } + + if (empty($value) && $this->getPageTitleRequired()) + { + array_push( + $error, + _('Page title required') + ); + + return false; + } + + if (!preg_match($this->getPageTitleRegex(), $value)) + { + array_push( + $error, + sprintf( + _('Page title format does not match condition "%s"'), + $this->getPageTitleRegex() + ) + ); + + return false; + } + + if (mb_strlen($value) < $this->getPageTitleLengthMin() || + mb_strlen($value) > $this->getPageTitleLengthMax()) + { + array_push( + $error, + sprintf( + _('Page title out of %s-%s chars range'), + $this->getPageTitleLengthMin(), + $this->getPageTitleLengthMax() + ) + ); + + return false; + } + + return true; + } + /// Page description + public function getPageDescriptionRequired() : bool + { + return $this->_config->page->description->required; + } + public function getPageDescriptionLengthMin() : int { return $this->_config->page->description->length->min; @@ -45,7 +108,65 @@ class AppModelValidator return $this->_config->page->description->regex; } + public function pageDescription(mixed $value, array &$error = []) : bool + { + if (!is_string($value)) + { + array_push( + $error, + _('Invalid page description data type') + ); + + return false; + } + + if (empty($value) && $this->getPageDescriptionRequired()) + { + array_push( + $error, + _('Page description required') + ); + + return false; + } + + if (!preg_match($this->getPageDescriptionRegex(), $value)) + { + array_push( + $error, + sprintf( + _('Page description format does not match condition "%s"'), + $this->getPageDescriptionRegex() + ) + ); + + return false; + } + + if (mb_strlen($value) < $this->getPageDescriptionLengthMin() || + mb_strlen($value) > $this->getPageDescriptionLengthMax()) + { + array_push( + $error, + sprintf( + _('Page description out of %s-%s chars range'), + $this->getPageDescriptionLengthMin(), + $this->getPageDescriptionLengthMax() + ) + ); + + return false; + } + + return true; + } + /// Page keywords + public function getPageKeywordsRequired() : bool + { + return $this->_config->page->keywords->required; + } + public function getPageKeywordsLengthMin() : int { return $this->_config->page->keywords->length->min; @@ -71,6 +192,141 @@ class AppModelValidator return $this->_config->page->keywords->regex; } + public function pageKeywords(mixed $value, array &$error = []) : bool + { + if (!is_array($value)) + { + array_push( + $error, + _('Invalid page keywords data type') + ); + + return false; + } + + if (empty($value) && $this->getPageKeywordsRequired()) + { + array_push( + $error, + _('Page keywords required') + ); + + return false; + } + + $total = 0; + + foreach ($value as $keywords) + { + if (!is_string($kt)) + { + array_push( + $error, + _('Invalid magnet keyword value data type') + ); + + return false; + } + + if (!preg_match(MAGNET_KT_REGEX, $kt)) + { + array_push( + $error, + sprintf( + _('Magnet keyword format does not match condition "%s"'), + MAGNET_KT_REGEX + ) + ); + + return false; + } + + if (mb_strlen($kt) < MAGNET_KT_MIN_LENGTH || + mb_strlen($kt) > MAGNET_KT_MAX_LENGTH) + { + array_push( + $error, + sprintf( + _('Magnet keyword out of %s-%s chars range'), + MAGNET_KT_MIN_LENGTH, + MAGNET_KT_MAX_LENGTH + ) + ); + + return false; + } + + $total++; + } + + if ($total < MAGNET_KT_MIN_QUANTITY || + $total > MAGNET_KT_MAX_QUANTITY) + { + array_push( + $error, + sprintf( + _('Magnet keywords quantity out of %s-%s range'), + MAGNET_KT_MIN_QUANTITY, + MAGNET_KT_MAX_QUANTITY + ) + ); + + return false; + } + + return true; + } + + public function pageKeyword(mixed $value, array &$error = []) : bool + { + if (!is_string($value)) + { + array_push( + $error, + _('Invalid page keyword data type') + ); + + return false; + } + + if (!preg_match($this->getPageKeywordsRegex(), $value)) + { + array_push( + $error, + sprintf( + _('Page keyword "%s" format does not match condition "%s"'), + $value, + $this->getPageKeywordsRegex() + ) + ); + + return false; + } + + if (mb_strlen($value) < $this->getPageDescriptionLengthMin() || + mb_strlen($value) > $this->getPageDescriptionLengthMax()) + { + array_push( + $error, + sprintf( + _('Page description out of %s-%s chars range'), + $this->getPageDescriptionLengthMin(), + $this->getPageDescriptionLengthMax() + ) + ); + + return false; + } + + return true; + } + + /// Page torrent + public function getPageTorrentRequired() : bool + { + return $this->_config->page->torrent->required; + } + // Common public function host(mixed $value, array &$error = []) : bool { diff --git a/src/app/view/theme/default/submit.phtml b/src/app/view/theme/default/submit.phtml index 2b250d8..6a16a49 100644 --- a/src/app/view/theme/default/submit.phtml +++ b/src/app/view/theme/default/submit.phtml @@ -32,6 +32,7 @@ type="text" name="title" id="title" + title->attribute->required ? 'required="required"' : false ?> value="title->attribute->value ?>" placeholder="title->attribute->placeholder ?>" minlength="title->attribute->minlength ?>" @@ -55,6 +56,7 @@ @@ -76,7 +78,7 @@ @@ -101,6 +103,7 @@ multiple="multiple" name="torrent" id="torrent" + torrent->attribute->required ? 'required="required"' : false ?> value="torrent->attribute->value ?>" />