Proyectos de Subversion LeadersLinked - Backend

Rev

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