Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
16 / 16
100.00% covered (success)
100.00%
1 / 1
CRAP
100.00% covered (success)
100.00%
1 / 1
ApiResponse
100.00% covered (success)
100.00%
16 / 16
100.00% covered (success)
100.00%
1 / 1
10
100.00% covered (success)
100.00%
1 / 1
 handle
100.00% covered (success)
100.00%
16 / 16
100.00% covered (success)
100.00%
1 / 1
10
1<?php
2
3namespace App\Http\Middleware;
4
5use App\Enums\ApiStatus;
6use App\Http\Resources\Api\V2\ApiResponse as V2ApiResponse;
7use App\Http\Resources\Api\V4\ApiResponse as V4ApiResponse;
8use App\Lib\Helper;
9use App\Models\Service;
10use Illuminate\Http\JsonResponse;
11use Illuminate\Http\Request;
12
13class ApiResponse
14{
15    /**
16     * Handle an incoming request.
17     *
18     * @param  \Illuminate\Http\Request $request
19     * @param  \Closure                 $next
20     * @return mixed
21     * @throws \ErrorException If the received response is not a JsonResponse.
22     */
23    public function handle(Request $request, \Closure $next): mixed
24    {
25        /** @var \Illuminate\Http\JsonResponse $response */
26        $response = $next($request);
27
28        if (\get_class($response) !== JsonResponse::class) {
29            // @codeCoverageIgnoreStart
30            throw new \ErrorException('All api responses should be json.');
31            // @codeCoverageIgnoreEnd
32        }
33
34        // Set no cache header.
35        $response->header('Cache-Control', 'No-Store');
36
37        /** @var \App\Models\Service|null */
38        if (\optional($service = app(Service::class))->id) {
39            $service->incrementStat();
40        }
41
42        /** @var object $data */
43        $data = $response->getData();
44
45        /** Check if it's V2 or V4 response. */
46        if (
47            gettype($data) === "object" and
48            isset($data->status) and
49            isset($data->data) and
50            isset($data->version) and
51            in_array($data->status, [ApiStatus::OK->value(), ApiStatus::KO->value()])
52        ) {
53            /** Return direct ApiResponse */
54            return $response;
55        }
56
57        $status = intval($response->getStatusCode() / 100) == 2 ? ApiStatus::OK : ApiStatus::KO;
58
59        if (Helper::isRequestForApiV2($request)) {
60            return $response->setData(new V2ApiResponse((object)$data, $status));
61        }
62
63        return $response->setData(new V4ApiResponse((object)$data, $status));
64    }
65}