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