Proyectos de Subversion LeadersLinked - Backend

Rev

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

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