Completed
Push — master ( 96e24a...7e0aae )
by Andrew
02:19
created

FieldsValidator::isValid()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 10
ccs 6
cts 6
cp 1
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 5
nc 2
nop 2
crap 2
1
<?php
2
3
4
namespace ddlzz\AmoAPI\Validators;
5
6
use ddlzz\AmoAPI\Exceptions\EntityFieldsException;
7
8
9
/**
10
 * Class FieldsValidator
11
 * @package ddlzz\AmoAPI\Validators
12
 * @author ddlzz
13
 */
14
class FieldsValidator
15
{
16
    /** @var array */
17
    private $fieldsParams;
18
19
    /** @var string */
20
    private $action = '';
21
22
    /**
23
     * FieldsValidator constructor.
24
     * @param array $fieldsParams
25
     */
26 33
    public function __construct(array $fieldsParams)
27
    {
28 33
        $this->fieldsParams = $fieldsParams;
29 33
    }
30
31
    /**
32
     * @param string $action
33
     */
34 5
    public function setAction($action)
35
    {
36 5
        $this->action = $action;
37 5
    }
38
39
    /**
40
     * @param string $key
41
     * @param mixed $value
42
     * @return bool
43
     * @throws EntityFieldsException
44
     */
45 33
    public function isValid($key, $value)
46
    {
47 33
        $this->validateRequired($key, $value);
48
49 32
        if (isset($value)) {
50 31
            $validate = $this->prepareValidateType($this->fieldsParams[$key]['type']);
51 30
            self::$validate($key, $value);
52
        }
53
54 13
        return true;
55
    }
56
57
    /**
58
     * @param string $key
59
     * @return string
60
     * @throws EntityFieldsException
61
     */
62 31
    private function prepareValidateType($key)
63
    {
64 31
        $key = str_replace('|', '', $key);
65 31
        $method = 'validate' . ucfirst($key);
66 31
        if (!method_exists(self::class, $method)) {
67 1
            throw new EntityFieldsException(
68 1
                "Internal error: the field \"$key\" doesn't match any of the entity predefined fields"
69
            );
70
        }
71
72 30
        return $method;
73
    }
74
75
    /**
76
     * @param $key
77
     * @param $value
78
     * @return bool
79
     * @throws EntityFieldsException
80
     */
81 33
    private function validateRequired($key, $value)
82
    {
83 33
        if (('add' === $this->action) || ('update' === $this->action)) {
84 5
            if (!isset($value) && (true === $this->fieldsParams[$key]['required_' . $this->action])) {
85 2
                throw new EntityFieldsException(ucfirst($this->action) . " error: the required field \"$key\" is missing or empty");
86
            }
87
        }
88
89 32
        return true;
90
    }
91
92
    /** @noinspection PhpUnusedPrivateMethodInspection */
93
    /**
94
     * @param string $key
95
     * @param int $value
96
     * @return bool
97
     * @throws EntityFieldsException
98
     */
99 9
    private static function validateInt($key, $value)
100
    {
101 9
        if (!is_int($value) || !preg_match('/^\d+$/', (string)$value)) {
102 6
            throw new EntityFieldsException("The field \"$key\" must contain digits only");
103
        }
104
105 3
        return true;
106
    }
107
108
    /** @noinspection PhpUnusedPrivateMethodInspection */
109
    /**
110
     * @param string $key
111
     * @param string $value
112
     * @return bool
113
     * @throws EntityFieldsException
114
     */
115 5 View Code Duplication
    private static function validateString($key, $value)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
116
    {
117 5
        if (!is_string($value) && !is_numeric($value)) {
118 3
            throw new EntityFieldsException("The field \"$key\" must be string");
119
        }
120
121 2
        return true;
122
    }
123
124
    /** @noinspection PhpUnusedPrivateMethodInspection */
125
    /**
126
     * @param string $key
127
     * @param bool $value
128
     * @return bool
129
     * @throws EntityFieldsException
130
     */
131 6
    private static function validateBool($key, $value)
132
    {
133 6
        if (is_null(filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE))) {
134 4
            throw new EntityFieldsException("The field \"$key\" must contain boolean values only");
135
        }
136
137 2
        return true;
138
    }
139
140
    /** @noinspection PhpUnusedPrivateMethodInspection */
141
    /**
142
     * @param string $key
143
     * @param array $value
144
     * @return bool
145
     * @throws EntityFieldsException
146
     */
147 5
    private static function validateArray($key, $value)
148
    {
149 5
        if (!is_array($value)) {
150 3
            throw new EntityFieldsException("The field \"$key\" must be an array");
151
        }
152
153 2
        return true;
154
    }
155
156
    /** @noinspection PhpUnusedPrivateMethodInspection */
157
    /**
158
     * Because some fields must be either strings during entity creation or arrays during it's obtaining from server,
159
     * we create this check
160
     * @param string $key
161
     * @param array $value
162
     * @return bool
163
     * @throws EntityFieldsException
164
     */
165 5 View Code Duplication
    private static function validateArraystring($key, $value)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
166
    {
167 5
        if ((!is_array($value)) && (!is_string($value) && !is_numeric($value))) {
168 2
            throw new EntityFieldsException("The field \"$key\" must be an array or string");
169
        }
170
171 3
        return true;
172
    }
173
}