Test Failed
Push — develop ( 325b33...c75138 )
by Paul
09:01
created

ValidateForm::__get()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 16
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 5

Importance

Changes 1
Bugs 1 Features 0
Metric Value
eloc 10
c 1
b 1
f 0
dl 0
loc 16
ccs 8
cts 8
cp 1
rs 9.6111
cc 5
nc 5
nop 1
crap 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
    public function __construct()
15
    {
16
        $this->request = new Request();
17
        glsr()->sessionPluck('form_blacklisted');
18
        glsr()->sessionPluck('form_errors');
19
        glsr()->sessionPluck('form_invalid');
20
        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 12
        if ('errors' !== $property) {
34
            return;
35 12
        }
36 12
        if (!empty($result->errors)) {
37 8
            return $result->errors;
38
        }
39 12
        if (!$result->failed) {
40 12
            return false; // validation success
41 12
        }
42 12
        return []; // validation fail
43
    }
44
45
    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
            'message' => glsr()->session()->cast('form_message', 'string'),
52
        ]);
53 8
    }
54
55 8
    public function isValid(): bool
56 8
    {
57 8
        if (false === $this->result()->failed) {
58 8
            glsr()->sessionClear();
59 8
            return true;
60 8
        }
61 8
        return false;
62 8
    }
63 8
64 8
    /**
65 8
     * @return static
66 8
     */
67 8
    public function validate(Request $request, array $validatorClasses = [])
68 8
    {
69 8
        $this->request = $request;
70
        $validators = $this->validators($validatorClasses);
71
        foreach ($validators as $validatorClass) {
72 12
            $validator = glsr($validatorClass, ['request' => $this->request])->validate();
73
            $this->request = $validator->request();
74 12
        }
75
        return $this;
76
    }
77
78
    public function validators(array $validatorClasses = []): array
79
    {
80
        $defaults = [ // order is intentional
81
            DefaultValidator::class,
82
            CustomValidator::class,
83
            SignatureValidator::class,
84
            PermissionValidator::class,
85
            DuplicateValidator::class,
86
            HoneypotValidator::class,
87
            ReviewLimitsValidator::class,
88
            BlacklistValidator::class,
89
            AkismetValidator::class,
90
            FriendlycaptchaValidator::class,
91
            HcaptchaValidator::class,
92
            ProcaptchaValidator::class,
93
            RecaptchaV2InvisibleValidator::class,
94
            RecaptchaV3Validator::class,
95
            TurnstileValidator::class,
96
        ];
97
        if (empty($validatorClasses)) {
98
            $validatorClasses = $defaults;
99
        }
100
        $validatorClasses = glsr()->filterArray('validators', $validatorClasses);
101
        $validators = [];
102
        foreach ($validatorClasses as $validatorClass) {
103
            try {
104
                $validator = new \ReflectionClass($validatorClass);
105
            } catch (\ReflectionException $e) {
106
                glsr_log()->error("Validator not found [$validatorClass]");
107
                continue;
108
            }
109
            if (!$validator->implementsInterface(ValidatorContract::class)) {
110
                glsr_log()->error("Validator implementation invalid [$validatorClass]");
111
                continue;
112
            }
113
            $validators[] = $validatorClass;
114
        }
115
        return $validators;
116
    }
117
}
118