Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 53
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
HealthCheckController
0.00% covered (danger)
0.00%
0 / 53
0.00% covered (danger)
0.00%
0 / 1
110
0.00% covered (danger)
0.00%
0 / 1
 index
0.00% covered (danger)
0.00%
0 / 53
0.00% covered (danger)
0.00%
0 / 1
110
1<?php
2
3namespace App\Http\Controllers;
4
5use Illuminate\Support\Facades\DB;
6use Illuminate\Support\Facades\Redis;
7use Symfony\Component\Process\Process;
8use Symfony\Component\Process\Exception\ProcessFailedException;
9
10class HealthCheckController extends Controller
11{
12    public function index()
13    {
14        $statuses = [
15            'application' => [
16                'status' => 'OK',
17                'message' => 'Application is running smoothly',
18            ],
19            'mongodb' => [
20                'status' => 'OK',
21                'message' => 'MongoDB connection established',
22            ],
23            'redis' => [
24                'status' => 'OK',
25                'message' => 'Redis connection established',
26            ],
27            'queue' => [
28                'status' => 'OK',
29                'count' => 0,
30                'message' => 'Queue is operational',
31            ],
32            'environment' => env('APP_ENV') ?? 'unknown',
33        ];
34
35        // Verificação do MongoDB
36        try {
37            DB::connection('mongodb')->getPdo();
38        } catch (\Exception $e) {
39            $statuses['mongodb']['status'] = 'Fail';
40            $statuses['mongodb']['message'] = 'MongoDB connection failed';
41            $statuses['mongodb']['error'] = $e->getMessage();
42            $statuses['application']['status'] = 'Partial Fail';
43            $statuses['application']['message'] = 'One or more services failed';
44        }
45
46        // Verificação do Redis
47        try {
48            Redis::ping();
49            $statuses['queue']['count'] = (Redis::llen('queues:default') ?? 0) + (Redis::llen('queues:high') ?? 0);
50        } catch (\Exception $e) {
51            $statuses['queue']['status'] = 'Fail';
52            $statuses['queue']['message'] = 'Redis connection failed';
53            $statuses['redis']['status'] = 'Fail';
54            $statuses['redis']['message'] = 'Redis connection failed';
55            $statuses['redis']['error'] = $e->getMessage();
56            $statuses['application']['status'] = 'Partial Fail';
57            $statuses['application']['message'] = 'One or more services failed';
58        }
59
60        try {
61            $queueRunning = $statuses['queue']['count'] < 100;
62
63            if ($queueRunning) {
64                $statuses['queue']['status'] = 'OK';
65            } else {
66                $statuses['queue']['status'] = 'ERROR';
67                $statuses['queue']['message'] = 'Queue is not running';
68            }
69        } catch (ProcessFailedException $exception) {
70            $statuses['queue']['status'] = 'ERROR';
71            $statuses['queue']['message'] = $exception->getMessage();
72        }
73
74        // Ajusta o status geral da aplicação
75        if ($statuses['mongodb']['status'] === 'Fail' && $statuses['redis']['status'] === 'Fail') {
76            $statuses['application']['status'] = 'Fail';
77            $statuses['application']['message'] = 'Both MongoDB and Redis connections failed';
78        } elseif ($statuses['mongodb']['status'] === 'OK' && $statuses['redis']['status'] === 'OK') {
79            $statuses['application']['status'] = 'OK';
80            $statuses['application']['message'] = 'All systems operational';
81        }
82
83        $httpStatus = ($statuses['application']['status'] === 'OK') ? 200 : 207;
84
85        return response()->json($statuses, $httpStatus);
86    }
87}