Code Coverage |
||||||||||
Lines |
Functions and Methods |
Classes and Traits |
||||||||
Total | |
30.30% |
10 / 33 |
|
40.00% |
2 / 5 |
CRAP | |
0.00% |
0 / 1 |
MessagesController | |
30.30% |
10 / 33 |
|
40.00% |
2 / 5 |
36.42 | |
0.00% |
0 / 1 |
__construct | |
100.00% |
1 / 1 |
|
100.00% |
1 / 1 |
1 | |||
send | |
0.00% |
0 / 18 |
|
0.00% |
0 / 1 |
20 | |||
validateData | |
50.00% |
3 / 6 |
|
0.00% |
0 / 1 |
2.50 | |||
prepareMessage | |
100.00% |
6 / 6 |
|
100.00% |
1 / 1 |
1 | |||
logError | |
0.00% |
0 / 2 |
|
0.00% |
0 / 1 |
2 |
1 | <?php |
2 | |
3 | namespace App\Http\Controllers; |
4 | |
5 | use App\Services\RabbitMQService; |
6 | use App\Jobs\MessagesJob; |
7 | use App\Models\Messages; |
8 | use Illuminate\Http\JsonResponse; |
9 | use Illuminate\Http\Request; |
10 | use Illuminate\Support\Facades\Log; |
11 | |
12 | class 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 | } |