Completed
Pull Request — master (#79)
by ARCANEDEV
05:04
created

ResponseV3::fromArray()   A

Complexity

Conditions 6
Paths 6

Size

Total Lines 16

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 6

Importance

Changes 0
Metric Value
cc 6
nc 6
nop 1
dl 0
loc 16
rs 9.1111
c 0
b 0
f 0
ccs 11
cts 11
cp 1
crap 6
1
<?php namespace Arcanedev\NoCaptcha\Utilities;
2
3
use Arcanedev\NoCaptcha\Contracts\Utilities\Response as ResponseContract;
4
5
/**
6
 * Class     ResponseV3
7
 *
8
 * @package  Arcanedev\NoCaptcha\Utilities
9
 * @author   ARCANEDEV <[email protected]>
10
 */
11
class ResponseV3 extends AbstractResponse implements ResponseContract
12
{
13
    /* -----------------------------------------------------------------
14
     |  Constants
15
     | -----------------------------------------------------------------
16
     */
17
18
    /**
19
     * Invalid JSON received
20
     */
21
    const E_INVALID_JSON = 'invalid-json';
22
23
    /**
24
     * Could not connect to service
25
     */
26
    const E_CONNECTION_FAILED = 'connection-failed';
27
28
    /**
29
     * Not a success, but no error codes received!
30
     */
31
    const E_UNKNOWN_ERROR = 'unknown-error';
32
33
    /**
34
     * Expected hostname did not match
35
     */
36
    const E_HOSTNAME_MISMATCH = 'hostname-mismatch';
37
38
    /**
39
     * Expected APK package name did not match
40
     */
41
    const E_APK_PACKAGE_NAME_MISMATCH = 'apk_package_name-mismatch';
42
43
    /**
44
     * Expected action did not match
45
     */
46
    const E_ACTION_MISMATCH = 'action-mismatch';
47
48
    /**
49
     * Score threshold not met
50
     */
51
    const E_SCORE_THRESHOLD_NOT_MET = 'score-threshold-not-met';
52
53
    /**
54
     * Challenge timeout
55
     */
56
    const E_CHALLENGE_TIMEOUT = 'challenge-timeout';
57
58
    /* -----------------------------------------------------------------
59
     |  Properties
60
     | -----------------------------------------------------------------
61
     */
62
63
    /**
64
     * Score assigned to the request
65
     *
66
     * @var float|null
67
     */
68
    private $score;
69
70
    /**
71
     * Action as specified by the page
72
     *
73
     * @var string
74
     */
75
    private $action;
76
77
    /* -----------------------------------------------------------------
78
     |  Constructor
79
     | -----------------------------------------------------------------
80
     */
81
82
    /**
83
     * Response constructor.
84
     *
85
     * @param  bool         $success
86
     * @param  array        $errorCodes
87
     * @param  string|null  $hostname
88
     * @param  string|null  $challengeTs
89
     * @param  string|null  $apkPackageName
90
     * @param  float|null   $score
91
     * @param  string|null  $action
92
     */
93 60
    public function __construct($success, array $errorCodes = [], $hostname = null, $challengeTs = null, $apkPackageName = null, $score = null, $action = null)
94
    {
95 60
        parent::__construct($success, $errorCodes, $hostname, $challengeTs, $apkPackageName);
96
97 60
        $this->score          = $score;
98 60
        $this->action         = $action;
99 60
    }
100
101
    /* -----------------------------------------------------------------
102
     |  Getters
103
     | -----------------------------------------------------------------
104
     */
105
106
    /**
107
     * Get score
108
     *
109
     * @return float
110
     */
111 16
    public function getScore()
112
    {
113 16
        return $this->score;
114
    }
115
116
    /**
117
     * Get action
118
     *
119
     * @return string
120
     */
121 16
    public function getAction()
122
    {
123 16
        return $this->action;
124
    }
125
126
    /* -----------------------------------------------------------------
127
     |  Main Methods
128
     | -----------------------------------------------------------------
129
     */
130
131
    /**
132
     * Build the response from an array.
133
     *
134
     * @param  array  $array
135
     *
136
     * @return \Arcanedev\NoCaptcha\Utilities\ResponseV3
137
     */
138 44
    public static function fromArray(array $array)
139
    {
140 44
        $hostname       = $array['hostname'] ?? null;
141 44
        $challengeTs    = $array['challenge_ts'] ?? null;
142 44
        $apkPackageName = $array['apk_package_name'] ?? null;
143 44
        $score          = isset($array['score']) ? floatval($array['score']) : null;
144 44
        $action         = $array['action'] ?? null;
145
146 44
        if (isset($array['success']) && $array['success'] == true)
147 36
            return new static(true, [], $hostname, $challengeTs, $apkPackageName, $score, $action);
148
149 8
        if ( ! (isset($array['error-codes']) && is_array($array['error-codes'])))
150 8
            $array['error-codes'] = [ResponseV3::E_UNKNOWN_ERROR];
151
152 8
        return new static(false, $array['error-codes'], $hostname, $challengeTs, $apkPackageName, $score, $action);
153
    }
154
155
    /**
156
     * Convert the response object to array.
157
     *
158
     * @return array
159
     */
160 12
    public function toArray()
161
    {
162
        return [
163 12
            'success'          => $this->isSuccess(),
164 12
            'hostname'         => $this->getHostname(),
165 12
            'challenge_ts'     => $this->getChallengeTs(),
166 12
            'apk_package_name' => $this->getApkPackageName(),
167 12
            'score'            => $this->getScore(),
168 12
            'action'           => $this->getAction(),
169 12
            'error-codes'      => $this->getErrorCodes(),
170
        ];
171
    }
172
173
    /* -----------------------------------------------------------------
174
     |  Check Methods
175
     | -----------------------------------------------------------------
176
     */
177
178
    /**
179
     * Check the score.
180
     *
181
     * @param  float  $score
182
     *
183
     * @return bool
184
     */
185 4
    public function isScore($score)
186
    {
187 4
        return $this->getScore() >= floatval($score);
188
    }
189
190
    /**
191
     * Check the action name.
192
     *
193
     * @param  string  $action
194
     *
195
     * @return bool
196
     */
197 4
    public function isAction($action)
198
    {
199 4
        return $this->getAction() === $action;
200
    }
201
}
202