Proyectos de Subversion LeadersLinked - Backend

Rev

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

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