Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
30.30% covered (danger)
30.30%
10 / 33
40.00% covered (danger)
40.00%
2 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
MessagesController
30.30% covered (danger)
30.30%
10 / 33
40.00% covered (danger)
40.00%
2 / 5
36.42
0.00% covered (danger)
0.00%
0 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 send
0.00% covered (danger)
0.00%
0 / 18
0.00% covered (danger)
0.00%
0 / 1
20
 validateData
50.00% covered (danger)
50.00%
3 / 6
0.00% covered (danger)
0.00%
0 / 1
2.50
 prepareMessage
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
1
 logError
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace App\Http\Controllers;
4
5use App\Services\RabbitMQService;
6use App\Jobs\MessagesJob;
7use App\Models\Messages;
8use Illuminate\Http\JsonResponse;
9use Illuminate\Http\Request;
10use Illuminate\Support\Facades\Log;
11
12class MessagesController extends Controller
13{
14    private Messages $messagesModel;
15
16    public function __construct(Messages $messagesModel)
17    {
18        $this->messagesModel = $messagesModel;
19    }
20
21    /**
22     * @OA\Post(
23     *     path="/api/send",
24     *     summary="Send a message",
25     *     tags={"Message"},
26     *     @OA\Parameter(
27     *         name="name",
28     *         in="query",
29     *         description="User's name",
30     *         required=true,
31     *         @OA\Schema(type="string")
32     *     ),
33     *     @OA\Parameter(
34     *         name="email",
35     *         in="query",
36     *         description="User's email",
37     *         required=true,
38     *         @OA\Schema(type="string")
39     *     ),
40     *     @OA\Parameter(
41     *         name="subject",
42     *         in="query",
43     *         description="User's subject",
44     *         required=false,
45     *         @OA\Schema(type="string")
46            ),
47     *      @OA\Parameter(
48     *          name="content",
49     *          in="query",
50     *          description="User's content",
51     *          required=true,
52     *          @OA\Schema(type="string")
53     *      ),
54     *     @OA\Response(response="201", description="Message sent successfully"),
55     *     @OA\Response(response="422", description="Validation errors")
56     * )
57     */
58    public function send(Request $request): JsonResponse
59    {
60        try {
61
62            // Validate received data
63            $validationResult = $this->validateData($request->all());
64            if ($validationResult !== true)
65            {
66               return response()->json(
67                    ['error' => $validationResult],
68                    422
69                );
70            }
71
72            // Prepare message
73            $message = $this->prepareMessage($request);
74
75            // Send message to the RabbitMQ queue
76            $queue = env('RABBIT_MESSAGE_QUEUE');
77            dispatch(new MessagesJob(json_encode($message), $queue, new RabbitMQService()));
78
79        } catch (\Exception $e) {
80            return response()->json(
81                ['error' => $e->getMessage()],
82                500
83            );
84        }
85
86        // If flow reaches here, everything worked fine!
87        // Confirm if it is an API
88        $isApiRequest = $request->is('api/*');
89        if ($isApiRequest) {
90            return response()->json(['success-api']);
91        }
92
93        return response()->json(['success-site']);
94    }
95
96    /**
97     * Validate the received data using the Messages model.
98     *
99     * @param array $data
100     * @return string|bool
101     */
102    public function validateData(array $data) : string | bool
103    {
104        $validator = $this->messagesModel->validateData($data);
105
106        if ($validator->fails()) {
107
108            // Log validation errors
109            $errors = $validator->errors()->toArray();
110            $this->logError('Validation failed: ' . json_encode($errors));
111
112            // Return errors
113            return json_encode($errors);
114        }
115
116        return true;
117    }
118
119    /**
120     * Prepare the message data from the request.
121     *
122     * @param Request $request
123     * @return array
124     */
125    public function prepareMessage(Request $request): array
126    {
127        return [
128            'name'    => $request->input('name'),
129            'email'   => $request->input('email'),
130            'subject' => $request->input('subject'),
131            'content' => $request->input('content'),
132        ];
133    }
134
135    /**
136     * Log an error message to the 'messages' channel.
137     *
138     * @param string $message
139     * @return void
140     */
141    public function logError(string $message): void
142    {
143        Log::channel('messages')
144            ->error('Error on Controller receiving message from client: ' . $message);
145    }
146}