Issues (14)

src/WeatherAPI/WeatherJSONModel.php (14 issues)

1
<?php
2
3
namespace Anax\WeatherAPI;
4
5
use DateTime;
6
use DateInterval;
7
8
/**
9
 * Showing off a standard class with methods and properties.
10
 *
11
 * @SuppressWarnings(PHPMD.TooManyPublicMethods)
12
 */
13
class WeatherJSONModel
14
{
15
    protected $apikey1;
16
    protected $apikey2;
17
    protected $apikey3;
18
19
    /*
20
    * Sets the api keys from a file
21
    */
22 7
    public function __construct()
23
    {
24 7
        $apiKeys = require ANAX_INSTALL_PATH . "/config/api_keys.php";
25 7
        $this->apikey1 = $apiKeys["ipstacks"];
26 7
        $this->apikey2 = $apiKeys["darksky"];
27 7
        $this->apikey3 = $apiKeys["geocode"];
28 7
    }
29
30
    /*
31
    * Using nominatim to geo search an adress
32
    */
33 4
    public function geocode($address)
34
    {
35 4
        $adrsurl = urlencode($address);
36 4
        $json = [];
0 ignored issues
show
The assignment to $json is dead and can be removed.
Loading history...
37
38
        // Initialize CURL:
39 4
        $ch = curl_init("https://nominatim.openstreetmap.org/?format=json&addressdetails=1&q={$adrsurl}&limit=1&[email protected]");
40 4
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
0 ignored issues
show
It seems like $ch can also be of type false; however, parameter $ch of curl_setopt() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

40
        curl_setopt(/** @scrutinizer ignore-type */ $ch, CURLOPT_RETURNTRANSFER, true);
Loading history...
41
42
        // Store the data:
43 4
        $json = curl_exec($ch);
0 ignored issues
show
It seems like $ch can also be of type false; however, parameter $ch of curl_exec() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

43
        $json = curl_exec(/** @scrutinizer ignore-type */ $ch);
Loading history...
44 4
        curl_close($ch);
0 ignored issues
show
It seems like $ch can also be of type false; however, parameter $ch of curl_close() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

44
        curl_close(/** @scrutinizer ignore-type */ $ch);
Loading history...
45
46
        // Decode JSON response:
47 4
        $apiResult = json_decode($json, true);
48
49 4
        if ($apiResult) {
50
            return [
51 3
                "lat" => $apiResult[0]['lat'],
52 3
                "long" => $apiResult[0]['lon'],
53 3
                "city" => $apiResult[0]["address"]["city"] ?? "",
54 3
                "region" => $apiResult[0]["address"]["state"] ?? "",
55 3
                "country" => $apiResult[0]["address"]["country"] ?? ""
56
            ];
57
        }
58
59
        return [
60 2
            "404" => "Error: Couldnt find anything with that search!"
61
        ];
62
    }
63
64
    /*
65
    * Using ipstacks to geo search an IP adress
66
    */
67 2
    public function ipCurl($ipAdress)
68
    {
69 2
        $json = [];
0 ignored issues
show
The assignment to $json is dead and can be removed.
Loading history...
70
71
        // Initialize CURL:
72 2
        $ch = curl_init('http://api.ipstack.com/'. $ipAdress . '?access_key=' . $this->apikey1 . '');
73 2
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
0 ignored issues
show
It seems like $ch can also be of type false; however, parameter $ch of curl_setopt() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

73
        curl_setopt(/** @scrutinizer ignore-type */ $ch, CURLOPT_RETURNTRANSFER, true);
Loading history...
74
75
        // Store the data:
76 2
        $json = curl_exec($ch);
0 ignored issues
show
It seems like $ch can also be of type false; however, parameter $ch of curl_exec() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

76
        $json = curl_exec(/** @scrutinizer ignore-type */ $ch);
Loading history...
77 2
        curl_close($ch);
0 ignored issues
show
It seems like $ch can also be of type false; however, parameter $ch of curl_close() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

77
        curl_close(/** @scrutinizer ignore-type */ $ch);
Loading history...
78
79
        // Decode JSON response:
80 2
        $apiResult = json_decode($json, true);
81
82
        return [
83 2
            "lat" => $apiResult["latitude"],
84 2
            "long" => $apiResult["longitude"],
85 2
            "city" => $apiResult["city"] ?? $apiResult["address"]["village"],
86 2
            "region" => $apiResult["region_name"],
87 2
            "country" => $apiResult["country_name"]
88
        ];
89
    }
90
91
    /*
92
    * Fetching weather
93
    */
94 3
    public function fetchCurrentWeather($coords)
95
    {
96 3
        $json = [];
0 ignored issues
show
The assignment to $json is dead and can be removed.
Loading history...
97 3
        $location = $coords["lat"] . ',' . $coords["long"];
98
99
        // Initialize CURL:
100 3
        $ch = curl_init('https://api.darksky.net/forecast/'.$this->apikey2.'/'.$location.'?exclude=minutely,hourly,currently,alerts,flags&extend=daily&lang=sv&units=ca');
101 3
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
0 ignored issues
show
It seems like $ch can also be of type false; however, parameter $ch of curl_setopt() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

101
        curl_setopt(/** @scrutinizer ignore-type */ $ch, CURLOPT_RETURNTRANSFER, true);
Loading history...
102
103
        // Store the data:
104 3
        $json = curl_exec($ch);
0 ignored issues
show
It seems like $ch can also be of type false; however, parameter $ch of curl_exec() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

104
        $json = curl_exec(/** @scrutinizer ignore-type */ $ch);
Loading history...
105 3
        curl_close($ch);
0 ignored issues
show
It seems like $ch can also be of type false; however, parameter $ch of curl_close() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

105
        curl_close(/** @scrutinizer ignore-type */ $ch);
Loading history...
106
107
        // Decode JSON response:
108 3
        $apiResult = json_decode($json, true);
109
110 3
        return [$apiResult];
111
    }
112
113
    /*
114
    * Fetching weather
115
    */
116 2
    public function fetchPrevWeather($coords, $days)
117
    {
118 2
        $json = [];
119 2
        $res = $this->multiCurl($coords, $days);
120 2
        foreach ($res as $day) {
121 2
            $json[] = $day["daily"]["data"];
122
        }
123
124 2
        return [$json];
125
    }
126
127
    /*
128
    * Method for setting up multi curl
129
    */
130 2
    public function multiCurl($coords, $days)
131
    {
132 2
        $urls = $this->getUrls($coords, $days);
133
134 2
        $mCurl = curl_multi_init();
135 2
        $handles = [];
136 2
        $json = [];
137 2
        foreach ($urls as $url) {
138 2
            $ch = curl_init($url);
139 2
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
0 ignored issues
show
It seems like $ch can also be of type false; however, parameter $ch of curl_setopt() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

139
            curl_setopt(/** @scrutinizer ignore-type */ $ch, CURLOPT_RETURNTRANSFER, true);
Loading history...
140 2
            curl_multi_add_handle($mCurl, $ch);
0 ignored issues
show
It seems like $ch can also be of type false; however, parameter $ch of curl_multi_add_handle() does only seem to accept resource, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

140
            curl_multi_add_handle($mCurl, /** @scrutinizer ignore-type */ $ch);
Loading history...
141 2
            $handles[$url] = $ch;
142
        }
143 2
        $this->startMultiCurl($mCurl);
144 2
        foreach ($handles as $channel) {
145 2
            $html = curl_multi_getcontent($channel);
146 2
            $json[] = json_decode($html, true);
147 2
            curl_multi_remove_handle($mCurl, $channel);
148
        }
149 2
        curl_multi_close($mCurl);
150 2
        return $json;
151
    }
152
153
    /*
154
    * Method for getting all urls for the multi curl method
155
    */
156 2
    private function getUrls($coords, $days) : array
157
    {
158 2
        $urls = [];
159 2
        $location = $coords["lat"] . ',' . $coords["long"];
160 2
        for ($i = 0; $i < $days; $i++) {
161 2
            $time = $this->getDayFormat("$i");
162 2
            $urls[] = 'https://api.darksky.net/forecast/'.$this->apikey2.'/'.$location.','.$time.'?exclude=minutely,hourly,currently,alerts,flags&extend=daily&lang=sv&units=auto';
163
        }
164 2
        return $urls;
165
    }
166
167
    /*
168
    * Method for converting time/date to correct format for darksky api
169
    */
170 2
    public function getDayFormat($day)
171
    {
172 2
        $date = new Datetime();
173 2
        $date->sub(new DateInterval('P'. (intval($day) + 1) .'D'));
174 2
        return $date->format('U');
175
    }
176
177
    /*
178
    * Method for actually fetching the multi curls
179
    */
180 2
    public function startMultiCurl($mCurl)
181
    {
182
        do {
183 2
            $mrc = curl_multi_exec($mCurl, $active);
184 2
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
185 2
        while ($active && $mrc == CURLM_OK) {
186 2
            if (curl_multi_select($mCurl) == -1) {
187
                usleep(100);
188
            }
189
            do {
190 2
                $mrc = curl_multi_exec($mCurl, $active);
191 2
            } while ($mrc == CURLM_CALL_MULTI_PERFORM);
192
        }
193 2
    }
194
}
195