Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
71.43% covered (warning)
71.43%
30 / 42
0.00% covered (danger)
0.00%
0 / 3
CRAP
0.00% covered (danger)
0.00%
0 / 1
ProcessRequestResponseData
71.43% covered (warning)
71.43%
30 / 42
0.00% covered (danger)
0.00%
0 / 3
33.29
0.00% covered (danger)
0.00%
0 / 1
 handle
78.57% covered (warning)
78.57%
11 / 14
0.00% covered (danger)
0.00%
0 / 1
4.16
 processData
57.14% covered (warning)
57.14%
4 / 7
0.00% covered (danger)
0.00%
0 / 1
6.97
 processDatesAndIds
71.43% covered (warning)
71.43%
15 / 21
0.00% covered (danger)
0.00%
0 / 1
16.94
1<?php
2
3namespace App\Http\Middleware;
4
5use Closure;
6use DateTime;
7use Exception;
8use Illuminate\Http\Request;
9use Symfony\Component\HttpFoundation\Response;
10use Symfony\Component\HttpFoundation\StreamedResponse;
11
12class ProcessRequestResponseData
13{
14    public function handle(Request $request, Closure $next): Response
15    {
16        $formData = $request->all();
17        if (isset($formData['data'])) {
18            $formData = json_decode($formData['data'], true);
19            $request->request->remove('data');
20            $request->merge($formData);
21        }
22
23        $response = $next($request);
24
25        $data = json_decode($response->getContent(), true);
26        if (isset($data['error'])) {
27            return $response;
28        }
29        $data = $this->processData($data);
30        $data = json_encode(['result' => $data]);
31
32        if ($response instanceof StreamedResponse) {
33            # code...
34        }else {
35            $response->setContent($data);
36        }
37
38        return $response;
39    }
40
41    private function processData($data)
42    {
43        if (is_array($data)) {
44            if (array_values($data) === $data) {
45                foreach ($data as $key => $datum) {
46                    if (is_array($datum)) {
47                        $data[$key] = $this->processDatesAndIds($datum);
48                    }
49                }
50            } else {
51                $data = $this->processDatesAndIds($data);
52            }
53        }
54
55        return $data;
56    }
57
58    private function processDatesAndIds(array $data)
59    {
60        foreach ($data as $key => $value) {
61            if ($key === '_id') {
62                $key = 'id';
63                unset($data['_id']);
64            }
65
66            if (is_string($value) && strtotime($value)) {
67                $format = 'Y-m-d H:i:s';
68                $d = DateTime::createFromFormat($format, $value);
69                if ($d && $d->format($format) === $value) {
70                    try {
71                        $date = new DateTime($value);
72                        $value = $date->getTimestamp();
73                    } catch (Exception $e) {
74                    }
75                }
76            }
77
78            if (isset($value['$date'])) {
79                $value = $value['$date']['$numberLong'] / 1000;
80            }
81
82            if (is_array($value)) {
83                if (array_values($value) === $value) {
84                    foreach ($value as $k => $item) {
85                        if (is_array($item)) {
86                            $value[$k] = $this->processDatesAndIds($item);
87                        }
88                    }
89                } else {
90                    $value = $this->processDatesAndIds($value);
91                }
92            }
93
94            $data[$key] = $value;
95        }
96
97        return $data;
98    }
99}