• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

webeweb / haveibeenpwned-library / 8306904586

16 Mar 2024 09:46AM UTC coverage: 98.917%. Remained the same
8306904586

push

github

webeweb
Update CHANGELOG

274 of 277 relevant lines covered (98.92%)

49.94 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

98.68
/src/Serializer/ResponseDeserializer.php
1
<?php
2

3
declare(strict_types = 1);
4

5
/*
6
 * This file is part of the haveibeenpwned-library package.
7
 *
8
 * (c) 2019 WEBEWEB
9
 *
10
 * For the full copyright and license information, please view the LICENSE
11
 * file that was distributed with this source code.
12
 */
13

14
namespace WBW\Library\HaveIBeenPwned\Serializer;
15

16
use DateTime;
17
use DateTimeZone;
18
use WBW\Library\HaveIBeenPwned\Api\ResponseInterface;
19
use WBW\Library\HaveIBeenPwned\Model\Breach;
20
use WBW\Library\HaveIBeenPwned\Model\DataClass;
21
use WBW\Library\HaveIBeenPwned\Model\Paste;
22
use WBW\Library\HaveIBeenPwned\Model\Range;
23
use WBW\Library\HaveIBeenPwned\Response\BreachesResponse;
24
use WBW\Library\HaveIBeenPwned\Response\DataClassesResponse;
25
use WBW\Library\HaveIBeenPwned\Response\PastesResponse;
26
use WBW\Library\HaveIBeenPwned\Response\RangesResponse;
27
use WBW\Library\Types\Helper\ArrayHelper;
28

29
/**
30
 * Response deserializer.
31
 *
32
 * @author webeweb <https://github.com/webeweb>
33
 * @package WBW\Library\HaveIBeenPwned\Serializer
34
 */
35
class ResponseDeserializer {
36

37
    /**
38
     * Clean a raw response.
39
     *
40
     * @param string $rawResponse The raw response.
41
     * @return string Returns the cleaned raw response.
42
     */
43
    protected static function cleanResponse(string $rawResponse): string {
44

45
        $searches = [":True", ":False", ": True", ": False"];
80✔
46
        $replaces = [":true", ":false", ":true", ":false"];
80✔
47

48
        return str_replace($searches, $replaces, $rawResponse);
80✔
49
    }
50

51
    /**
52
     * Deserialize a breach.
53
     *
54
     * @param array<string,mixed> $data The data.
55
     * @return Breach Returns a breach.
56
     */
57
    protected static function deserializeBreach(array $data): Breach {
58

59
        $addedDate    = DateTime::createFromFormat(ResponseInterface::DATETIME_FORMAT_ADDED, ArrayHelper::get($data, "AddedDate", ""), new DateTimeZone("UTC"));
40✔
60
        $breachDate   = DateTime::createFromFormat(ResponseInterface::DATETIME_FORMAT_BREACH, ArrayHelper::get($data, "BreachDate", ""), new DateTimeZone("UTC"));
40✔
61
        $modifiedDate = DateTime::createFromFormat(ResponseInterface::DATETIME_FORMAT_MODIFIED, ArrayHelper::get($data, "ModifiedDate", ""), new DateTimeZone("UTC"));
40✔
62

63
        $model = new Breach();
40✔
64
        $model->setName(ArrayHelper::get($data, "Name"));
40✔
65
        $model->setTitle(ArrayHelper::get($data, "Title"));
40✔
66
        $model->setDomain(ArrayHelper::get($data, "Domain"));
40✔
67
        $model->setBreachDate(false !== $breachDate ? $breachDate : null);
40✔
68
        $model->setAddedDate(false !== $addedDate ? $addedDate : null);
40✔
69
        $model->setModifiedDate(false !== $modifiedDate ? $modifiedDate : null);
40✔
70
        $model->setPwnCount(ArrayHelper::get($data, "PwnCount", 0));
40✔
71
        $model->setDescription(ArrayHelper::get($data, "Description"));
40✔
72
        $model->setVerified(ArrayHelper::get($data, "IsVerified", false));
40✔
73
        $model->setSensitive(ArrayHelper::get($data, "IsSensitive", false));
40✔
74
        $model->setRetired(ArrayHelper::get($data, "IsRetired", false));
40✔
75
        $model->setSpamList(ArrayHelper::get($data, "IsSpamList", false));
40✔
76

77
        foreach (ArrayHelper::get($data, "DataClasses", []) as $current) {
40✔
78
            $model->addDataClass(static::deserializeDataClass($current));
40✔
79
        }
80

81
        return $model;
40✔
82
    }
83

84
    /**
85
     * Deserialize a breaches response.
86
     *
87
     * @param string $rawResponse The raw response.
88
     * @return BreachesResponse Returns the breaches response.
89
     */
90
    public static function deserializeBreachesResponse(string $rawResponse): BreachesResponse {
91

92
        $model = new BreachesResponse();
64✔
93
        $model->setRawResponse($rawResponse);
64✔
94

95
        $cleaned  = static::cleanResponse($rawResponse);
64✔
96
        $response = json_decode($cleaned, true);
64✔
97
        if (null === $response) {
64✔
98
            return $model;
24✔
99
        }
100

101
        if (true === ArrayHelper::isObject($response)) {
40✔
102
            $response = [$response];
16✔
103
        }
104

105
        foreach ($response as $current) {
40✔
106

107
            if (true === is_string($current)) {
40✔
108
                $current = ["Name" => $current];
×
109
            }
110

111
            $model->addBreach(static::deserializeBreach($current));
40✔
112
        }
113

114
        return $model;
40✔
115
    }
116

117
    /**
118
     * Deserialize a data class.
119
     *
120
     * @param string $rawResponse The raw response.
121
     * @return DataClass Returns a data class.
122
     */
123
    protected static function deserializeDataClass(string $rawResponse): DataClass {
124

125
        $model = new DataClass();
64✔
126
        $model->setName($rawResponse);
64✔
127

128
        return $model;
64✔
129
    }
130

131
    /**
132
     * Deserialize a data classes response.
133
     *
134
     * @param string $rawResponse The raw response.
135
     * @return DataClassesResponse Returns the data classes response.
136
     */
137
    public static function deserializeDataClassesResponse(string $rawResponse): DataClassesResponse {
138

139
        $model = new DataClassesResponse();
32✔
140
        $model->setRawResponse($rawResponse);
32✔
141

142
        $response = json_decode($rawResponse, true);
32✔
143
        if (null === $response) {
32✔
144
            return $model;
8✔
145
        }
146

147
        foreach ($response as $current) {
24✔
148
            $model->addDataClass(static::deserializeDataClass($current));
24✔
149
        }
150

151
        return $model;
24✔
152
    }
153

154
    /**
155
     * Deserialize a paste.
156
     *
157
     * @param array<string,mixed> $data The data.
158
     * @return Paste Returns the paste.
159
     */
160
    protected static function deserializePaste(array $data): Paste {
161

162
        $date = DateTime::createFromFormat(ResponseInterface::DATETIME_FORMAT_DATE, ArrayHelper::get($data, "Date", ""), new DateTimeZone("UTC"));
8✔
163

164
        $model = new Paste();
8✔
165
        $model->setSource(ArrayHelper::get($data, "Source"));
8✔
166
        $model->setId(ArrayHelper::get($data, "Id"));
8✔
167
        $model->setTitle(ArrayHelper::get($data, "Title"));
8✔
168
        $model->setDate(false !== $date ? $date : null);
8✔
169
        $model->setEmailCount(ArrayHelper::get($data, "EmailCount", 0));
8✔
170

171
        return $model;
8✔
172
    }
173

174
    /**
175
     * Deserialize a pastes response.
176
     *
177
     * @param string $rawResponse The raw response.
178
     * @return PastesResponse Returns the pastes response.
179
     */
180
    public static function deserializePastesResponse(string $rawResponse): PastesResponse {
181

182
        $model = new PastesResponse();
16✔
183
        $model->setRawResponse($rawResponse);
16✔
184

185
        $cleaned  = static::cleanResponse($rawResponse);
16✔
186
        $response = json_decode($cleaned, true);
16✔
187
        if (null === $response) {
16✔
188
            return $model;
8✔
189
        }
190

191
        foreach ($response as $current) {
8✔
192
            $model->addPaste(static::deserializePaste($current));
8✔
193
        }
194

195
        return $model;
8✔
196
    }
197

198
    /**
199
     * Deserialize a range.
200
     *
201
     * @param string $rawResponse The raw response.
202
     * @return Range Returns a range.
203
     */
204
    protected static function deserializeRange(string $rawResponse): Range {
205

206
        $response = explode(":", $rawResponse);
32✔
207

208
        if (count($response) < 2) {
32✔
209
            return new Range();
8✔
210
        }
211

212
        $model = new Range();
24✔
213
        $model->setHash(trim($response[0]));
24✔
214
        $model->setCount(intval($response[1]));
24✔
215

216
        return $model;
24✔
217
    }
218

219
    /**
220
     * Deserialize a ranges response.
221
     *
222
     * @param string $rawResponse The raw response.
223
     * @return RangesResponse Returns the ranges response.
224
     */
225
    public static function deserializeRangesResponse(string $rawResponse): RangesResponse {
226

227
        $model = new RangesResponse();
32✔
228
        $model->setRawResponse($rawResponse);
32✔
229

230
        $response = explode("\n", $rawResponse);
32✔
231
        foreach ($response as $current) {
32✔
232
            $model->addRange(static::deserializeRange($current));
32✔
233
        }
234

235
        return $model;
32✔
236
    }
237
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc