Proyectos de Subversion LeadersLinked - Services

Rev

Rev 741 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
 
3
declare(strict_types=1);
4
 
5
namespace LeadersLinked\Controller;
6
 
7
use Laminas\Db\Adapter\AdapterInterface;
8
 
9
use Laminas\Mvc\Controller\AbstractActionController;
10
use Laminas\Log\LoggerInterface;
11
use Laminas\View\Model\ViewModel;
12
 
13
use LeadersLinked\Library\Functions;
14
use LeadersLinked\Mapper\UserMapper;
15
 
16
use LeadersLinked\Model\User;
17
 
18
use LeadersLinked\Mapper\UserBlockedMapper;
19
 
743 stevensc 20
use LeadersLinked\Mapper\CompanyMapper;
21
use LeadersLinked\Mapper\CompanyUserMapper;
307 www 22
use LeadersLinked\Mapper\ConversationMapper;
23
use LeadersLinked\Mapper\MessageMapper;
24
use LeadersLinked\Model\Conversation;
1 efrain 25
use Laminas\View\Model\JsonModel;
307 www 26
use LeadersLinked\Form\InMail\SendForm;
27
use LeadersLinked\Model\Message;
199 efrain 28
use LeadersLinked\Mapper\AbuseReportMapper;
29
use LeadersLinked\Model\AbuseReport;
345 www 30
use LeadersLinked\Library\Storage;
1 efrain 31
 
32
class InMailController extends AbstractActionController
33
{
34
    /**
35
     * @var \Laminas\Db\Adapter\AdapterInterface
36
     */
37
    private $adapter;
582 ariadna 38
 
1 efrain 39
    /**
40
     *
41
     * @var \LeadersLinked\Cache\CacheInterface
42
     */
43
    private $cache;
582 ariadna 44
 
1 efrain 45
    /**
46
     * @var \Laminas\Log\LoggerInterface
47
     */
48
    private $logger;
582 ariadna 49
 
1 efrain 50
    /**
51
     * @var array
52
     */
53
    private $config;
582 ariadna 54
 
1 efrain 55
    /**
56
     * @var \Laminas\Mvc\I18n\Translator
57
     */
58
    private $translator;
582 ariadna 59
 
60
 
1 efrain 61
    /**
62
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
63
     * @param \LeadersLinked\Cache\CacheInterface $cache
64
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
65
     * @param array $config
66
     * @param \Laminas\Mvc\I18n\Translator $translator
67
     */
68
    public function __construct($adapter, $cache, $logger, $config, $translator)
69
    {
70
        $this->adapter      = $adapter;
71
        $this->cache        = $cache;
72
        $this->logger       = $logger;
73
        $this->config       = $config;
74
        $this->translator   = $translator;
75
    }
76
 
77
    public function indexAction()
78
    {
79
        $request = $this->getRequest();
667 stevensc 80
 
81
        // Verificar que la petición sea GET
82
        if (!$request->isGet()) {
83
            return new JsonModel([
84
                'success' => false,
85
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
86
            ]);
87
        }
307 www 88
 
667 stevensc 89
        // Obtener el usuario actual autenticado
90
        $currentUserPlugin = $this->plugin('currentUserPlugin');
91
        $currentUser = $currentUserPlugin->getUser();
307 www 92
 
667 stevensc 93
        // Obtener la fecha actual de la base de datos para cálculos de tiempo
94
        $userMapper = UserMapper::getInstance($this->adapter);
95
        $now = $userMapper->getDatebaseNow();
1 efrain 96
 
667 stevensc 97
        // Obtener IDs de usuarios que el usuario actual ha bloqueado
98
        $userBlockedMapper = UserBlockedMapper::getInstance($this->adapter);
99
        $user_blocked_ids = $userBlockedMapper->fetchAllBlockedReturnIds($currentUser->id);
199 efrain 100
 
667 stevensc 101
        // Obtener IDs de usuarios que han bloqueado al usuario actual
102
        $user_blocked_me_ids = $userBlockedMapper->fetchAllUserBlockMeReturnIds($currentUser->id);
1 efrain 103
 
693 stevensc 104
        $storage = Storage::getInstance($this->config, $this->adapter);
667 stevensc 105
        $conversationMapper = ConversationMapper::getInstance($this->adapter);
106
        $messageMapper = MessageMapper::getInstance($this->adapter);
107
        $conversations = [];
108
        $selected_user_id = 0;
307 www 109
 
736 stevensc 110
        $uuid = $this->params()->fromRoute('id');
728 stevensc 111
 
741 stevensc 112
        if ($uuid) {
113
            $companyMapper = CompanyMapper::getInstance($this->adapter);
114
            $company = $companyMapper->fetchOneByUuid($uuid);
735 stevensc 115
 
741 stevensc 116
            if ($company) {
117
                $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
118
                $companyUser = $companyUserMapper->fetchOwnerByCompanyId($company->id);
119
 
120
                if(!in_array($companyUser->user_id, $user_blocked_ids) && !in_array($companyUser->id, $user_blocked_me_ids)) {
121
                    $user  = $userMapper->fetchOne($companyUser->user_id);
122
 
123
 
124
                    $selected_user_id = $user->id;
125
                    $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
126
 
127
 
128
                    $timeElapsedString = '';
129
                    if ($conversation) {
130
                        $unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($conversation->id, $currentUser->id);
131
                        $lastMessage = $messageMapper->fetchLastUnreadMessagesByConversationIdAndReceiverId($conversation->id, $currentUser->id);
132
 
133
                        if ($lastMessage) {
134
                            $timeElapsedString =  $this->timeAgo($lastMessage, $now);
135
                        }
136
                    } else {
137
                        $unread = 0;
138
                    }
139
 
140
 
141
                    array_push($conversations, [
142
                        'uuid' => $company->uuid,
143
                        'name' => $company->name,
144
                        'last_message' => $timeElapsedString,
145
                        'count_unread' => $unread,
146
                        'selected' => 1,
147
                        'image' => $storage->getCompanyImage($company),
148
                        'profile' => $this->url()->fromRoute('company/view', ['id' => $company->uuid]),
149
                        'messages_url' => $this->url()->fromRoute('inmail/messages',['uuid' => $company->uuid]),
150
                        'save_url' => $this->url()->fromRoute('inmail/messages/send',['uuid' => $company->uuid]),
151
                        'delete_url' => $this->url()->fromRoute('inmail/messages/delete',['uuid' => $company->uuid])
152
                    ]);
153
                }
154
            } else {
155
                $user = $userMapper->fetchOneByUuid($uuid);
156
 
157
                if ($user) {
158
                    if(!in_array($user->id, $user_blocked_ids) && !in_array($user->id, $user_blocked_me_ids)) {
159
 
160
                        $timeElapsedString = '';
161
 
162
                        $selected_user_id = $user->id;
163
                        $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
164
                        if ($conversation) {
165
                            $unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($conversation->id, $currentUser->id);
166
                            $lastMessage = $messageMapper->fetchLastUnreadMessagesByConversationIdAndReceiverId($conversation->id, $currentUser->id);
167
                            if ($lastMessage) {
168
                                $timeElapsedString =  $this->timeAgo($lastMessage, $now);
169
                            }
170
                        } else {
171
                            $unread = 0;
172
                        }
173
 
174
 
175
                        array_push($conversations, [
176
                            'uuid' => $user->uuid,
177
                            'name' => trim($user->first_name . ' ' . $user->last_name),
178
                            'image' => $storage->getUserImage($user),
179
                            'profile' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
180
                            'last_message' => $timeElapsedString,
181
                            'count_unread' => $unread,
182
                            'selected' => 1,
183
                            'messages_url' => $this->url()->fromRoute('inmail/messages',['uuid' => $user->uuid]),
184
                            'save_url' => $this->url()->fromRoute('inmail/messages/send',['uuid' => $user->uuid]),
185
                            'delete_url' => $this->url()->fromRoute('inmail/messages/delete',['uuid' => $user->uuid]),
186
                        ]);
187
                    }
188
                }
189
            }
190
        }
191
 
667 stevensc 192
        $records = $conversationMapper->fetchAllByUserId($currentUser->id);
193
 
673 stevensc 194
        foreach ($records as $record) {
667 stevensc 195
            // Omitir conversaciones que ya fueron procesadas como seleccionadas
196
            if ($selected_user_id) {
197
                if ($record->sender_id == $currentUser->id && $record->receiver_id == $selected_user_id) {
198
                    continue;
1 efrain 199
                }
667 stevensc 200
                if ($record->receiver_id == $currentUser->id && $record->sender_id == $selected_user_id) {
201
                    continue;
582 ariadna 202
                }
667 stevensc 203
            }
1 efrain 204
 
667 stevensc 205
            if ($record->sender_id == $currentUser->id) {
206
                $user = $userMapper->fetchOne($record->receiver_id);
735 stevensc 207
            }
208
            if ($record->receiver_id == $currentUser->id) {
733 stevensc 209
                $user = $userMapper->fetchOne($record->sender_id);
667 stevensc 210
 
735 stevensc 211
                // Omitir usuarios bloqueados
212
                if (in_array($user->id, $user_blocked_ids) || in_array($user->id, $user_blocked_me_ids)) {
213
                    continue;
214
                }
667 stevensc 215
            }
1 efrain 216
 
667 stevensc 217
            $timeElapsedString = '';
218
            $unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId(
219
                $record->id,
220
                $currentUser->id
221
            );
222
            $lastMessage = $messageMapper->fetchLastMessagesByConversationIdAndReceiverId(
223
                $record->id,
224
                $currentUser->id
225
            );
1 efrain 226
 
667 stevensc 227
            if ($lastMessage) {
228
                $timeElapsedString = $this->timeAgo($lastMessage, $now);
582 ariadna 229
            }
1 efrain 230
 
667 stevensc 231
            array_push($conversations, [
232
                'uuid' => $user->uuid,
233
                'name' => trim($user->first_name . ' ' . $user->last_name),
692 stevensc 234
                'image' => $storage->getUserImage($user),
667 stevensc 235
                'profile' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
236
                'last_message' => $timeElapsedString,
237
                'count_unread' => $unread,
705 stevensc 238
                'selected' => 0,
706 stevensc 239
                'messages_url' => $this->url()->fromRoute('inmail/messages',['uuid' => $user->uuid]),
240
                'save_url' => $this->url()->fromRoute('inmail/messages/send',['uuid' => $user->uuid]),
710 stevensc 241
                'delete_url' => $this->url()->fromRoute('inmail/messages/delete',['uuid' => $user->uuid])
667 stevensc 242
            ]);
243
        }
1 efrain 244
 
667 stevensc 245
        // Ordenar por: seleccionados primero, luego por fecha del último mensaje
246
        usort($conversations, function ($a, $b) {
247
            if ($a['selected'] == $b['selected']) {
248
                if ($a['last_message'] == $b['last_message']) {
249
                    return 0;
582 ariadna 250
                } else {
667 stevensc 251
                    return $a['last_message'] < $b['last_message'] ? -1 : 1;
582 ariadna 252
                }
667 stevensc 253
            } else {
254
                return $a['selected'] < $b['selected'] ? -1 : 1;
255
            }
256
        });
1 efrain 257
 
667 stevensc 258
        return new JsonModel([
259
            'success' => true,
260
            'data' => $conversations
261
        ]);
1 efrain 262
    }
307 www 263
 
677 stevensc 264
    public function getMessagesAction()
1 efrain 265
    {
266
        $request = $this->getRequest();
666 stevensc 267
 
268
        if (!$request->isGet()) {
269
            return new JsonModel([
270
                'success' => false,
271
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
272
            ]);
273
        }
274
 
704 stevensc 275
        $page = (int) filter_var($this->params()->fromQuery('page'), FILTER_SANITIZE_NUMBER_INT);
683 stevensc 276
        $uuid = $this->params()->fromRoute('uuid');
666 stevensc 277
 
683 stevensc 278
        if (!$uuid) {
666 stevensc 279
            return new JsonModel([
280
                'success' => false,
281
                'data' => 'ERROR_PARAMETERS_ARE_INVALID'
282
            ]);
283
        }
307 www 284
 
666 stevensc 285
        $currentUserPlugin = $this->plugin('currentUserPlugin');
286
        $currentUser = $currentUserPlugin->getUser();
582 ariadna 287
 
666 stevensc 288
        $userMapper = UserMapper::getInstance($this->adapter);
289
        $now = $userMapper->getDatebaseNow();
307 www 290
 
683 stevensc 291
        $user = $userMapper->fetchOneByUuid($uuid);
666 stevensc 292
        if (!$user) {
293
            return new JsonModel([
294
                'success' => false,
295
                'data' => 'ERROR_REQUEST_IS_INVALID'
296
            ]);
297
        }
307 www 298
 
704 stevensc 299
        // Pre-calcular datos del usuario para evitar repetición
300
        $userData = $this->prepareUserData($user);
301
        $currentUserData = $this->prepareUserData($currentUser);
302
 
666 stevensc 303
        $abuseReportMapper = AbuseReportMapper::getInstance($this->adapter);
304
        $abuse_report_message_ids = $abuseReportMapper->fetchAllDataByUserReportingIdAndTypeReturnIds(
305
            $currentUser->id,
306
            AbuseReport::TYPE_INMAIL_MESSAGE
307
        );
307 www 308
 
666 stevensc 309
        $conversationMapper = ConversationMapper::getInstance($this->adapter);
310
        $messageMapper = MessageMapper::getInstance($this->adapter);
311
 
312
        $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
313
 
314
        $messages = [];
315
 
316
        if ($conversation) {
704 stevensc 317
            $paginator = $messageMapper->getAllMessagesPaginatorByConversationId($conversation->id, $page ? $page : 1, 10);
318
            $records = $paginator->getCurrentItems();
582 ariadna 319
 
666 stevensc 320
            foreach ($records as $record) {
321
                $timeElapsedString = $this->timeAgo($record->added_on, $now);
704 stevensc 322
                $isOwnMessage = $record->sender_id == $currentUser->id;
323
                $isReported = in_array($record->id, $abuse_report_message_ids);
307 www 324
 
704 stevensc 325
                if ($isOwnMessage) {
326
                    $messages[] = $this->buildMessageData(
327
                        $record,
328
                        $currentUserData,
329
                        $userData,
711 stevensc 330
                        'right',
704 stevensc 331
                        $timeElapsedString,
332
                        '' // No se puede reportar mensajes propios
333
                    );
334
                } else {
335
                    if ($isReported) {
336
                        $messages[] = $this->buildReportedMessageData(
337
                            $record,
338
                            $userData,
339
                            $currentUserData,
340
                            $timeElapsedString
341
                        );
666 stevensc 342
                    } else {
343
                        $url_abuse_report = $this->url()->fromRoute('helpers/abuse-report', [
344
                            'type' => 'message',
345
                            'id' => $record->uuid
346
                        ], ['force_canonical' => true]);
582 ariadna 347
 
704 stevensc 348
                        $messages[] = $this->buildMessageData(
349
                            $record,
350
                            $userData,
351
                            $currentUserData,
711 stevensc 352
                            'left',
704 stevensc 353
                            $timeElapsedString,
354
                            $url_abuse_report
355
                        );
582 ariadna 356
 
307 www 357
                        $messageMapper->markAsRead($record->id);
261 efrain 358
                    }
307 www 359
                }
1 efrain 360
            }
307 www 361
 
362
            return new JsonModel([
363
                'success' => true,
704 stevensc 364
                'data' => [
365
                    'total' => [
366
                        'count' => $paginator->getTotalItemCount(),
367
                        'pages' => $paginator->getPages()->pageCount,
368
                    ],
369
                    'current' => [
370
                        'items'    => $messages,
371
                        'page'     => $paginator->getCurrentPageNumber(),
372
                        'count'    => $paginator->getCurrentItemCount(),
373
                    ]
374
                ]
307 www 375
            ]);
1 efrain 376
        }
666 stevensc 377
 
378
        return new JsonModel([
379
            'success' => true,
704 stevensc 380
            'data' => [
381
                'total' => [
382
                    'count' => 0,
383
                    'pages' => 0,
384
                ],
385
                'current' => [
386
                    'items'    => $messages,
387
                    'page'     => 1,
388
                    'count'    => 0,
389
                ]
390
            ]
666 stevensc 391
        ]);
1 efrain 392
    }
307 www 393
 
704 stevensc 394
    /**
395
     * Prepara los datos del usuario para evitar repetición en la construcción de mensajes
396
     */
397
    private function prepareUserData($user)
398
    {
705 stevensc 399
        $storage = Storage::getInstance($this->config, $this->adapter);
400
 
704 stevensc 401
        return [
402
            'name' => trim($user->first_name . ' ' . $user->last_name),
705 stevensc 403
            'image' => $storage->getUserImage($user),
704 stevensc 404
            'profile_url' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid])
405
        ];
406
    }
407
 
408
    /**
409
     * Construye los datos de un mensaje normal
705 stevensc 410
     *
411
     * @param \LeadersLinked\Model\Message $record
412
     * @param array $senderData
413
     * @param array $receiverData
414
     * @param string $side
415
     * @param string $timeElapsedString
416
     * @param string $abuseReportUrl
704 stevensc 417
     */
418
    private function buildMessageData($record, $senderData, $receiverData, $side, $timeElapsedString, $abuseReportUrl)
419
    {
705 stevensc 420
        $storage = Storage::getInstance($this->config, $this->adapter);
421
        $path = $storage->getPathMessage();
422
 
704 stevensc 423
        return [
424
            'uuid' => $record->uuid,
425
            'sender_name' => $senderData['name'],
426
            'sender_image' => $senderData['image_url'],
427
            'sender_profile' => $senderData['profile_url'],
428
            'receiver_name' => $receiverData['name'],
429
            'receiver_image' => $receiverData['image_url'],
430
            'receiver_profile' => $receiverData['profile_url'],
431
            'side' => $side,
432
            'message' => $record->message,
433
            'type' => $record->type,
712 stevensc 434
            'filename_original' => $record->filename,
435
            'filename' => $storage->getGenericFile($path, $record->uuid, $record->filename),
704 stevensc 436
            'date' => $timeElapsedString,
710 stevensc 437
            'abuse_report_url' => $abuseReportUrl,
704 stevensc 438
        ];
439
    }
440
 
441
    /**
442
     * Construye los datos de un mensaje reportado
443
     */
444
    private function buildReportedMessageData($record, $senderData, $receiverData, $timeElapsedString)
445
    {
446
        return [
447
            'uuid' => $record->uuid,
448
            'sender_name' => $senderData['name'],
449
            'sender_image' => $senderData['image_url'],
450
            'sender_profile' => $senderData['profile_url'],
451
            'receiver_name' => $receiverData['name'],
452
            'receiver_image' => $receiverData['image_url'],
453
            'receiver_profile' => $receiverData['profile_url'],
711 stevensc 454
            'side' => 'left',
704 stevensc 455
            'message' => 'LABEL_ABUSE_CONTENT_REPORTED',
456
            'type' => Message::TYPE_TEXT,
457
            'filename' => '',
458
            'date' => $timeElapsedString,
459
            'url_abuse_report' => '', // Ya no se puede reportar
460
        ];
461
    }
462
 
307 www 463
    public function sendMessageAction()
1 efrain 464
    {
589 ariadna 465
        // Verificar que la petición sea POST
1 efrain 466
        $request = $this->getRequest();
705 stevensc 467
 
589 ariadna 468
        if (!$request->isPost()) {
469
            return new JsonModel([
470
                'success' => false,
471
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
472
            ]);
473
        }
307 www 474
 
589 ariadna 475
        // Obtener el usuario actual
476
        $currentUserPlugin = $this->plugin('currentUserPlugin');
477
        $currentUser = $currentUserPlugin->getUser();
307 www 478
 
589 ariadna 479
        // Obtener la fecha actual de la base de datos
480
        $userMapper = UserMapper::getInstance($this->adapter);
481
        $now = $userMapper->getDatebaseNow();
582 ariadna 482
 
589 ariadna 483
        // Validar el ID del destinatario
684 stevensc 484
        $uuid = $this->params()->fromRoute('uuid');
485
        if (!$uuid) {
589 ariadna 486
            return new JsonModel([
487
                'success' => false,
488
                'data' => 'ERROR_PARAMETERS_ARE_INVALID'
489
            ]);
490
        }
307 www 491
 
589 ariadna 492
        // Buscar el usuario destinatario
684 stevensc 493
        $user = $userMapper->fetchOneByUuidAndNetworkId($uuid, $currentUser->network_id);
589 ariadna 494
        if (!$user) {
495
            return new JsonModel([
496
                'success' => false,
497
                'data' => 'ERROR_REQUEST_IS_INVALID'
498
            ]);
499
        }
307 www 500
 
589 ariadna 501
        // Combinar datos POST y archivos
502
        $data = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
307 www 503
 
589 ariadna 504
        // Validar los datos del formulario
505
        $form = new SendForm();
506
        $form->setData($data);
582 ariadna 507
 
589 ariadna 508
        if (!$form->isValid()) {
509
            // Si el formulario no es válido, devolver los errores
510
            $messages = [];
511
            $form_messages = (array) $form->getMessages();
512
            foreach ($form_messages as $fieldname => $field_messages) {
513
                $messages[$fieldname] = array_values($field_messages);
307 www 514
            }
589 ariadna 515
            return new JsonModel([
516
                'success' => false,
517
                'data' => $messages
518
            ]);
519
        }
582 ariadna 520
 
589 ariadna 521
        // Obtener los datos validados
522
        $dataPost = (array) $form->getData();
307 www 523
 
589 ariadna 524
        // Buscar o crear la conversación
525
        $conversationMapper = ConversationMapper::getInstance($this->adapter);
526
        $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
307 www 527
 
589 ariadna 528
        if ($conversation) {
529
            // Actualizar estado de la conversación existente
530
            $conversation->receiver_status = Conversation::STATUS_NORMAL;
531
            $conversation->sender_status = Conversation::STATUS_NORMAL;
307 www 532
 
589 ariadna 533
            if (!$conversationMapper->update($conversation)) {
534
                return new JsonModel([
535
                    'success' => false,
536
                    'data' => $conversationMapper->getError()
537
                ]);
538
            }
539
        } else {
540
            // Crear nueva conversación
541
            $conversation = new Conversation();
542
            $conversation->sender_id = $currentUser->id;
543
            $conversation->sender_status = Conversation::STATUS_NORMAL;
544
            $conversation->receiver_id = $user->id;
545
            $conversation->receiver_status = Conversation::STATUS_NORMAL;
582 ariadna 546
 
589 ariadna 547
            if (!$conversationMapper->insert($conversation)) {
548
                return new JsonModel([
549
                    'success' => false,
550
                    'data' => $conversationMapper->getError()
551
                ]);
552
            }
553
        }
705 stevensc 554
        // Storage
555
        $storage = Storage::getInstance($this->config, $this->adapter);
556
        $storage->setFiles($request->getFiles()->toArray());
557
        $path = $storage->getPathMessage();
307 www 558
 
705 stevensc 559
        // Determinar el tipo de archivo
589 ariadna 560
        $type = Message::TYPE_TEXT;
705 stevensc 561
        if($storage->setCurrentFilename('file')){
562
            $tmp_filename = $storage->getTmpFilename();
563
            $type = $storage->getFileType();
589 ariadna 564
        }
307 www 565
 
589 ariadna 566
        // Crear y guardar el mensaje
567
        $message = new Message();
568
        $message->conversation_id = $conversation->id;
569
        $message->read = Message::NO;
570
        $message->message = $type == Message::TYPE_TEXT ? $dataPost['message'] : '';
571
        $message->receiver_id = $user->id;
572
        $message->receiver_status = Message::STATUS_NORMAL;
573
        $message->sender_id = $currentUser->id;
574
        $message->sender_status = Message::STATUS_NORMAL;
575
        $message->type = $type;
307 www 576
 
589 ariadna 577
        $messageMapper = MessageMapper::getInstance($this->adapter);
578
        if (!$messageMapper->insert($message)) {
579
            return new JsonModel([
580
                'success' => false,
581
                'data' => $messageMapper->getError()
582
            ]);
583
        }
307 www 584
 
713 stevensc 585
        $message = $messageMapper->fetchOne($message->id);
589 ariadna 586
        // Procesar archivo adjunto si existe
705 stevensc 587
        if ($tmp_filename) {
588
            $filename = 'inmail_message_' . $message->uuid . '.' . $storage->getExtension();
589
            $target_filename = $storage->composePathToFilename(Storage::TYPE_MESSAGE, $message->uuid, $filename);
307 www 590
 
705 stevensc 591
            if (!$storage->uploadImageWithOutChangeSize($tmp_filename, $target_filename)) {
589 ariadna 592
                return new JsonModel([
593
                    'success' => false,
705 stevensc 594
                    'data' => 'ERROR_UPLOAD_FILE'
589 ariadna 595
                ]);
596
            }
307 www 597
 
705 stevensc 598
            $message->filename = $filename;
589 ariadna 599
            if (!$messageMapper->update($message)) {
1 efrain 600
                return new JsonModel([
589 ariadna 601
                    'success' => false,
602
                    'data' => $messageMapper->getError()
1 efrain 603
                ]);
604
            }
605
        }
589 ariadna 606
 
607
        // Actualizar última actividad del usuario
608
        $userMapper->updateLastActivity($currentUser->id);
609
 
705 stevensc 610
        // Preparar datos para la respuesta
611
        $sender_image = $storage->getUserImage($currentUser);
612
        $receiver_image = $storage->getUserImage($user);
613
        $filename =  $storage->getGenericFile($path, $message->uuid, $message->filename);
614
        $sender_profile = $this->url()->fromRoute('profile/view', ['id' => $currentUser->uuid]);
615
        $receiver_profile = $this->url()->fromRoute('profile/view', ['id' => $user->uuid]);
616
 
589 ariadna 617
        // Devolver respuesta exitosa con datos del mensaje
618
        return new JsonModel([
619
            'success' => true,
620
            'data' => [
621
                'sender_name' => trim($currentUser->first_name . ' ' . $currentUser->last_name),
705 stevensc 622
                'sender_image' => $sender_image,
623
                'sender_profile' => $sender_profile,
589 ariadna 624
                'receiver_name' => trim($user->first_name . ' ' . $user->last_name),
705 stevensc 625
                'receiver_image' => $receiver_image,
626
                'receiver_profile' => $receiver_profile,
711 stevensc 627
                'side' => 'right',
589 ariadna 628
                'message' => $message->message,
629
                'type' => $message->type,
630
                'filename' => $filename,
631
                'date' => $this->timeAgo($now, $now),
632
            ]
633
        ]);
1 efrain 634
    }
307 www 635
 
636
    private function timeAgo($timestamp, $now = '')
637
    {
582 ariadna 638
 
307 www 639
        if ($now) {
640
            $datetime1 = \DateTime::createFromFormat('Y-m-d H:i:s', $now);
1 efrain 641
        } else {
307 www 642
            $now = date('Y-m-d H:i:s');
643
            $datetime1 = date_create($now);
1 efrain 644
        }
307 www 645
        $datetime2 = date_create($timestamp);
582 ariadna 646
 
307 www 647
        $diff = date_diff($datetime1, $datetime2);
648
        $timemsg = '';
649
        if ($diff->y > 0) {
582 ariadna 650
            $timemsg = $diff->y . ' ' . ($diff->y > 1 ? $this->translator->translate('LABEL_YEARS_SMALL')  : $this->translator->translate('LABEL_YEAR_SMALL'));
307 www 651
        } else if ($diff->m > 0) {
582 ariadna 652
            $timemsg = $diff->m  . ' ' . ($diff->m > 1 ? $this->translator->translate('LABEL_MONTHS_SMALL')  : $this->translator->translate('LABEL_MONTH_SMALL'));
307 www 653
        } else if ($diff->d > 0) {
582 ariadna 654
            $timemsg = $diff->d . ' ' . ($diff->d > 1 ? $this->translator->translate('LABEL_DAYS_SMALL')  : $this->translator->translate('LABEL_DAY_SMALL'));
307 www 655
        } else if ($diff->h > 0) {
582 ariadna 656
            $timemsg = $diff->h  . ' ' . ($diff->h > 1 ? $this->translator->translate('LABEL_HOURS_SMALL')  : $this->translator->translate('LABEL_HOUR_SMALL'));
307 www 657
        } else if ($diff->i > 0) {
582 ariadna 658
            $timemsg = $diff->i  . ' ' . ($diff->i > 1 ? $this->translator->translate('LABEL_MINUTES_SMALL')  : $this->translator->translate('LABEL_MINUTE_SMALL'));
307 www 659
        } else if ($diff->s > 0) {
582 ariadna 660
            $timemsg = $diff->s  . ' ' . ($diff->s > 1 ? $this->translator->translate('LABEL_SECONDS_SMALL')  : $this->translator->translate('LABEL_SECOND_SMALL'));
307 www 661
        }
662
        if (!$timemsg) {
582 ariadna 663
            $timemsg = $this->translator->translate('LABEL_NOW');
307 www 664
        } else {
582 ariadna 665
            $timemsg = $this->translator->translate('LABEL_AGO_SMALL') . ' ' . $timemsg . '';
307 www 666
        }
667
        return $timemsg;
1 efrain 668
    }
307 www 669
 
684 stevensc 670
    public function deleteMessageAction()
1 efrain 671
    {
672
        $request = $this->getRequest();
673
        if ($request->isPost()) {
674
            $currentUserPlugin = $this->plugin('currentUserPlugin');
675
            $currentUser = $currentUserPlugin->getUser();
582 ariadna 676
 
684 stevensc 677
            $uuid = $this->params()->fromRoute('uuid');
678
            if (!$uuid) {
1 efrain 679
                return new JsonModel([
680
                    'success' => false,
681
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
682
                ]);
683
            }
582 ariadna 684
 
307 www 685
            $userMapper = UserMapper::getInstance($this->adapter);
684 stevensc 686
            $user = $userMapper->fetchOneByUuid($uuid);
1 efrain 687
            if (!$user) {
688
                return new JsonModel([
689
                    'success' => false,
690
                    'data' => 'ERROR_REQUEST_IS_INVALID'
691
                ]);
692
            }
582 ariadna 693
 
307 www 694
            $conversationMapper = ConversationMapper::getInstance($this->adapter);
695
            $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
582 ariadna 696
 
697
 
307 www 698
            if ($conversation) {
582 ariadna 699
 
307 www 700
                if ($conversation->sender_id == $currentUser->id && $conversation->receiver_id == $user->id) {
701
                    $conversation->sender_status = Conversation::STATUS_DELETED;
702
                    if ($conversationMapper->update($conversation)) {
703
                        $response = [
704
                            'success' => true,
705
                            'data' => 'LABEL_CONVERSATION_WAS_DELETED'
706
                        ];
707
                    } else {
582 ariadna 708
 
709
 
307 www 710
                        $response = [
711
                            'success' => false,
712
                            'data' => $conversationMapper->getError()
713
                        ];
291 www 714
                    }
307 www 715
                }
582 ariadna 716
 
307 www 717
                if ($conversation->receiver_id == $currentUser->id && $conversation->sender_id == $user->id) {
718
                    $conversation->receiver_status = Conversation::STATUS_DELETED;
719
                    if ($conversationMapper->update($conversation)) {
720
                        $response = [
721
                            'success' => true,
722
                            'data' => 'LABEL_CONVERSATION_WAS_DELETED'
723
                        ];
291 www 724
                    } else {
582 ariadna 725
 
726
 
307 www 727
                        $response = [
728
                            'success' => false,
729
                            'data' => $conversationMapper->getError()
730
                        ];
1 efrain 731
                    }
732
                }
582 ariadna 733
 
307 www 734
                return new JsonModel($response);
1 efrain 735
            } else {
307 www 736
                $response = [
737
                    'success' => false,
738
                    'data' => 'ERROR_CONVERSATION_NOT_FOUND'
739
                ];
1 efrain 740
            }
582 ariadna 741
 
307 www 742
            return new JsonModel($response);
1 efrain 743
        } else {
307 www 744
            $response = [
1 efrain 745
                'success' => false,
746
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
307 www 747
            ];
1 efrain 748
        }
582 ariadna 749
 
307 www 750
        return new JsonModel($response);
1 efrain 751
    }
752
}