Source of file QuestionnaireValidation.php
Size: 9,681 Bytes - Last Modified: 2021-12-23T10:08:54+00:00
/var/www/docs.ssmods.com/process/src/src/Validation/QuestionnaireValidation.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 | <?php /** * This file contains the "QuestionnaireValidation" class. * * @category SilverStripe_Project * @package SDLT * @author Catalyst I.T. SilverStripe Team 2018 <silverstripedev@catalyst.net.nz> * @copyright NZ Transport Agency * @license BSD-3 * @link https://www.catalyst.net.nz */ namespace NZTA\SDLT\Validation; use Exception; use NZTA\SDLT\GraphQL\GraphQLAuthFailure; use SilverStripe\Security\Security; /** * Class QuestionnaireValidation */ class QuestionnaireValidation { /** * @param array $inputAnswerfields inputfields * @param string $questionsData questions * @param int $questionID question id * @throws Exception * @return void */ public static function validate_answer_input_data($inputAnswerfields, $questionsData, $questionID) { foreach ($inputAnswerfields as $inputAnswerfield) { $inputfieldDetails = QuestionnaireValidation::get_field_details( $questionsData, $questionID, $inputAnswerfield->id ); if (!$inputfieldDetails) { throw new Exception( sprintf( 'Sorry, no data available for input field ID: %d', $inputfieldDetails->id ) ); } self::validate_input_field($inputAnswerfield->data, $inputfieldDetails); if (!empty($inputAnswerfield->data) && $inputfieldDetails->InputType == 'email') { self::validate_email_field($inputAnswerfield->data, $inputfieldDetails); } if (!empty($inputAnswerfield->data) && $inputfieldDetails->InputType == 'date') { self::validate_date_field($inputAnswerfield->data, $inputfieldDetails); } if (!empty($inputAnswerfield->data) && $inputfieldDetails->InputType == 'url') { self::validate_url_field($inputAnswerfield->data, $inputfieldDetails); } if (!empty($inputAnswerfield->data) && $inputfieldDetails->InputType == 'product aspects') { self::validate_alphanumeric_field($inputAnswerfield->data, $inputfieldDetails); } } } /** * @param string $data Answer data * @param DataObject $inputfieldDetails Inputfield Details * @throws Exception * @return void */ public static function validate_input_field($data, $inputfieldDetails) { // validate if field is required if ($inputfieldDetails->Required) { // validate field for none empty value if (empty($data)) { throw new Exception( sprintf( '%s is required.', $inputfieldDetails->Label ) ); } // validate field for minimum length if ($inputfieldDetails->MinLength > 0 && strlen($data) < $inputfieldDetails->MinLength) { throw new Exception( sprintf( 'Please enter a value with at least %d characters for %s.', $inputfieldDetails->MinLength, $inputfieldDetails->Label ) ); } // validate field for maximum length if (isset($inputfieldDetails->MaxLength) && $inputfieldDetails->MaxLength > 0 && strlen($data) > $inputfieldDetails->MaxLength) { throw new Exception( sprintf( 'Please enter a value with at most %d characters for %s.', $inputfieldDetails->MaxLength, $inputfieldDetails->Label ) ); } } } /** * @param string $email email * @param DataObject $inputfieldDetails inputfieldsDetails * @throws Exception * @return void */ public static function validate_email_field($email, $inputfieldDetails) { if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { throw new Exception( sprintf( 'Please enter valid email address for the %s field.', $inputfieldDetails->Label ) ); } } /** * @param string $date date * @param DataObject $inputfieldDetails inputfieldsDetails * @throws Exception * @return void */ public static function validate_date_field($date, $inputfieldDetails) { $dateExploded = explode("-", $date); if (count($dateExploded) != 3) { throw new Exception( sprintf( 'Please enter valid date format for the %s field.', $inputfieldDetails->Label ) ); } //For the sake of clarity, lets assign our array elements to //named variables (day, month, year). $year = $dateExploded[0]; $month = $dateExploded[1]; $day = $dateExploded[2]; //Finally, use PHP's checkdate function to make sure //that it is a valid date and that it actually occured. if (!checkdate($month, $day, $year)) { throw new Exception($date . ' is not a valid date.'); } if (strlen($year) !== 4) { throw new Exception('Please enter a valid year like 2019.'); } } /** * @param string $url url * @param DataObject $inputfieldDetails inputfieldsDetails * @throws Exception * @return void */ public static function validate_url_field($url, $inputfieldDetails) { if (!filter_var($url, FILTER_VALIDATE_URL)) { throw new Exception( sprintf( 'Please enter valid URL for the %s field.', $inputfieldDetails->Label ) ); } } /** * @param string $url url * @param DataObject $inputfieldDetails inputfieldsDetails * @throws Exception * @return void */ public static function validate_alphanumeric_field($value, $inputfieldDetails) { if (!preg_match('/^[a-z0-9A-Z\s\n]+$/i', $value)) { throw new Exception( sprintf( 'Please enter only aphanumeric characters for the %s field.', $inputfieldDetails->Label ) ); } } /** * @param array $actionFields actionFields * @param string $questionsData questions * @param int $questionID question id * @throws Exception * @return void */ public static function validate_answer_action_data($actionFields, $questionsData, $questionID) { foreach ($actionFields as $actionField) { $actionFieldDetails = QuestionnaireValidation::get_field_details( $questionsData, $questionID, $actionField->id ); if (!$actionFieldDetails) { throw new Exception( sprintf( 'Sorry, no data available for action field ID: %d', $actionField->id ) ); } if (!is_bool($actionField->isChose)) { throw new Exception( sprintf( 'Sorry, answer type should be boolean for action field ID: %d', $actionField->id ) ); } } } /** * @param string $questionsData questions * @param int $questionID question id * @param int $fieldID input or action field id * @throws Exception * @return mixed $currentField current field or null */ public static function get_field_details($questionsData, $questionID, $fieldID) { $questions = json_decode($questionsData); $currentQuestion = null; $currentField = null; foreach ($questions as $question) { if ((int)$question->ID === (int)$questionID) { $currentQuestion = $question; } } if (!$currentQuestion) { throw new Exception( sprintf( 'Sorry, no question available for question Id: %d', $questionID ) ); } if ($currentQuestion->AnswerFieldType == 'input') { $fields = $currentQuestion->AnswerInputFields; } else { $fields = $currentQuestion->AnswerActionFields; } if (!$fields) { throw new Exception( sprintf( 'Sorry, no fields available question Id: %d', $questionID ) ); } foreach ($fields as $field) { if ((int)$field->ID === (int)$fieldID) { $currentField = $field; } } return $currentField; } /** * @throws GraphQLAuthFailure * * @return Dataobject $member */ public static function is_user_logged_in() { $member = Security::getCurrentUser(); // Check authentication if (!$member) { throw new GraphQLAuthFailure(); } return $member; } } |