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