Projekt

Obecné

Profil

Stáhnout (11.1 KB) Statistiky
| Větev: | Revize:
1 1123608c Cajova-Houba
<?php
2
/**
3
 * Created by PhpStorm.
4
 * User: Zdenda
5
 * Date: 20.4.2018
6
 * Time: 20:09
7
 */
8
9
namespace App\Http\Controllers;
10
11
use App\Model\Device;
12 b50f8ebd Cajova-Houba
use App\Model\Zarizeni;
13 d58f0fda Cajova-Houba
use App\Model\Zaznam;
14 1123608c Cajova-Houba
use Illuminate\Http\Request;
15 9bc023de Cajova-Houba
use phpDocumentor\Reflection\Types\Array_;
16
use phpDocumentor\Reflection\Types\Mixed_;
17 1123608c Cajova-Houba
18
class DeviceController extends Controller
19
{
20 f71bf8bd Cajova-Houba
    // nazvy moznych url parametru
21
    const ADDRESS_PARAM = 'address';
22
    const SHOW_DIRECTION_PARAM = 'showDirection';
23
    const DATE_FROM_PARAM = 'dateFrom';
24
    const DATE_TO_PARAM = 'dateTo';
25
    const TIME_FROM_PARAM = 'timeFrom';
26 4877913b Cajova-Houba
    const TIME_TO_PARAM = 'timeTo';
27 f71bf8bd Cajova-Houba
    const DIRECTION_PARAM = 'direction';
28
29
30 01f99166 Jan Kohlíček
    public function getDevice(Request $request)
31
    {
32 143e4121 Cajova-Houba
        $address = null;
33 01f99166 Jan Kohlíček
        $showDirection = 0;
34 4877913b Cajova-Houba
        if ($request->has(self::ADDRESS_PARAM)) {
35
            $address = $request->input(self::ADDRESS_PARAM);
36 1123608c Cajova-Houba
        }
37
38 4877913b Cajova-Houba
        if ($request->has(self::SHOW_DIRECTION_PARAM) && $request->input(self::SHOW_DIRECTION_PARAM) == '1') {
39 f71bf8bd Cajova-Houba
            $showDirection = 1;
40 1123608c Cajova-Houba
        }
41
42 f71bf8bd Cajova-Houba
        $device = Zarizeni::findByAddressJoinAddress($address, $showDirection);
43 a139ba77 Cajova-Houba
44
        return $device;
45 1123608c Cajova-Houba
    }
46
47
    /**
48
     * Vrati zarizeni podle id.
49
     * Url parametry:
50
     * dateFrom
51
     * dateTo
52
     * timeFrom
53
     * timeTo
54
     * direction
55
     *
56
     * @param Request $request
57
     * @param $id
58
     * @return \Symfony\Component\HttpFoundation\Response
59
     */
60 9bc023de Cajova-Houba
    public function getDeviceByIdWithTraffic(Request $request, $id)
61 01f99166 Jan Kohlíček
    {
62 9bc023de Cajova-Houba
        $device = $this->getDeviceById($id);
63
        if ($device != null) {
64
            $device->traffics = $this->findTrafficByDevice($request, $id);
65
            return json_encode($device);
66
        } else {
67
            return response('Not found.', 404);
68
        }
69
    }
70
71
    /**
72
     * Vrati zarizeni podle id, nebo null, pokud neni nalezeno.
73
     *
74
     * @param $id
75
     * @return Zarizeni
76
     */
77 3fef37e1 Cajova-Houba
    public function getDeviceById($id)
78
    {
79 9bc023de Cajova-Houba
        return Zarizeni::findByIdJoinAddress($id);
80
    }
81 1123608c Cajova-Houba
82 9bc023de Cajova-Houba
    /**
83
     * Vrati zaznamy o doprave pro dane zarizeni. Request obsahuje dodatecne url parametry.
84
     *
85
     * @param Request $request
86
     * @param $deviceId
87
     */
88 3fef37e1 Cajova-Houba
    public function findTrafficByDevice(Request $request, $deviceId)
89
    {
90 d58f0fda Cajova-Houba
        // nacti parametry
91 4877913b Cajova-Houba
        $params = $this->loadDateTimeDirectionConstraints($request);
92
        $dateFrom = $params[self::DATE_FROM_PARAM];
93
        $dateTo = $params[self::DATE_TO_PARAM];
94
        $timeFrom = $params[self::TIME_FROM_PARAM];
95
        $timeTo = $params[self::TIME_TO_PARAM];
96
        $direction = $params[self::DIRECTION_PARAM];
97 d58f0fda Cajova-Houba
98 9bc023de Cajova-Houba
        return Zaznam::findByDevice($deviceId, $dateFrom, $dateTo, $timeFrom, $timeTo, $direction);
99
    }
100
101 fb12df6d Jan Kohlíček
    public function findDayAverageTrafficByDevice(Request $request, $deviceId)
102
    {
103 3fef37e1 Cajova-Houba
        // nacti parametry
104
        $params = $this->loadDateTimeDirectionConstraints($request);
105
        $dateFrom = $params[self::DATE_FROM_PARAM];
106
        $dateTo = $params[self::DATE_TO_PARAM];
107
        $direction = $params[self::DIRECTION_PARAM];
108
109
        return Zaznam::averageByDay($deviceId, $dateFrom, $dateTo, $direction);
110
    }
111
112 9bc023de Cajova-Houba
    /**
113
     * Nacte zarizeni spolecne se vsemi jeho zaznamy (podle url parametru) a vrati je jako stahnutelny csv soubor.
114
     * Csv bude obsahovat udaje o zarizeni na prvni radce, udaje o doprave na nasledujicich.
115
     *
116
     * Pokud zarizeni nebylo nalezeno, je vracena 404.
117
     *
118
     * @param Request $request
119
     * @param $id
120
     * @return Mixed_
121
     */
122 3fef37e1 Cajova-Houba
    public function getDeviceByIdAsCsv(Request $request, $id)
123
    {
124
        return $this->createCsvFileForDeviceData(
125
            $this->findDeviceByIdSetDates($request, $id),
126
            $this->findTrafficByDevice($request, $id),
127
            'doprava-export-'
128
        );
129
    }
130 9bc023de Cajova-Houba
131 3fef37e1 Cajova-Houba
    public function getTrafficAverageByDevice(Request $request, $id)
132
    {
133
        $device = $this->findDeviceByIdSetDates($request, $id);
134 d58f0fda Cajova-Houba
        if ($device != null) {
135 9bc023de Cajova-Houba
136 3fef37e1 Cajova-Houba
            $device->traffics = $this->findTrafficAverageByDevice($request, $id);
137
            return json_encode($device);
138 0b27c108 Jan Kohlíček
        } else {
139 a139ba77 Cajova-Houba
            return response('Not found.', 404);
140 d58f0fda Cajova-Houba
        }
141 b50f8ebd Cajova-Houba
    }
142 1123608c Cajova-Houba
143 9bc023de Cajova-Houba
    /**
144 3fef37e1 Cajova-Houba
     * Vrati prumerna data o doprave pro dane zarizeni jako stahnutelny csv soubor.
145 9bc023de Cajova-Houba
     *
146 3fef37e1 Cajova-Houba
     * @param Request $request
147
     * @param integer $id Id zarizeni.
148
     * @return Mixed_
149 9bc023de Cajova-Houba
     */
150 fb12df6d Jan Kohlíček
    public function getTrafficAverageByDeviceCsv(Request $request, $id)
151
    {
152 3fef37e1 Cajova-Houba
        return $this->createCsvFileForDeviceData(
153
            $this->findDeviceByIdSetDates($request, $id),
154
            $this->findDayAverageTrafficByDevice($request, $id),
155 fb12df6d Jan Kohlíček
            'doprava-casove-prumery-export-'
156
        );
157 9bc023de Cajova-Houba
    }
158
159 3fef37e1 Cajova-Houba
    /**
160
     * Vrati prumerna data o doprave (pouze data o doprave) pro dane zarizeni.
161
     *
162
     * @param Request $request Request s parametry.
163
     * @param $deviceId Id zarizeni.
164
     * @return Mixed_
165
     */
166 fb12df6d Jan Kohlíček
    public function findTrafficAverageByDevice(Request $request, $deviceId)
167
    {
168 4877913b Cajova-Houba
        // nacti parametry
169
        $params = $this->loadDateTimeDirectionConstraints($request);
170
        $dateFrom = $params[self::DATE_FROM_PARAM];
171
        $dateTo = $params[self::DATE_TO_PARAM];
172
        $timeFrom = $params[self::TIME_FROM_PARAM];
173
        $timeTo = $params[self::TIME_TO_PARAM];
174
        $direction = $params[self::DIRECTION_PARAM];
175
176 3fef37e1 Cajova-Houba
        return Zaznam::averageByDevice($deviceId, $dateFrom, $dateTo, $timeFrom, $timeTo, $direction);
177 4877913b Cajova-Houba
    }
178
179 fadc220b Cajova-Houba
    /**
180
     * Vrati denni prumery pro jednotlive typy vozidel.
181
     *
182
     * @param Request $request Request s parametry.
183
     * @param $id Id zarizeni.
184
     * @return Mixed_
185
     */
186 3fef37e1 Cajova-Houba
    public function getTrafficDayAverage(Request $request, $id)
187
    {
188
        $device = $this->findDeviceByIdSetDates($request, $id);
189 fadc220b Cajova-Houba
190
        if ($device != null) {
191 3fef37e1 Cajova-Houba
            $device->traffics = $this->findDayAverageTrafficByDevice($request, $id);
192 fadc220b Cajova-Houba
            return json_encode($device);
193
        } else {
194
            return response('Not found.', 404);
195
        }
196
    }
197
198 3fef37e1 Cajova-Houba
199
    /**
200
     * Vrati denni prumery pro jendotlive typy vozidel jako stahnutelny csv soubor.
201
     *
202
     * @param Request $request Request.
203
     * @param $id Id zarizeni.
204
     * @return Mixed_
205
     */
206
    public function getTrafficDayAverageCsv(Request $request, $id)
207
    {
208
        return $this->createCsvFileForDeviceData(
209
            $this->findDeviceByIdSetDates($request, $id),
210
            $this->findDayAverageTrafficByDevice($request, $id),
211
            'doprava-denni-prumery-export-'
212
        );
213
    }
214
215 01f99166 Jan Kohlíček
    public function getAll()
216
    {
217 b50f8ebd Cajova-Houba
        return Zarizeni::getAllJoinAddress();
218 1123608c Cajova-Houba
    }
219 d58f0fda Cajova-Houba
220 01f99166 Jan Kohlíček
    public function lastDay()
221
    {
222 d58f0fda Cajova-Houba
        return Zaznam::lastInsertedDate();
223
    }
224 73804802 Cajova-Houba
225 01f99166 Jan Kohlíček
    public function headerTest(Request $request)
226
    {
227 73804802 Cajova-Houba
        $authHeader = $request->header("jwt");
228
229 01f99166 Jan Kohlíček
        if ($authHeader != null) {
230 73804802 Cajova-Houba
            return $authHeader;
231
        } else {
232
            return $request->header("jwt");
233
        }
234
    }
235 4877913b Cajova-Houba
236
    /**
237
     * Funkce nacte z requestu url parametry dateFrom, dateTo, timeFrom, timeTo, direciton a vrati je jako pole.
238
     * Defaultni hodnoty jsou null.
239
     *
240
     * @param Request $request Request ze ktere budou nacitany parametry.
241 fadc220b Cajova-Houba
     * @return array Pole s nactenymi parametry.
242 4877913b Cajova-Houba
     */
243 01f99166 Jan Kohlíček
    private function loadDateTimeDirectionConstraints(Request $request)
244
    {
245 4877913b Cajova-Houba
        $params = array();
246
        $params[self::DATE_FROM_PARAM] = null;
247
        $params[self::DATE_TO_PARAM] = null;
248
        $params[self::TIME_FROM_PARAM] = null;
249
        $params[self::TIME_TO_PARAM] = null;
250
        $params[self::DIRECTION_PARAM] = null;
251
252
        if ($request->has(self::DATE_FROM_PARAM)) {
253
            $params[self::DATE_FROM_PARAM] = $request->input(self::DATE_FROM_PARAM);
254
        }
255
        if ($request->has(self::DATE_TO_PARAM)) {
256
            $params[self::DATE_TO_PARAM] = $request->input(self::DATE_TO_PARAM);
257
        }
258
        if ($request->has(self::TIME_FROM_PARAM)) {
259
            $params[self::TIME_FROM_PARAM] = $request->input(self::TIME_FROM_PARAM);
260
        }
261
        if ($request->has(self::TIME_TO_PARAM)) {
262
            $params[self::TIME_TO_PARAM] = $request->input(self::TIME_TO_PARAM);
263
        }
264
        if ($request->has(self::DIRECTION_PARAM)) {
265
            $params[self::DIRECTION_PARAM] = $request->input(self::DIRECTION_PARAM);
266
        }
267
268
        return $params;
269
    }
270 3fef37e1 Cajova-Houba
271
    /**
272
     * Konvertuje objekt typu stdClass na pole pomoci funkci json_decode(), json_encode().
273
     *
274
     * @param $object
275
     * @return Array_
276
     */
277
    private function stdClassToArray($object)
278
    {
279
        return json_decode(json_encode($object), true);
280
    }
281
282
    /**
283
     * Prida hlavicku pole a data z pole do csv souboru.
284
     *
285
     * @param $df Ukazatel na soubor.
286
     * @param $array Pole.
287
     */
288 fb12df6d Jan Kohlíček
    private function addArrayToCsvFile($df, $array)
289
    {
290 3fef37e1 Cajova-Houba
        if ($array != null && count($array) > 0) {
291
            $row = $this->stdClassToArray($array[0]);
292
            fputcsv($df, array_keys($row));
293
294
            foreach ($array as $row) {
295
                fputcsv($df, $row);
296
            }
297
        }
298
    }
299
300
    /**
301
     * Funkce se pokusi nalezt zarizeni (s adresou) podle id a pokud najde, pokusi se z requestu dostat hodnoty parametru DATE_FROM,
302
     * DATE_TO a DIRECTION, ktere pak prida do nalezeneho zarizeni, ktere vrati. Pokud request uvedene parametry neobsahuje, budou
303
     * v zarizeni nastaveny na null.
304
     *
305
     * Pokud zarizeni nenajde, vrati null.
306
     *
307
     * @param Request $request Request s parametry.
308
     * @param integer $id id zarizeni.
309
     * @return Mixed_
310
     */
311 fb12df6d Jan Kohlíček
    private function findDeviceByIdSetDates(Request $request, $id)
312
    {
313 3fef37e1 Cajova-Houba
        // nacteni parametru
314
        $params = $this->loadDateTimeDirectionConstraints($request);
315
        $dateFrom = $params[self::DATE_FROM_PARAM];
316
        $dateTo = $params[self::DATE_TO_PARAM];
317
        $direction = $params[self::DIRECTION_PARAM];
318
319
        $device = Zarizeni::findByIdJoinAddress($id);
320
        if ($device != null) {
321
            $device->dateFrom = $dateFrom;
322
            $device->dateTo = $dateTo;
323
324
            if ($direction != null) {
325
                $device->direction = intval($direction);
326
            }
327
        }
328
329
        return $device;
330
    }
331
332
    /**
333
     * Vytvoří csv soubor pro zarizeni a souvisejici data o doprave a vynuti jeho stazeni.
334
     *
335
     * @param Mixed_ $device Metadata zarizeni (tj. zarizeni bez dat o doprave). Pokud null, je vracena response 404.
336
     * @param Mixed_ $traffic Data o doprave.
337
     * @param string $namePrefix Prefix jmena stahovaneho souboru.
338
     * @return Mixed_
339
     */
340 fb12df6d Jan Kohlíček
    private function createCsvFileForDeviceData($device, $traffic, $namePrefix)
341
    {
342 3fef37e1 Cajova-Houba
343
        if ($device != null) {
344
            $devArray = json_decode(json_encode($device), true);
345
            // tmp file
346
            $tmpFileName = $namePrefix . time() . '.csv';
347
            $tmpFilePath = tempnam(sys_get_temp_dir(), $tmpFileName);
348
            $df = fopen($tmpFilePath, 'w');
349
350
            // hlavicka pro zarizeni
351
            fputcsv($df, array_keys($devArray));
352
            fputcsv($df, $devArray);
353
354
            // zaznamy o doprave
355
            $traffic = $this->stdClassToArray($traffic);
356
            $this->addArrayToCsvFile($df, $traffic);
357
            fclose($df);
358
            return response()->download($tmpFilePath, $tmpFileName, array())->deleteFileAfterSend(true);
359
        } else {
360
            return response('Not found.', 404);
361
        }
362
    }
363 1123608c Cajova-Houba
}