Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 16766 | Rev 16769 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
16766 efrain 1
<?php
2
declare(strict_types=1);
3
 
4
namespace LeadersLinked\Controller;
5
 
6
use Laminas\Db\Adapter\AdapterInterface;
16768 efrain 7
 
16766 efrain 8
use Laminas\Mvc\Controller\AbstractActionController;
9
use Laminas\Log\LoggerInterface;
10
use Laminas\View\Model\ViewModel;
11
use LeadersLinked\Mapper\UserMapper;
12
use LeadersLinked\Mapper\CompanyMapper;
13
use LeadersLinked\Mapper\CompanyUserMapper;
14
use LeadersLinked\Mapper\ConversationMapper;
15
use LeadersLinked\Mapper\MessageMapper;
16
use LeadersLinked\Model\Conversation;
17
use LeadersLinked\Library\Image;
18
use Laminas\View\Model\JsonModel;
19
use LeadersLinked\Form\InMail\SendForm;
20
use LeadersLinked\Model\Message;
21
use LeadersLinked\Model\VideoConvert;
22
use LeadersLinked\Mapper\VideoConvertMapper;
23
use LeadersLinked\Form\InMail\StartConversationForm;
24
use Laminas\I18n\Translator\Translator;
25
use LeadersLinked\Library\Functions;
26
 
27
class InMailPersonalController extends AbstractActionController
28
{
29
    /**
30
     *
31
     * @var AdapterInterface
32
     */
33
    private $adapter;
34
 
35
    /**
36
     *
37
     * @var  LoggerInterface
38
     */
39
    private $logger;
40
 
41
 
42
    /**
43
     *
44
     * @var array
45
     */
46
    private $config;
47
 
48
    /**
49
     *
50
     * @var Translator
51
     */
52
    private $translator;
53
 
54
    /**
55
     *
56
     * @param AdapterInterface $adapter
57
     * @param LoggerInterface $logger
58
     * @param Translator $translator
59
     * @param array $config
60
     */
16768 efrain 61
    public function __construct($adapter,$logger,  $config, $translator)
16766 efrain 62
    {
63
        $this->adapter      = $adapter;
64
        $this->logger       = $logger;
65
        $this->config       = $config;
66
        $this->translator = $translator;
67
    }
68
 
69
    /**
70
     *
71
     * Generación del listado de conversationes
72
     *
73
     * [
74
     *  success: true,
75
     *  data:[
76
     *    [
77
     *       uuid: uuid con quien se tiene la conversación,
78
     *       name: nombre de con quien se tiene la conversacion,
79
     *       image: imagen de con quien se tiene la conversación,
80
     *       profile: url del profile con quien se tiene la conversación,
81
     *       last_message: fecha del ultimo mensaje,
82
     *       count_unread: cantidad de mensajes sin leer,
83
     *       messages_link: url para recuperar los mensajes,
84
     *       send_link: url para enviar el mensaje,
85
     *       selected: 0 = no seleccionado, 1 = seleccionado
86
     *     ]
87
     *  ]
88
     *
89
     *
90
     * @return \Laminas\View\Model\JsonModel
91
     */
92
    public function indexAction()
93
    {
94
        $request = $this->getRequest();
95
        if ($request->isGet()) {
96
            $currentUserPlugin = $this->plugin('currentUserPlugin');
97
            $currentUser = $currentUserPlugin->getUser();
98
 
99
 
100
 
101
            $headers  = $request->getHeaders();
102
 
103
            $isJson = false;
104
            if ($headers->has('Accept')) {
105
                $accept = $headers->get('Accept');
106
 
107
                $prioritized = $accept->getPrioritized();
108
 
109
                foreach ($prioritized as $key => $value) {
110
                    $raw = trim($value->getRaw());
111
 
112
                    if (!$isJson) {
113
                        $isJson = strpos($raw, 'json');
114
                    }
115
                }
116
            }
117
 
118
            //$isJson = true;
119
            if ($isJson) {
120
                $search         = Functions::sanitizeFilterString($this->params()->fromQuery('search'));
121
                $conversation_id = Functions::sanitizeFilterString($this->params()->fromQuery('conversation_id'));
122
                $last_message   = Functions::sanitizeFilterString($this->params()->fromQuery('last_message'));
123
 
124
                $userMapper = UserMapper::getInstance($this->adapter);
125
                $now = $userMapper->getDatebaseNow();
126
 
127
                $conversationMapper = ConversationMapper::getInstance($this->adapter);
128
                $messageMapper = MessageMapper::getInstance($this->adapter);
129
 
130
                $conversations = [];
131
                $messages = [];
132
 
133
                if($conversation_id ) {
134
 
135
                    $companyMapper = CompanyMapper::getInstance($this->adapter);
136
                    $company = $companyMapper->fetchOneByUuid($conversation_id);
137
                    if ($company) {
138
 
139
 
140
                        $companyUserMapper = CompanyUserMapper::getInstance($this-> adapter);
141
                        $companyUser = $companyUserMapper->fetchOwnerByCompanyId($company->id);
142
                        $user  = $userMapper->fetchOne($companyUser->user_id);
143
 
144
 
145
                        $conversation_id = $user->id;
146
                        $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
147
 
148
 
149
                        $lastMessage = '';
150
                        $timeElapsedString = '';
151
                        if ($conversation) {
152
                            $unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($conversation->id, $currentUser->id);
153
                            $lastMessage = $messageMapper->fetchLastMessageByConversation($conversation->id);
154
 
155
                            if ($lastMessage) {
156
                                $timeElapsedString =  $this->timeAgo($lastMessage, $now);
157
                            } else {
158
                                $lastMessage = '';
159
                            }
160
                        } else {
161
                            $unread = 0;
162
                        }
163
 
164
 
165
                        array_push($conversations, [
166
                            'uuid' => $company->uuid,
167
                            'name' => $company->name,
168
                            'image' => $this->url()->fromRoute('storage', ['type' => 'company', 'code' => $company->uuid, 'filename' => $company->image]),
169
                            'profile' => '', // $this->url()->fromRoute('company/view', ['id' => $company->uuid]),
170
                            'last_message' => $timeElapsedString,
171
                            'datetime_last_message' => $lastMessage,
172
                            'count_unread' => $unread,
173
                            'messages_link' => $this->url()->fromRoute('inmail-personal/messages', ['id' => $user->uuid]),
174
                            'send_link' => $this->url()->fromRoute('inmail-personal/messages/send', ['id' => $user->uuid]),
175
                            'selected' => 1,
176
                            'delete_link' => $this->url()->fromRoute('inmail-personal/delete',  ['id' => $user->uuid]),
177
                        ]);
178
                    } else {
179
                        $user = $userMapper->fetchOneByUuid($conversation_id);
180
                        if ($user) {
181
 
182
                            $lastMessage = '';
183
                            $timeElapsedString = '';
184
 
185
                            $conversation_id = $user->id;
186
                            $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
187
                            if ($conversation) {
188
                                $unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($conversation->id, $currentUser->id);
189
                                $lastMessage = $messageMapper->fetchLastMessageByConversation($conversation->id);
190
                                if ($lastMessage) {
191
                                    $timeElapsedString =  $this->timeAgo($lastMessage, $now);
192
                                } else {
193
 
194
                                    $lastMessage = '';
195
                                }
196
                            } else {
197
                                $unread = 0;
198
                            }
199
 
200
 
201
                            array_push($conversations, [
202
                                'uuid' => $user->uuid,
203
                                'name' => trim($user->first_name . ' ' . $user->last_name),
204
                                'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]),
205
                                'profile' => '', //$this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
206
                                'last_message' => $timeElapsedString,
207
                                'datetime_last_message' => $lastMessage,
208
                                'count_unread' => $unread,
209
                                'messages_link' => $this->url()->fromRoute('inmail-personal/messages', ['id' => $user->uuid]),
210
                                'send_link' => $this->url()->fromRoute('inmail-personal/messages/send', ['id' => $user->uuid]),
211
                                'selected' => 1,
212
                                'delete_link' => $this->url()->fromRoute('inmail-personal/delete',  ['id' => $user->uuid]),
213
                            ]);
214
                        }
215
                    }
216
 
217
                    if($user) {
218
                        $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
219
                        if(!$conversation) {
220
                            $conversation = new Conversation();
221
                            $conversation->sender_id = $currentUser->id;
222
                            $conversation->sender_status = Conversation::STATUS_NORMAL;
223
                            $conversation->receiver_id = $user->id;
224
                            $conversation->receiver_status = Conversation::STATUS_NORMAL;
225
                            $conversationMapper->insert($conversation);
226
                        }
227
 
228
 
229
                        $message = $messageMapper->fetchOneByUuid( $last_message);
230
                        if($message && $message->conversation_id == $conversation_id) {
231
                            $message_id = $message->id;
232
                        } else {
233
                            $message_id = 0;
234
                        }
235
 
236
                        $records = $messageMapper->fetchBatchMessagesByConversationIdAndGreaterThanMessageId($conversation->id, $message_id);
237
                        foreach ($records as $record)
238
                        {
239
                            $timeElapsedString = $this->timeAgo($record->added_on, $now);
240
 
241
 
242
                            if ($record->sender_id == $currentUser->id) {
243
                                array_push($messages, [
244
                                    'uuid' => $record->uuid,
245
                                    'sender_name' => trim($currentUser->first_name . ' ' . $currentUser->last_name),
246
                                    'sender_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $currentUser->image, 'code' => $currentUser->uuid]),
247
                                    'sender_profile' =>'', // $this->url()->fromRoute('profile/view', ['id' => $currentUser->uuid]),
248
                                    'receiver_name' => trim($user->first_name . ' ' . $user->last_name),
249
                                    'receiver_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $user->image, 'code' => $user->uuid]),
250
                                    'receiver_profile' => '', //$this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
251
                                    'side' => 'left',
252
                                    'message' => $record->message,
253
                                    'type' => $record->type,
254
                                    'filename' => $record->filename ? $this->url()->fromRoute('storage', ['type' => 'message', 'filename' => $record->filename, 'code' => $record->uuid]) : '',
255
                                    'date' => $timeElapsedString
256
                                ]);
257
                            } else {
258
 
259
 
260
 
261
                                array_push($messages, [
262
                                    'uuid' => $record->uuid,
263
                                    'sender_name' => trim($user->first_name . ' ' . $user->last_name),
264
                                    'sender_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $user->image, 'code' => $user->uuid]),
265
                                    'sender_profile' => '', // $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
266
                                    'receiver_name' => trim($currentUser->first_name . ' ' . $currentUser->last_name),
267
                                    'receiver_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $currentUser->image, 'code' => $user->uuid]),
268
                                    'receiver_profile' => '', //$this->url()->fromRoute('profile/view', ['id' => $currentUser->uuid]),
269
                                    'side' => 'right',
270
                                    'message' => $record->message,
271
                                    'type' => $record->type,
272
                                    'filename' => $record->filename ? $this->url()->fromRoute('storage', ['type' => 'message', 'filename' => $record->filename, 'code' => $record->uuid]) : '',
273
                                    'date' => $timeElapsedString
274
                                ]);
275
 
276
                                $messageMapper->markAsRead($record->id);
277
                            }
278
                        }
279
                    }
280
                }
281
 
282
 
283
                $records = $conversationMapper->fetchAllByUserId($currentUser->id);
284
                foreach ($records as $record)
285
                {
286
                    if ($conversation_id) {
287
                        if ($record->sender_id == $currentUser->id && $record->receiver_id == $conversation_id) {
288
                            continue;
289
                        }
290
                        if ($record->receiver_id == $currentUser->id && $record->sender_id == $conversation_id) {
291
                            continue;
292
                        }
293
                    }
294
 
295
                    if ($record->sender_id == $currentUser->id) {
296
                        $user = $userMapper->fetchOne($record->receiver_id);
297
 
298
 
299
 
300
                    }
301
                    if ($record->receiver_id == $currentUser->id) {
302
                        $user = $userMapper->fetchOne($record->sender_id);
303
                    }
304
 
305
 
306
                    $username = trim($user->first_name . ' ' . $user->last_name);
307
 
308
                    if($search) {
309
 
310
 
311
                        if(strpos($username, $search) === false && strpos($user->email, $search) === false) {
312
 
313
                            continue;
314
                        }
315
 
316
                    }
317
 
318
                    $timeElapsedString = '';
319
 
320
 
321
                    $unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($record->id, $currentUser->id);
322
                    $lastMessage = $messageMapper->fetchLastMessageByConversation($record->id);
323
 
324
 
325
                    if ($lastMessage) {
326
                        $timeElapsedString =  $this->timeAgo($lastMessage, $now);
327
                    } else {
328
                        $lastMessage = '';
329
                    }
330
 
331
                    array_push($conversations, [
332
                        'uuid' => $user->uuid,
333
                        'name' => $username,
334
                        'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]),
335
                        'profile' => '', //$this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
336
                        'last_message' => $timeElapsedString,
337
                        'datetime_last_message' => $lastMessage,
338
                        'count_unread' => $unread,
339
                        'messages_link' => $this->url()->fromRoute('inmail-personal/messages', ['id' => $user->uuid]),
340
                        'send_link' => $this->url()->fromRoute('inmail-personal/messages/send', ['id' => $user->uuid]),
341
                        'selected' => $conversation_id == $user->id ? 1 : 0,
342
                        'delete_link' => $this->url()->fromRoute('inmail-personal/delete',  ['id' => $user->uuid]),
343
                    ]);
344
                }
345
 
346
 
347
                usort($conversations, function ($a, $b) {
348
                    if ($a['selected'] == $b['selected']) {
349
                       return $a['datetime_last_message'] < $b['datetime_last_message'] ? 1 : -1;
350
                    } else {
351
                        return $a['selected'] < $b['selected'] ? 1 : 0;
352
                    }
353
                });
354
 
355
 
356
                return new JsonModel([
357
                    'success' => true,
358
                    'data' => [
359
                        'conversations' => $conversations,
360
                        'messages' => $messages,
361
 
362
                    ],
363
                ]);
364
            } else {
365
                $this->layout()->setTemplate('layout/layout-backend');
366
                $viewModel = new ViewModel();
367
                $viewModel->setTemplate('leaders-linked/inmail/personal.phtml');
368
                return $viewModel;
369
            }
370
        } else {
371
            return new JsonModel([
372
                'success' => false,
373
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
374
            ]);
375
        }
376
    }
377
 
378
    public function startConversationAction()
379
    {
380
        $request = $this->getRequest();
381
        if ($request->isPost()) {
382
            $currentUserPlugin = $this->plugin('currentUserPlugin');
383
            $currentUser = $currentUserPlugin->getUser();
384
 
385
            $userMapper = UserMapper::getInstance($this->adapter);
386
            $now = $userMapper->getDatebaseNow();
387
 
388
 
389
            $id = Functions::sanitizeFilterString($this->params()->fromPost('id'));
390
            if (!$id) {
391
                return new JsonModel([
392
                    'success' => false,
393
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
394
                ]);
395
            }
396
 
397
 
398
            $user = $userMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
399
            if (!$user) {
400
                return new JsonModel([
401
                    'success' => false,
402
                    'data' => 'ERROR_REQUEST_IS_INVALID'
403
                ]);
404
            }
405
 
406
 
407
            $conversationMapper = ConversationMapper::getInstance($this->adapter);
408
            $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
409
            if(!$conversation) {
410
                $conversation = new Conversation();
411
                $conversation->sender_id = $currentUser->id;
412
                $conversation->sender_status = Conversation::STATUS_NORMAL;
413
                $conversation->receiver_id = $user->id;
414
                $conversation->receiver_status = Conversation::STATUS_NORMAL;
415
                $conversationMapper->insert($conversation);
416
            } else {
417
                if($conversation->sender_id == $currentUser->id) {
418
                    $conversation->sender_status = Conversation::STATUS_NORMAL;
419
                } else {
420
                    $conversation->sender_status = Conversation::STATUS_NORMAL;
421
                }
422
                $conversationMapper->update($conversation);
423
            }
424
 
425
            $timeElapsedString = '';
426
 
427
 
428
            $messageMapper = MessageMapper::getInstance($this->adapter);
429
            $unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($conversation->id, $currentUser->id);
430
            $lastMessage = $messageMapper->fetchLastMessageByConversation($conversation->id);
431
 
432
 
433
            if ($lastMessage) {
434
                $timeElapsedString =  $this->timeAgo($lastMessage, $now);
435
            } else {
436
                $lastMessage = '';
437
            }
438
 
439
            return new JsonModel([
440
                'success' => true,
441
                'data' => [
442
                    'uuid' => $user->uuid,
443
                    'name' => trim($user->first_name . ' ' . $user->last_name),
444
                    'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]),
445
                    'profile' => '', //$this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
446
                    'last_message' => $timeElapsedString,
447
                    'datetime_last_message' => $lastMessage,
448
                    'count_unread' => $unread,
449
                    'messages_link' => $this->url()->fromRoute('inmail-personal/messages', ['id' => $user->uuid]),
450
                    'send_link' => $this->url()->fromRoute('inmail-personal/messages/send', ['id' => $user->uuid]),
451
                    'selected' => 1,
452
                    'delete_link' => $this->url()->fromRoute('inmail-personal/delete',  ['id' => $user->uuid]),
453
                ]
454
 
455
            ]);
456
 
457
 
458
 
459
 
460
        } else {
461
            return new JsonModel([
462
                'success' => false,
463
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
464
            ]);
465
        }
466
    }
467
 
468
 
469
    /**
470
     * Esta función remueve el usuario del grupo
471
     * Es una petición GET el url recuperado en /inmail
472
     * [ruta del servidor]/inmail-personal/[uuid]/message
473
     * retorna un json en caso de ser  positivo
474
     * [
475
     *   success: true,
476
     *      data: [
477
     *          [
478
     *              sender_name: nombre de quien que envia el mensaje,
479
     *              sender_image: imagen de quien que recibe el mensaje,
480
     *              sender_profile: url de profile de quien que envia el mensaje,
481
     *              receiver_name: nombre de quien que recibe el mensaje,
482
     *              receiver_image: url de la imagen de quien  que recibe el mensaje,
483
     *              receiver_profile: url del profile de quien recibe el mensaje,
484
     *              side: left/righ de que lado de la pantalla se mostrara,
485
     *              message: texto del mensaje,
486
     *              type: text|image|video|document,
487
     *              filename: url del archivo enviado,
488
     *              date: cadena que describe hace cuanto se recibio el mensaje
489
     *          ]
490
     *      ]
491
     *   ]
492
     * En caso de ser negativo puede haber 2 formatos
493
     * [
494
     *  'success' : false,
495
     *  'data' : mensaje de error
496
     * ]
497
     * @return \Laminas\View\Model\JsonModel
498
     */
499
    public function messageAction()
500
    {
501
 
502
 
503
        $request = $this->getRequest();
504
        if ($request->isGet()) {
505
            $currentUserPlugin = $this->plugin('currentUserPlugin');
506
            $currentUser = $currentUserPlugin->getUser();
507
 
508
            $userMapper = UserMapper::getInstance($this->adapter);
509
            $now = $userMapper->getDatebaseNow();
510
 
511
            $conversationMapper = ConversationMapper::getInstance($this->adapter);
512
 
513
            $messageMapper = MessageMapper::getInstance($this->adapter);
514
 
515
 
516
            $type   = Functions::sanitizeFilterString($this->params()->fromQuery('type', ''));
517
            if(!in_array($type, ['first','changes', 'older'])) {
518
                $type = 'first';
519
            }
520
 
521
            $id = $this->params()->fromRoute('id');
522
            if (!$id) {
523
                return new JsonModel([
524
                    'success' => false,
525
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
526
                ]);
527
            }
528
 
529
            $user = $userMapper->fetchOneByUuid($id);
530
            if (!$user) {
531
                return new JsonModel([
532
                    'success' => false,
533
                    'data' => 'ERROR_REQUEST_IS_INVALID'
534
                ]);
535
            }
536
 
537
 
538
 
539
            $first_message = Functions::sanitizeFilterString($this->params()->fromQuery('first_message'));
540
            $last_message = Functions::sanitizeFilterString($this->params()->fromQuery('last_message'));
541
 
542
 
543
 
544
            $conversationMapper = ConversationMapper::getInstance($this->adapter);
545
            $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
546
            if(!$conversation) {
547
                $conversation = new Conversation();
548
                $conversation->sender_id = $currentUser->id;
549
                $conversation->sender_status = Conversation::STATUS_NORMAL;
550
                $conversation->receiver_id = $user->id;
551
                $conversation->receiver_status = Conversation::STATUS_NORMAL;
552
                $conversationMapper->insert($conversation);
553
            }
554
 
555
 
556
            $messages = [];
557
            if ($conversation) {
558
 
559
                switch($type)
560
                {
561
                    case 'older' :
562
                        $message = $messageMapper->fetchOneByUuid( $first_message);
563
                        if($message && $message->conversation_id == $conversation->id) {
564
                            $message_id = $message->id;
565
                        } else {
566
                            $message_id = 0;
567
                        }
568
                        $records = $messageMapper->fetchBatchMessagesByConversationIdAndLessThanMessageId($conversation->id, $message_id);
569
                        $count  = $messageMapper->fetchCountMessagesByConversationIdAndLessThanMessageId($conversation->id, $message_id) - count( $records );
570
                        break;
571
 
572
                    case 'changes' :
573
                        $message = $messageMapper->fetchOneByUuid( $last_message);
574
                        if($message && $message->conversation_id == $conversation->id) {
575
                            $message_id = $message->id;
576
                        } else {
577
                            $message_id = 0;
578
                        }
579
                        $records = $messageMapper->fetchBatchMessagesByConversationIdAndGreaterThanMessageId($conversation->id, $message_id);
580
                        $count  = $messageMapper->fetchCountMessagesByConversationIdAndGreaterThanMessageId($conversation->id, $message_id) - count( $records );
581
                        break;
582
 
583
                    default :
584
 
585
                        $records = $messageMapper->fetchBatchMessagesByConversationId($conversation->id);
586
                        $count  = $messageMapper->fetchCountMessagesByConversationId($conversation->id) - count( $records );
587
 
588
                        break;
589
 
590
                }
591
 
592
                foreach ($records as $record)
593
                {
594
                    $timeElapsedString = $this->timeAgo($record->added_on, $now);
595
 
596
 
597
                    if ($record->sender_id == $currentUser->id) {
598
                        array_push($messages, [
599
                            'uuid' => $record->uuid,
600
                            'sender_name' => trim($currentUser->first_name . ' ' . $currentUser->last_name),
601
                            'sender_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $currentUser->image, 'code' => $currentUser->uuid]),
602
                            'sender_profile' =>'', // $this->url()->fromRoute('profile/view', ['id' => $currentUser->uuid]),
603
                            'receiver_name' => trim($user->first_name . ' ' . $user->last_name),
604
                            'receiver_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $user->image, 'code' => $user->uuid]),
605
                            'receiver_profile' => '', //$this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
606
                            'side' => 'left',
607
                            'message' => $record->message,
608
                            'type' => $record->type,
609
                            'filename' => $record->filename ? $this->url()->fromRoute('storage', ['type' => 'message', 'filename' => $record->filename, 'code' => $record->uuid]) : '',
610
                            'date' => $timeElapsedString
611
                        ]);
612
                    } else {
613
 
614
 
615
 
616
                        array_push($messages, [
617
                            'uuid' => $record->uuid,
618
                            'sender_name' => trim($user->first_name . ' ' . $user->last_name),
619
                            'sender_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $user->image, 'code' => $user->uuid]),
620
                            'sender_profile' => '', // $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
621
                            'receiver_name' => trim($currentUser->first_name . ' ' . $currentUser->last_name),
622
                            'receiver_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $currentUser->image, 'code' => $user->uuid]),
623
                            'receiver_profile' => '', //$this->url()->fromRoute('profile/view', ['id' => $currentUser->uuid]),
624
                            'side' => 'right',
625
                            'message' => $record->message,
626
                            'type' => $record->type,
627
                            'filename' => $record->filename ? $this->url()->fromRoute('storage', ['type' => 'message', 'filename' => $record->filename, 'code' => $record->uuid]) : '',
628
                            'date' => $timeElapsedString
629
                        ]);
630
 
631
                        $messageMapper->markAsRead($record->id);
632
                    }
633
                }
634
            }
635
 
636
 
637
            $timeElapsedString = '';
638
            $unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($user->id, $currentUser->id);
639
            $lastMessage = $messageMapper->fetchLastMessageByConversation($user->id);
640
 
641
 
642
            if ($lastMessage) {
643
                $timeElapsedString =  $this->timeAgo($lastMessage, $now);
644
            }
645
 
646
            return new JsonModel([
647
                'success' => true,
648
                'data' => [
649
                    'messages' => $messages,
650
                    'there_olders' => $count > 0,
651
                    'last_message' => $timeElapsedString,
652
                    'datetime_last_message' => $lastMessage,
653
                    'count_unread' => $unread,
654
                ]
655
            ]);
656
        } else {
657
            return new JsonModel([
658
                'success' => false,
659
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
660
            ]);
661
        }
662
    }
663
 
664
    /**
665
     * Esta función envia un mensaje
666
     * Es una petición POST el url recuperado en /inmail
667
     * [ruta del servidor]/inmail-personal/[uidd del usuario]/message/send
668
     * Lo párametros son
669
     * message: text plain requerido
670
     * file: no requerido puede jpg, png, jpeg, mp3, mp4, webm o pdf
671
     * o
672
     * [ruta del servidor]/inmail-personal/[uidd del usuario]/message/send/encoding/base64 para el caso de react-native
673
     * Los párametros son
674
     * message: text plain requerido
675
     * fileBase64Name: nombre del archivo  que se envia en base64 solo requerido si se envia un archivo
676
     * fileBase64Content: contenido en base 64 del archivo
677
     *
678
     * retorna un json en caso de ser  positivo
679
     * [
680
     *   success: true,
681
     *      data:{
682
     *          sender_name: nombre de quien que envia el mensaje,
683
     *          sender_image: imagen de quien que recibe el mensaje,
684
     *          sender_profile: url de profile de quien que envia el mensaje,
685
     *          receiver_name: nombre de quien que recibe el mensaje,
686
     *          receiver_image: url de la imagen de quien  que recibe el mensaje,
687
     *          receiver_profile: url del profile de quien recibe el mensaje,
688
     *          side: left/righ de que lado de la pantalla se mostrara,
689
     *          message: texto del mensaje,
690
     *          type: text|image|video|document,
691
     *          filename: url del archivo enviado,
692
     *          date: cadena que describe hace cuanto se recibio el mensaje
693
     *      ]
694
     *   ]
695
     * En caso de ser negativo puede haber 2 formatos
696
     * [
697
     *  'success' : false,
698
     *  'data' : mensaje de error
699
     * ]
700
     * @return \Laminas\View\Model\JsonModel
701
     */
702
    public function sendMessageAction()
703
    {
704
        $request = $this->getRequest();
705
        if ($request->isPost()) {
706
            $currentUserPlugin = $this->plugin('currentUserPlugin');
707
            $currentUser = $currentUserPlugin->getUser();
708
 
709
            $userMapper = UserMapper::getInstance($this->adapter);
710
            $now = $userMapper->getDatebaseNow();
711
 
712
 
713
            $id = $this->params()->fromRoute('id');
714
            if (!$id) {
715
                return new JsonModel([
716
                    'success' => false,
717
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
718
                ]);
719
            }
720
 
721
 
722
            $user = $userMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
723
            if (!$user) {
724
                return new JsonModel([
725
                    'success' => false,
726
                    'data' => 'ERROR_REQUEST_IS_INVALID'
727
                ]);
728
            }
729
 
730
 
731
            $data = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
732
 
733
            $form = new SendForm();
734
            $form->setData($data);
735
 
736
            if ($form->isValid()) {
737
 
738
                $dataPost = (array) $form->getData();
739
 
740
                $conversationMapper = ConversationMapper::getInstance($this->adapter);
741
                $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
742
 
743
                if ($conversation) {
744
                    $conversation->receiver_status = Conversation::STATUS_NORMAL;
745
                    $conversation->sender_status = Conversation::STATUS_NORMAL;
746
 
747
                    if (!$conversationMapper->update($conversation)) {
748
                        return new JsonModel([
749
                            'success'  => false,
750
                            'data' => $conversationMapper->getError()
751
                        ]);
752
                    }
753
                } else {
754
                    $conversation = new Conversation();
755
                    $conversation->sender_id = $currentUser->id;
756
                    $conversation->sender_status = Conversation::STATUS_NORMAL;
757
                    $conversation->receiver_id = $user->id;
758
                    $conversation->receiver_status = Conversation::STATUS_NORMAL;
759
 
760
                    if (!$conversationMapper->insert($conversation)) {
761
                        return new JsonModel([
762
                            'success'  => false,
763
                            'data' => $conversationMapper->getError()
764
                        ]);
765
                    }
766
                }
767
                $files = $this->getRequest()->getFiles()->toArray();
768
                $type = Message::TYPE_TEXT;
769
 
770
 
771
                if (isset($files['filename']) && empty($files['filename']['error'])) {
772
                    $message_tmp_filename  = $files['filename']['tmp_name'];
773
                    $message_filename      = $this->normalizeString($files['filename']['name']);
774
 
775
                    $mime_type = mime_content_type($message_tmp_filename);
776
 
777
 
778
                    if ($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {
779
                        $type = Message::TYPE_IMAGE;
780
                    } else if ($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {
781
                        $type = Message::TYPE_VIDEO;
782
                    } else if ($mime_type == 'application/pdf') {
783
                        $type = Message::TYPE_DOCUMENT;
784
                    }
785
                }
786
 
787
 
788
 
789
 
790
                $message = new Message();
791
                $message->conversation_id = $conversation->id;
792
                $message->read = Message::NO;
793
                $message->message = $type == Message::TYPE_TEXT ? $dataPost['message'] : '';
794
                $message->receiver_id = $user->id;
795
                $message->receiver_status = Message::STATUS_NORMAL;
796
                $message->sender_id = $currentUser->id;
797
                $message->sender_status = Message::STATUS_NORMAL;
798
                $message->type = $type;
799
 
800
 
801
 
802
 
803
 
804
                $messageMapper = MessageMapper::getInstance($this->adapter);
805
                if ($messageMapper->insert($message)) {
806
 
807
                    $message = $messageMapper->fetchOne($message->id);
808
 
809
 
810
                    if ($type == Message::TYPE_DOCUMENT) {
811
                        try {
812
                            $target_path = $this->config['leaderslinked.fullpath.message'] . DIRECTORY_SEPARATOR . $message->uuid;
813
                            if (!file_exists($target_path)) {
814
                                mkdir($target_path, 0755);
815
                            }
816
 
817
                            $full_filename = $target_path  . DIRECTORY_SEPARATOR . $message_filename;
818
                            /*
819
                            if($encoding == 'base64') {
820
                                $resultMoveOrRename = rename($message_tmp_filename , $full_filename);
821
                            } else {
822
                                $resultMoveOrRename = move_uploaded_file($message_tmp_filename , $full_filename);
823
                            }
824
                            */
825
 
826
                            $resultMoveOrRename = move_uploaded_file($message_tmp_filename, $full_filename);
827
                            if ($resultMoveOrRename) {
828
 
829
                                $message->type = $type;
830
                                $message->filename = basename($message_filename);
831
                                $messageMapper->update($message);
832
                            } else {
833
                                error_log('no se pudo mover o renombrar el documento : ' . $message_tmp_filename . ' al directorio : ' . $full_filename);
834
                            }
835
                        } catch (\Throwable $e) {
836
                            error_log($e->getTraceAsString());
837
                        }
838
                    }
839
                    if ($type == Message::TYPE_IMAGE) {
840
                        try {
841
                            $target_path = $this->config['leaderslinked.fullpath.message'] . DIRECTORY_SEPARATOR . $message->uuid;
842
                            if (!file_exists($target_path)) {
843
                                mkdir($target_path, 0755);
844
                            }
845
 
846
                            list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.message_image_size']);
847
 
848
                            $message_filename = substr($message_filename, 0, strrpos($message_filename, '.'))  . '.png';
849
 
850
                            //echo "target_path = $target_path message_tmp_filename = $message_tmp_filename message_filename = $message_filename"; exit;
851
 
852
                            $crop_to_dimensions = false;
853
                            if (Image::uploadImage($message_tmp_filename, $target_path, $message_filename, $target_width, $target_height, $crop_to_dimensions)) {
854
                                $message->type = $type;
855
                                $message->filename = basename($message_filename);
856
                                $messageMapper->update($message);
857
                            }
858
                        } catch (\Throwable $e) {
859
                            error_log($e->getTraceAsString());
860
                        }
861
                    }
862
                    if ($type == Message::TYPE_VIDEO) {
863
                        try {
864
                            $target_path = $this->config['leaderslinked.fullpath.message'] . DIRECTORY_SEPARATOR . $message->uuid;
865
                            if (!file_exists($target_path)) {
866
                                mkdir($target_path, 0755);
867
                            }
868
 
869
                            $full_filename = $target_path  . DIRECTORY_SEPARATOR . $message_filename;
870
 
871
                            /*
872
                            if($encoding == 'base64') {
873
                                $resultMoveOrRename = rename($message_tmp_filename , $full_filename);
874
                            } else {
875
                                $resultMoveOrRename = move_uploaded_file($message_tmp_filename , $full_filename);
876
                            }*/
877
 
878
                            $resultMoveOrRename = move_uploaded_file($message_tmp_filename, $full_filename);
879
                            if ($resultMoveOrRename) {
880
 
881
                                $size = $this->config['leaderslinked.image_sizes.message_image_size'];
882
                                $getFromSecound = 2;
883
 
884
                                //extracción del cover
885
                                $generateFileName = substr($message_filename, 0, strrpos($message_filename, '.'));
886
                                $generateFile =  $target_path  . DIRECTORY_SEPARATOR . $generateFileName .  '.png';
887
                                $cmd            = "/usr/bin/ffmpeg -i $full_filename -an -ss $getFromSecound -s $size $generateFile";
888
                                exec($cmd);
889
 
890
 
891
                                $message->type = $type;
892
                                $message->filename = basename($message_filename);
893
                                $message->image_preview = basename($generateFile);
894
                                $messageMapper->update($message);
895
 
896
                                $videoConvert = new VideoConvert();
897
                                $videoConvert->filename = $full_filename;
898
                                $videoConvert->type = VideoConvert::TYPE_FEED;
899
 
900
                                $videoConvertMapper = VideoConvertMapper::getInstance($this->adapter);
901
                                $videoConvertMapper->insert($videoConvert);
902
                            } else {
903
                                error_log('no se pudo mover o renombrar el documento : ' . $message_tmp_filename . ' al directorio : ' . $full_filename);
904
                            }
905
                        } catch (\Throwable $e) {
906
                            error_log($e->getTraceAsString());
907
                        }
908
                    }
909
 
910
                    $message = $messageMapper->fetchOne($message->id);
911
 
912
                    if ($message->filename) {
913
                        $filename = $this->url()->fromRoute('storage', ['type' => 'message', 'filename' => $message->filename, 'code' => $message->uuid]);
914
                    } else {
915
                        $filename = '';
916
                    }
917
 
918
                    //$dt = \DateTime::createFromFormat('Y-m-d H:i:s', $message->added_on);
919
 
920
                    $userMapper->updateLastActivity($currentUser->id);
921
 
922
 
923
                    $count = $messageMapper->fetchCountMessagesByConversationId($conversation->id);
924
 
925
                    if($count < 10) {
926
                        $max_page = 1;
927
                    } else {
928
                        $max_page = (int) ($count / 10);
929
                        if($count > ($max_page * 10) ) {
930
                            $max_page++;
931
                        }
932
                    }
933
 
934
 
935
                    return new JsonModel([
936
                        'success'   => true,
937
                        'data'   => [
938
                            'max_page' => $max_page,
939
                            'message' => [
940
                                'uuid' => $message->uuid,
941
                                'sender_name' => trim($currentUser->first_name . ' ' . $currentUser->last_name),
942
                                'sender_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $currentUser->image, 'code' => $currentUser->uuid]),
943
                                'sender_profile' => '', //$this->url()->fromRoute('profile/view', ['id' => $currentUser->uuid]),
944
                                'receiver_name' => trim($user->first_name . ' ' . $user->last_name),
945
                                'receiver_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $user->image, 'code' => $user->uuid]),
946
                                'receiver_profile' => '', //$this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
947
                                'side' => 'left',
948
                                'message' => $message->message,
949
                                'type' => $message->type,
950
                                'filename' => $filename,
951
                                'date' => $this->timeAgo($now, $now),
952
                            ]
953
                        ]
954
                    ]);
955
                } else {
956
                    return new JsonModel([
957
                        'success'   => false,
958
                        'data'   => $messageMapper->getError()
959
                    ]);
960
                }
961
            } else {
962
 
963
                $message = '';
964
                $form_messages = (array) $form->getMessages();
965
                foreach ($form_messages  as $fieldname => $field_messages) {
966
                    $messages = array_values($field_messages);
967
                    $message = array_pop($messages);
968
                }
969
 
970
                return new JsonModel([
971
                    'success'   => false,
972
                    'data'   => $message,
973
                ]);
974
            }
975
        } else {
976
            return new JsonModel([
977
                'success' => false,
978
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
979
            ]);
980
        }
981
    }
982
 
983
 
984
 
985
    private function normalizeString($str = '')
986
    {
987
        $basename  = substr($str, 0, strrpos($str, '.'));
988
        $basename  = str_replace('.', '-', $basename);
989
 
990
        $extension  = substr($str, strrpos($str, '.'));
991
 
992
        $str = $basename . $extension;
993
 
994
        $str = strip_tags($str);
995
        $str = preg_replace('/[\r\n\t ]+/', ' ', $str);
996
        $str = preg_replace('/[\"\*\/\:\<\>\?\'\|\,]+/', ' ', $str);
997
        $str = strtolower($str);
998
        $str = html_entity_decode($str, ENT_QUOTES, "utf-8");
999
        $str = htmlentities($str, ENT_QUOTES, "utf-8");
1000
        $str = preg_replace("/(&)([a-z])([a-z]+;)/i", '$2', $str);
1001
        $str = str_replace(' ', '-', $str);
1002
        $str = rawurlencode($str);
1003
        $str = str_replace('%', '-', $str);
1004
        return trim(strtolower($str));
1005
    }
1006
 
1007
    /**
1008
     *
1009
     * @param string $timestamp
1010
     * @param string $now
1011
     * @return string
1012
     */
1013
    private function timeAgo($timestamp, $now = '')
1014
    {
1015
 
1016
        if ($now) {
1017
            $datetime1 = \DateTime::createFromFormat('Y-m-d H:i:s', $now);
1018
        } else {
1019
            $now = date('Y-m-d H:i:s');
1020
            $datetime1 = date_create($now);
1021
        }
1022
        $datetime2 = date_create($timestamp);
1023
 
1024
        $diff = date_diff($datetime1, $datetime2);
1025
        $timemsg = '';
1026
        if ($diff->y > 0) {
1027
            $timemsg = $diff->y . ' ' .($diff->y > 1 ? $this->translator->translate('LABEL_YEARS_SMALL')  : $this->translator->translate('LABEL_YEAR_SMALL') );
1028
        } else if ($diff->m > 0) {
1029
            $timemsg = $diff->m  . ' ' .($diff->m > 1 ? $this->translator->translate('LABEL_MONTHS_SMALL')  : $this->translator->translate('LABEL_MONTH_SMALL') );
1030
        } else if ($diff->d > 0) {
1031
            $timemsg = $diff->d . ' ' .($diff->d > 1 ? $this->translator->translate('LABEL_DAYS_SMALL')  : $this->translator->translate('LABEL_DAY_SMALL') );
1032
        } else if ($diff->h > 0) {
1033
            $timemsg = $diff->h  . ' ' .($diff->h > 1 ? $this->translator->translate('LABEL_HOURS_SMALL')  : $this->translator->translate('LABEL_HOUR_SMALL') );
1034
        } else if ($diff->i > 0) {
1035
            $timemsg = $diff->i  . ' ' .($diff->i > 1 ? $this->translator->translate('LABEL_MINUTES_SMALL')  : $this->translator->translate('LABEL_MINUTE_SMALL') );
1036
        } else if ($diff->s > 0) {
1037
            $timemsg = $diff->s  . ' ' . ($diff->s > 1 ? $this->translator->translate('LABEL_SECONDS_SMALL')  : $this->translator->translate('LABEL_SECOND_SMALL') );
1038
        }
1039
        if (!$timemsg) {
1040
            $timemsg = $this->translator->translate('LABEL_NOW') ;
1041
        } else {
1042
            $timemsg = $this->translator->translate('LABEL_AGO_SMALL') . ' '. $timemsg . '';
1043
        }
1044
        return $timemsg;
1045
 
1046
    }
1047
 
1048
 
1049
    public function deleteAction()
1050
    {
1051
        $request = $this->getRequest();
1052
        if ($request->isPost()) {
1053
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1054
            $currentUser = $currentUserPlugin->getUser();
1055
 
1056
            $id = $this->params()->fromRoute('id');
1057
            if (!$id) {
1058
                return new JsonModel([
1059
                    'success' => false,
1060
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1061
                ]);
1062
            }
1063
 
1064
            $userMapper = UserMapper::getInstance($this->adapter);
1065
            $user = $userMapper->fetchOneByUuid($id);
1066
            if (!$user) {
1067
                return new JsonModel([
1068
                    'success' => false,
1069
                    'data' => 'ERROR_REQUEST_IS_INVALID'
1070
                ]);
1071
            }
1072
 
1073
            $conversationMapper = ConversationMapper::getInstance($this->adapter);
1074
            $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1075
 
1076
 
1077
            if ($conversation) {
1078
 
1079
                if ($conversation->sender_id == $currentUser->id && $conversation->receiver_id == $user->id) {
1080
                    $conversation->sender_status = Conversation::STATUS_DELETED;
1081
                    if ($conversationMapper->update($conversation)) {
1082
                        $response = [
1083
                            'success' => true,
1084
                            'data' => 'LABEL_CONVERSATION_WAS_DELETED'
1085
                        ];
1086
                    } else {
1087
 
1088
 
1089
                        $response = [
1090
                            'success' => false,
1091
                            'data' => $conversationMapper->getError()
1092
                        ];
1093
                    }
1094
                }
1095
 
1096
                if ($conversation->receiver_id == $currentUser->id && $conversation->sender_id == $user->id) {
1097
                    $conversation->receiver_status = Conversation::STATUS_DELETED;
1098
                    if ($conversationMapper->update($conversation)) {
1099
                        $response = [
1100
                            'success' => true,
1101
                            'data' => 'LABEL_CONVERSATION_WAS_DELETED'
1102
                        ];
1103
                    } else {
1104
 
1105
 
1106
                        $response = [
1107
                            'success' => false,
1108
                            'data' => $conversationMapper->getError()
1109
                        ];
1110
                    }
1111
                }
1112
 
1113
                return new JsonModel($response);
1114
 
1115
            } else {
1116
                $response = [
1117
                    'success' => false,
1118
                    'data' => 'ERROR_CONVERSATION_NOT_FOUND'
1119
                ];
1120
            }
1121
 
1122
            return new JsonModel($response);
1123
        } else {
1124
            $response = [
1125
                'success' => false,
1126
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1127
            ];
1128
        }
1129
 
1130
        return new JsonModel($response);
1131
    }
1132
 
1133
 
1134
 
1135
 
1136
}