Passed
Push — develop ( 391f8f...187ad6 )
by Paul
13:53
created

ValidateForm   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 106
Duplicated Lines 0 %

Test Coverage

Coverage 76.47%

Importance

Changes 2
Bugs 1 Features 1
Metric Value
wmc 16
eloc 63
c 2
b 1
f 1
dl 0
loc 106
ccs 52
cts 68
cp 0.7647
rs 10

6 Methods

Rating   Name   Duplication   Size   Complexity  
A validate() 0 9 2
A __get() 0 16 5
A result() 0 7 1
A __construct() 0 7 1
A isValid() 0 7 2
A validators() 0 38 5
1
<?php
2
3
namespace GeminiLabs\SiteReviews\Modules\Validator;
4
5
use GeminiLabs\SiteReviews\Arguments;
6
use GeminiLabs\SiteReviews\Contracts\ValidatorContract;
7
use GeminiLabs\SiteReviews\Helpers\Cast;
8
use GeminiLabs\SiteReviews\Request;
9
10
class ValidateForm
11
{
12
    protected Request $request;
13
14 12
    public function __construct()
15
    {
16 12
        $this->request = new Request();
17 12
        glsr()->sessionPluck('form_blacklisted');
18 12
        glsr()->sessionPluck('form_errors');
19 12
        glsr()->sessionPluck('form_invalid');
20 12
        glsr()->sessionPluck('form_message');
21
    }
22
23
    /**
24
     * @compat
25
     * @todo remove in v8
26
     */
27
    public function __get($property)
28
    {
29
        $result = $this->result();
30
        if ('message' === $property) {
31
            return $result->$property;
32
        }
33
        if ('errors' !== $property) {
34
            return;
35
        }
36
        if (!empty($result->errors)) {
37
            return $result->errors;
38
        }
39
        if (!$result->failed) {
40
            return false; // validation success
41
        }
42
        return []; // validation fail
43
    }
44
45 12
    public function result(): Arguments
46
    {
47 12
        return glsr()->args([
48 12
            'blacklisted' => glsr()->session()->cast('form_blacklisted', 'bool'),
49 12
            'errors' => glsr()->session()->array('form_errors'),
50 12
            'failed' => glsr()->session()->cast('form_invalid', 'bool'),
51 12
            'message' => glsr()->session()->cast('form_message', 'string'),
52 12
        ]);
53
    }
54
55 12
    public function isValid(): bool
56
    {
57 12
        if (false === $this->result()->failed) {
58 11
            glsr()->sessionClear();
59 11
            return true;
60
        }
61 8
        return false;
62
    }
63
64
    /**
65
     * @return static
66
     */
67 12
    public function validate(Request $request, array $validatorClasses = [])
68
    {
69 12
        $this->request = $request;
70 12
        $validators = $this->validators($validatorClasses);
71 12
        foreach ($validators as $validatorClass) {
72 12
            $validator = glsr($validatorClass, ['request' => $this->request])->validate();
73 12
            $this->request = $validator->request();
74
        }
75 12
        return $this;
76
    }
77
78 12
    public function validators(array $validatorClasses = []): array
79
    {
80 12
        $defaults = [ // order is intentional
81 12
            DefaultValidator::class,
82 12
            CustomValidator::class,
83 12
            SignatureValidator::class,
84 12
            PermissionValidator::class,
85 12
            DuplicateValidator::class,
86 12
            HoneypotValidator::class,
87 12
            ReviewLimitsValidator::class,
88 12
            BlacklistValidator::class,
89 12
            AkismetValidator::class,
90 12
            FriendlycaptchaValidator::class,
91 12
            HcaptchaValidator::class,
92 12
            ProcaptchaValidator::class,
93 12
            RecaptchaV2InvisibleValidator::class,
94 12
            RecaptchaV3Validator::class,
95 12
            TurnstileValidator::class,
96 12
        ];
97 12
        if (empty($validatorClasses)) {
98 8
            $validatorClasses = $defaults;
99
        }
100 12
        $validatorClasses = glsr()->filterArray('validators', $validatorClasses);
101 12
        $validators = [];
102 12
        foreach ($validatorClasses as $validatorClass) {
103
            try {
104 12
                $validator = new \ReflectionClass($validatorClass);
105
            } catch (\ReflectionException $e) {
106
                glsr_log()->error("Validator not found [$validatorClass]");
107
                continue;
108
            }
109 12
            if (!$validator->implementsInterface(ValidatorContract::class)) {
110
                glsr_log()->error("Validator implementation invalid [$validatorClass]");
111
                continue;
112
            }
113 12
            $validators[] = $validatorClass;
114
        }
115 12
        return $validators;
116
    }
117
}
118