Completed
Branch master (148e2f)
by Ali
01:30
created

Address::check()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 6
rs 10
c 0
b 0
f 0
cc 2
nc 2
nop 0
1
<?php
2
3
/*
4
 * Part of the Saudi Address API PHP package.
5
 *
6
 * NOTICE OF LICENSE
7
 *
8
 * Licensed under the MIT.
9
 *
10
 * This source file is subject to the MIT License that is
11
 * bundled with this package in the LICENSE file.
12
 *
13
 * @package    Saudi Address
14
 * @version    1.2
15
 * @author     Ali Alharthi
16
 * @license    MIT
17
 * @copyright  (c) 2020, Ali Alharthi
18
 * @link       https://aalharthi.sa
19
 */
20
21
namespace AliAlharthi\SaudiAddress\Api;
22
23
class Address extends Api
24
{
25
    /**
26
     * The response array.
27
     *
28
     * @var array|null
29
     */
30
    protected $response = null;
31
32
    /**
33
     * The cache directory.
34
     *
35
     * @var string|null
36
     */
37
    protected $cacheDir = __DIR__ . '/cache/';
38
39
    /**
40
     * The cache file name.
41
     *
42
     * @var string|null
43
     */
44
    protected $file = __DIR__ . '/cache/' . 'address_';
45
46
    /**
47
     * Returns a list of all the addresses from a string.
48
     *
49
     * @param   string  $address
50
     * @param   int     $page
51
     * @param   string  $lang
52
     * @return  Address
53
     */
54
    public function find($address, $page = 1, $lang = 'A')
55
    {
56
        $cache = $this->file . preg_replace('/[^a-zA-Z0-9_]/', '_', $address) . '_' . strtolower($lang) . '.data';
57
58
        $this->response = $this->cacheValue($cache);
0 ignored issues
show
Documentation Bug introduced by
It seems like $this->cacheValue($cache) can also be of type string. However, the property $response is declared as type array|null. Maybe add an additional type check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a mixed type is assigned to a property that is type hinted more strictly.

For example, imagine you have a variable $accountId that can either hold an Id object or false (if there is no account id yet). Your code now assigns that value to the id property of an instance of the Account class. This class holds a proper account, so the id value must no longer be false.

Either this assignment is in error or a type check should be added for that assignment.

class Id
{
    public $id;

    public function __construct($id)
    {
        $this->id = $id;
    }

}

class Account
{
    /** @var  Id $id */
    public $id;
}

$account_id = false;

if (starsAreRight()) {
    $account_id = new Id(42);
}

$account = new Account();
if ($account instanceof Id)
{
    $account->id = $account_id;
}
Loading history...
59
60
        if ($this->response == null) {
0 ignored issues
show
Bug introduced by
It seems like you are loosely comparing $this->response of type string|null against null; this is ambiguous if the string can be empty. Consider using a strict comparison === instead.
Loading history...
61
            $response = $this->_get(
62
                'v4/Address/address-free-text',
63
                $lang,
64
                [
65
                    'addressstring' => $address,
66
                    'page' => $page,
67
                ],
68
                false
69
            );
70
            if ($response['success'] == false) {
71
                return;
72
            }
73
            $addresses = $response['Addresses'];
74
            $pages = (int) ceil($response['totalSearchResults'] / 20);
75
            if ($page == 1 && ($pages > 1)) {
76
                for ($i = 2; $i <= $pages; $i++) {
77
                    // 1 call allowed per 5 seconds (on Development subscription)
78
                    ($this->config->getApiSubscription() == 'Development') ? sleep(5) : '';
79
                    $pageData = $this->_get(
80
                        'v4/Address/address-free-text',
81
                        $lang,
82
                        [
83
                            'addressstring' => $address,
84
                            'page' => $i,
85
                        ],
86
                        false
87
                    );
88
                    $pageData = $pageData['Addresses'];
89
                    $pageData = array_combine(range(($i * 10), count($pageData) + (($i * 10) - 1)), array_values($pageData));
90
                    $addresses += $pageData;
91
                }
92
            }
93
            if($this->config->getCache()){
94
                (!file_exists($this->cacheDir)) ?
95
                    mkdir($this->cacheDir, 0777, false) : ((file_exists($cache)) ? unlink($cache) : touch($cache));
96
                file_put_contents($cache, serialize($addresses));
97
            }
98
            $this->response = $addresses;
99
100
        }
101
102
        return $this;
103
    }
104
105
    /**
106
     * Returns all the addresses found.
107
     *
108
     * @return  array
109
     */
110
    public function all()
111
    {
112
        $this->check();
113
114
        return $this->response;
115
    }
116
117
    /**
118
     * Returns all the addresses found.
119
     *
120
     * @return  array
121
     */
122
    public function get()
123
    {
124
        return $this->all();
125
    }
126
127
    /**
128
     * Verify an address.
129
     *
130
     * @param   int     $buildingNumber
131
     * @param   int     $zip
132
     * @param   int     $additionalNumber
133
     * @param   string  $lang
134
     * @return  array
135
     */
136
    public function verify($buildingNumber, $zip, $additionalNumber, $lang = 'A')
137
    {
138
        $response = $this->_get(
139
            'v3.1/Address/address-verify',
140
            $lang,
141
            [
142
                'buildingnumber'    => $buildingNumber,
143
                'zipcode'           => $zip,
144
                'additionalnumber'  => $additionalNumber,
145
            ]
146
        );
147
148
        return (bool) $response['addressfound'];
149
    }
150
151
    /**
152
     * Check if find() method was called first.
153
     *
154
     * @return  void
155
     * @throws  \BadMethodCallException
156
     */
157
    protected function check()
158
    {
159
        if ($this->response == null) {
160
            throw new \BadMethodCallException("You need to call find() method first.");
161
        }
162
    }
163
}
164