Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
1 www 1
<?php
2
declare(strict_types = 1);
3
namespace LeadersLinked\Controller;
4
 
5
use Laminas\Db\Adapter\AdapterInterface;
6
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
7
use Laminas\Mvc\Controller\AbstractActionController;
8
use Laminas\Log\LoggerInterface;
9
use Laminas\View\Model\JsonModel;
10
use Laminas\View\Model\ViewModel;
11
use LeadersLinked\Library\Functions;
12
use LeadersLinked\Mapper\UserMapper;
13
use LeadersLinked\Mapper\ConnectionMapper;
14
use LeadersLinked\Mapper\ChatMessageMapper;
15
use LeadersLinked\Mapper\ChatGroupMapper;
16
use LeadersLinked\Mapper\ChatGroupMessageMapper;
17
use LeadersLinked\Mapper\ChatGroupUserMessageMapper;
18
use LeadersLinked\Mapper\ChatUserMapper;
19
use LeadersLinked\Model\ChatMessage;
20
use LeadersLinked\Model\ChatGroupMessage;
21
use LeadersLinked\Model\ChatGroupUserMessage;
22
use LeadersLinked\Model\Connection;
23
use LeadersLinked\Model\ChatGroup;
24
use LeadersLinked\Model\ChatUser;
25
use LeadersLinked\Form\Chat\CreateGroupForm;
26
use LeadersLinked\Mapper\ChatGroupUserMapper;
27
use LeadersLinked\Model\ChatGroupUser;
28
 
29
 
30
class ChatController extends AbstractActionController
31
{
32
    const SESSION_CHAT_OPEN_BOXES = 'chat_open_boxes';
33
 
34
 
35
    /**
36
     *
37
     * @var AdapterInterface
38
     */
39
    private $adapter;
40
 
41
    /**
42
     *
43
     * @var AbstractAdapter
44
     */
45
    private $cache;
46
 
47
    /**
48
     *
49
     * @var LoggerInterface
50
     */
51
    private $logger;
52
 
53
    /**
54
     *
55
     * @var array
56
     */
57
    private $config;
58
 
59
    /**
60
     *
61
     * @param AdapterInterface $adapter
62
     * @param AbstractAdapter $cache
63
     * @param LoggerInterface $logger
64
     * @param array $config
65
     */
66
    public function __construct($adapter, $cache, $logger, $config)
67
    {
68
        $this->adapter  = $adapter;
69
        $this->cache    = $cache;
70
        $this->logger   = $logger;
71
        $this->config   = $config;
72
 
73
 
74
        if(!isset($_SESSION[self::SESSION_CHAT_OPEN_BOXES])) {
75
            $_SESSION[self::SESSION_CHAT_OPEN_BOXES] = [];
76
        }
77
 
78
    }
79
 
80
    /**
81
     *
82
     * Ruta usada para mostrar el chat en pantalla completa usada en los moviles
83
     *
84
     */
85
    public function indexAction()
86
    {
87
        $currentUserPlugin = $this->plugin('currentUserPlugin');
88
        $currentUser = $currentUserPlugin->getUser();
89
 
90
        $connectionMapper = ConnectionMapper:: getInstance($this->adapter);
91
        $connectionIds = $connectionMapper->fetchAllConnectionsByUserReturnIds( $currentUser->id );
92
 
93
        $contacts = [];
94
        if($connectionIds) {
95
            $userMapper = UserMapper::getInstance($this->adapter);
96
            $users = $userMapper->fetchAllByIds($connectionIds);
97
 
98
            foreach($users as $user)
99
            {
100
                $username = trim($user->first_name . ' ' . $user->last_name);
101
 
102
 
103
                if($this->isInactiveConnection($user->last_heart_beat_at ? $user->last_heart_beat_at : '')) {
104
                    $userMapper->updateChatOfflineStatus($user->id);
105
                    $status = 'Offline';
106
                } else {
107
                    $status = "Online";
108
                }
109
 
110
                $user_image = $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]);
111
 
112
                array_push($contacts, ['id' => $user->uuid, 'status'=> $status,'name'=> $username, 'image' => $user_image]);
113
 
114
            }
115
        }
116
 
117
        $groups = [];
118
        $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
119
        $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
120
 
121
        $results = $chatGroupUserMapper->fetchAllByUserId($currentUser->id);
122
        if(is_array($results)) {
123
            foreach ($results as $r)
124
            {
125
 
126
                $chatOwner = $chatGroupUserMapper->fetchOwnerByGroupId($r->group_id);
127
                $userOwner = $userMapper->fetchOne( $chatOwner->user_id );
128
                $chatGroup = $chatGroupMapper->fetchOne($r->group_id);
129
 
130
                array_push($groups, ['id' => $chatGroup->uuid, 'name' => $chatGroup->name, 'owner_id' => $userOwner->uuid ]);
131
 
132
 
133
 
134
            }
135
        }
136
 
1893 efrain 137
        /*
1 www 138
        $this->layout()->setTemplate('layout/layout-chat.phtml');
139
        $this->layout()->setVariables([
140
            'is_chat' => true
1893 efrain 141
        ]);*/
1 www 142
        $viewModel = new ViewModel();
143
        $viewModel->setTemplate('leaders-linked/chat/chat.phtml');
144
        $viewModel->setVariables([
145
            'contacts' => $contacts,
146
            'groups' => $groups,
147
            'user_id' => $currentUser->id,
148
            'is_chat' => true
149
        ]);
150
        return $viewModel ;
151
 
152
 
153
    }
154
 
155
    /**
156
     * Recuperamos los contactos y grupos
157
     * tiene que enviarse un petición GET a la siguiente url: /chat/heart-beat
158
     * retorna un json en caso de ser  positivo
159
     * [
160
     *  'success' : true,
161
     *  'data' : [
162
     *     [
163
     *       'url_leave'                                => 'url para abandonar el grupo en caso de no ser el propietario',
164
     *       'url_delete'                               => 'url para borrar el grupo si es el propietario',
165
     *       'url_add_user_to_group'                    => 'url para agregar un usuario al grupo si es el propietario',
166
     *       'url_get_contacts_availables_for_group'    => 'url para obtener los usuarios disponibles para agregarlos al grupo',
167
     *       'url_get_contact_group_list'               => 'url para obtener los usuarios del grupo si es el propietario',
168
     *       'url_clear'                                => 'url para limpiar los mensajes del grupo',
169
     *       'url_close'                                => 'url para cerrar el chat',
170
     *       'url_send'                                 => 'url para enviar un mensaje',
171
     *       'url_upload'                               => 'url para subir un archivo, imagen o video',
172
     *       'url_get_all_messages'                     => 'url para para obtener los mensajes',
173
     *       'url_mark_seen'                            => 'url para marcar los mensajes como vistos'
174
     *       'url_mark_received'                        => 'url para marcar los mensajes como recibios'
175
     *       'id'                                       => 'id del grupo encriptado',
176
     *       'name'                                     => 'nombre del grupo',
177
     *       'type'                                     => 'group', //fixed
178
     *       'is_open'                                  => 'true/false',
179
     *       'unsee_messages'                           => 'true/false',
180
     *       'unread_messages'                          => 'true/false'
181
     *      ],
182
     *      [
183
     *        'url_clear'               => 'url para limpiar los mensajes del grupo',
184
     *        'url_close'               => 'url para cerrar el chat',
185
     *        'url_send'                => 'url para enviar un mensaje',
186
     *        'url_upload'              => 'url para subir un archivo, imagen o video',
187
     *        'url_get_all_messages'    => 'url para para obtener los mensajes',
188
     *        'url_mark_seen'                            => 'url para marcar los mensajes como vistos'
189
     *        'url_mark_received'                        => 'url para marcar los mensajes como recibios'
190
     *        'id'                      => 'id del usuario encriptado',
191
     *        'name'                    => 'nombre del usuario',
192
     *        'image'                   => 'imagen del usuario',
193
     *        'type'                    => 'user' //fixed,
194
     *        'profile'                 => 'url del profile',
195
     *        'online'                  => 'true/false',
196
     *        'is_open'                 => 'true/false',
197
     *        'unsee_messages'          => 'true/false'
198
     *        'unread_messages'         => 'true/false'
199
     *     ]
200
     * ]
201
     * En caso de ser negativo puede haber 2 formatos
202
     * [
203
     *  'success' : false,
204
     *  'data' : mensaje de error
205
     * ]
206
     * o
207
     * [
208
     *  'success' : false,
209
     *  'data' : [
210
     *      'fieldname' : [
211
     *          'mensaje de error'
212
     *      ]
213
     *  ]
214
     * ]
215
     * @return \Laminas\View\Model\JsonModel
216
     */
217
    public function heartBeatAction()
218
    {
219
        $request    = $this->getRequest();
220
        if($request->isGet()) {
221
 
222
 
223
            $currentUserPlugin = $this->plugin('currentUserPlugin');
224
            $currentUser = $currentUserPlugin->getUser();
225
 
226
            $userMapper = UserMapper::getInstance($this->adapter);
227
            $userMapper->updateChatOnlineStatus($currentUser->id);
228
 
229
            $chats      = [];
230
 
231
            $chatGroupMapper            = ChatGroupMapper::getInstance($this->adapter);
232
            $chatGroupUserMapper        = ChatGroupUserMapper::getInstance($this->adapter);
233
            $chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
234
 
235
 
236
            $results = $chatGroupUserMapper->fetchAllByUserId($currentUser->id);
237
 
238
            if (is_array($results)) {
239
                foreach ($results as $r)
240
                {
241
 
242
                    $chatGroup = $chatGroupMapper->fetchOne($r->group_id);
243
                    $chatUserOwner = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
244
 
245
 
246
                    $is_open = in_array($chatGroup->uuid, $_SESSION[self::SESSION_CHAT_OPEN_BOXES]);
247
                    $not_seen_messages     = $chatGroupUserMessageMapper->existNotSeenMessages($chatGroup->id, $currentUser->id);
248
                    $not_received_messages = $chatGroupUserMessageMapper->existNotReceivedMessages($chatGroup->id, $currentUser->id);
249
 
250
                    if($chatUserOwner->user_id == $currentUser->id ) {
251
 
252
                        $chat = [
253
                            'url_leave'                             => '',
254
                            'url_delete'                            => $this->url()->fromRoute('chat/delete-group', ['group_id' => $chatGroup->uuid]),
255
                            'url_add_user_to_group'                 => $this->url()->fromRoute('chat/add-user-to-group', ['group_id' => $chatGroup->uuid]),
256
                            'url_get_contact_group_list'            => $this->url()->fromRoute('chat/get-contact-group-list', ['group_id' => $chatGroup->uuid]),
257
                            'url_get_contacts_availables_for_group' => $this->url()->fromRoute('chat/get-contacts-availables-for-group', ['group_id' => $chatGroup->uuid]),
258
                            'url_clear'                             => $this->url()->fromRoute('chat/clear', ['id' => $chatGroup->uuid]),
259
                            'url_close'                             => $this->url()->fromRoute('chat/close', ['id' => $chatGroup->uuid]),
260
                            'url_send'                              => $this->url()->fromRoute('chat/send', ['id' => $chatGroup->uuid]),
261
                            'url_upload'                            => $this->url()->fromRoute('chat/upload', ['id' => $chatGroup->uuid]),
262
                            'url_get_all_messages'                  => $this->url()->fromRoute('chat/get-all-messages', ['id' => $chatGroup->uuid]),
263
                            'url_mark_seen'                         => $this->url()->fromRoute('chat/mark-seen', ['id' => $chatGroup->uuid]),
264
                            'url_mark_received'                     => $this->url()->fromRoute('chat/mark-received', ['id' => $chatGroup->uuid]),
265
                            'id'                                    => $chatGroup->uuid,
266
                            'name'                                  => $chatGroup->name,
267
                            'type'                                  => 'group',
268
                            'is_open'                               => $is_open ? 1 : 0,
269
                            'not_seen_messages'                     => $not_seen_messages,
270
                            'not_received_messages'                 => $not_received_messages,
271
 
272
                        ];
273
                    } else {
274
 
275
                        $chat = [
276
                            'url_delete'                    => '',
277
                            'url_add_user_to_group'         => '',
278
                            'url_get_contact_group_list'    => $this->url()->fromRoute('chat/get-contact-group-list', ['group_id' => $chatGroup->uuid]),
279
                            'url_leave'                     => $this->url()->fromRoute('chat/leave-group', ['group_id' => $chatGroup->uuid]),
280
                            'url_clear'                     => $this->url()->fromRoute('chat/clear', ['id' => $chatGroup->uuid]),
281
                            'url_close'                     => $this->url()->fromRoute('chat/close', ['id' => $chatGroup->uuid]),
282
                            'url_send'                      => $this->url()->fromRoute('chat/send', ['id' => $chatGroup->uuid]),
283
                            'url_upload'                    => $this->url()->fromRoute('chat/upload', ['id' => $chatGroup->uuid]),
284
                            'url_get_all_messages'          => $this->url()->fromRoute('chat/get-all-messages', ['id' => $chatGroup->uuid]),
285
                            'url_mark_seen'                 => $this->url()->fromRoute('chat/mark-seen', ['id' => $chatGroup->uuid]),
286
                            'url_mark_received'             => $this->url()->fromRoute('chat/mark-received', ['id' => $chatGroup->uuid]),
287
                            'id'                            => $chatGroup->uuid,
288
                            'name'                          => $chatGroup->name,
289
                            'type'                          => 'group',
290
                            'is_open'                       => $is_open ? 1 : 0,
291
                            'not_seen_messages'             => $not_seen_messages,
292
                            'not_received_messages'         => $not_received_messages,
293
                        ];
294
                    }
295
 
296
                   array_push($chats, $chat);
297
                }
298
            }
299
 
300
            $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
301
            $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
302
 
303
            $connectionMapper = ConnectionMapper::getInstance($this->adapter);
304
            $connectionIds = $connectionMapper->fetchAllConnectionsByUserReturnIds($currentUser->id);
305
 
306
 
307
 
308
            if ($connectionIds) {
309
 
310
                $userMapper = UserMapper::getInstance($this->adapter);
311
                $users = $userMapper->fetchAllByIds($connectionIds);
312
 
313
                foreach ($users as $user)
314
                {
315
 
316
 
317
                    if ($this->isInactiveConnection($user->last_heart_beat_at ? $user->last_heart_beat_at : '')) {
318
                        $userMapper->updateChatOfflineStatus($user->id);
319
                        $online = false;
320
                    } else {
321
                        $online = true;
322
                    }
323
 
324
 
325
                    $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
326
 
327
 
328
                    if($chatUser) {
329
                        $is_open = in_array($chatUser->uuid, $_SESSION[self::SESSION_CHAT_OPEN_BOXES]);
330
                        $not_received_messages = $chatMessageMapper->existNotReceivedMessagesByChatIdAndToId($chatUser->id, $currentUser->id);
331
                        $not_seen_messages = $chatMessageMapper->existNotSeenMessagesByChatIdAndToId($chatUser->id, $currentUser->id);
332
                    } else {
333
                        $is_open = false;
334
                        $not_seen_messages = false;
335
                        $not_received_messages = false;
336
                    }
337
 
338
 
339
                    $chat = [
340
                        'url_clear'                 => $this->url()->fromRoute('chat/clear', ['id' => $user->uuid]),
341
                        'url_close'                 => $this->url()->fromRoute('chat/close', ['id' => $user->uuid]),
342
                        'url_send'                  => $this->url()->fromRoute('chat/send', ['id' => $user->uuid]),
343
                        'url_upload'                => $this->url()->fromRoute('chat/upload', ['id' => $user->uuid]),
344
                        'url_mark_seen'             => $this->url()->fromRoute('chat/mark-seen', ['id' => $user->uuid]),
345
                        'url_mark_received'         => $this->url()->fromRoute('chat/mark-received', ['id' => $user->uuid]),
346
                        'url_get_all_messages'      => $this->url()->fromRoute('chat/get-all-messages', ['id' => $user->uuid]),
347
                        'id'                        => $user->uuid,
348
                        'name'                      => trim($user->first_name . ' ' . $user->last_name),
349
                        'image'                     => $this->url()->fromRoute('storage', ['code' => $user->uuid, 'type' => 'user', 'filename' => $user->image]),
350
                        'profile'                   => $this->url()->fromRoute('profile/view', ['id' =>$user->uuid]),
351
                        'type'                      => 'user',
352
                        'online'                    => $online ? 1 : 0,
353
                        'is_open'                   => $is_open ? 1 : 0,
354
                        'not_seen_messages'         => $not_seen_messages,
355
                        'not_received_messages'     => $not_received_messages,
356
                    ];
357
 
358
                    array_push($chats, $chat);
359
                }
360
            }
361
 
362
            $userMapper->updateLastHeartBeat($currentUser->id);
363
 
364
            $response = [
365
                'success' => true,
366
                'data' => $chats
367
            ];
368
 
369
        } else {
370
            $response = [
371
                'success' => false,
372
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
373
            ];
374
        }
375
 
376
        return new JsonModel($response);
377
    }
378
 
379
 
380
 
381
    /**
382
     * Esta función crea un grupo y asigna al usuario actual como el owner del mismo,
383
     * tiene que enviarse un petición POST a la siguiente url: /chat/create-group
384
     * con el siguiente parámetro
385
     * name = un string con un máximo de 50 carácteres
386
     * retorna un json en caso de ser  positivo
387
     * [
388
     *  'success' : true,
389
     *  'data' : ID del grupo encriptado
390
     * ]
391
     * En caso de ser negativo puede haber 2 formatos
392
     * [
393
     *  'success' : false,
394
     *  'data' : mensaje de error
395
     * ]
396
     * o
397
     * [
398
     *  'success' : false,
399
     *  'data' : [
400
     *      'fieldname' : [
401
     *          'mensaje de error'
402
     *      ]
403
     *  ]
404
     * ]
405
     * @return \Laminas\View\Model\JsonModel
406
     */
407
    public function createGroupAction()
408
    {
409
        $request    = $this->getRequest();
410
        if($request->isPost()) {
411
            $form = new  CreateGroupForm();
412
            $form->setData($request->getPost()->toArray());
413
 
414
            if($form->isValid()) {
415
                $dataPost = (array) $form->getData();
416
                $name = $dataPost['name'];
417
 
418
 
419
                $currentUserPlugin = $this->plugin('currentUserPlugin');
420
                $currentUser = $currentUserPlugin->getUser();
421
 
422
                $chatGroup = new ChatGroup();
423
                $chatGroup->name = $name;
424
 
425
 
426
                $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
427
                $result = $chatGroupMapper->insert($chatGroup);
428
                if ($result) {
429
                    $chatGroup = $chatGroupMapper->fetchOne($chatGroup->id);
430
 
431
 
432
 
433
                    $chatGroupUser = new ChatGroupUser();
434
                    $chatGroupUser->group_id = $chatGroup->id;
435
                    $chatGroupUser->user_id = $currentUser->id;
436
                    $chatGroupUser->owner = ChatGroupUser::OWNER_YES;
437
 
438
                    $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
439
                    $result = $chatGroupUserMapper->insert($chatGroupUser);
440
 
441
                    if($result)  {
442
                        $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
443
                        $dirpath = $fullpath_chat . $chatGroup->uuid;
444
                        if (! file_exists($dirpath)) {
445
                            mkdir($dirpath, 0777, true);
446
                            chmod($dirpath, 0777);
447
                        }
448
 
449
                        $response = [
450
                            'success' => true,
451
                            'data' => $chatGroup->uuid,
452
                        ];
453
                    } else {
454
                        $response = [
455
                            'success' => false,
456
                            'data' => $chatGroupUserMapper->getError(),
457
                        ];
458
                    }
459
 
460
                } else {
461
                    $response = [
462
                        'success' => false,
463
                        'data' => $chatGroupMapper->getError(),
464
                    ];
465
                }
466
            } else {
467
                $messages = [];
468
                $form_messages = (array) $form->getMessages();
469
                foreach($form_messages  as $fieldname => $field_messages)
470
                {
471
 
472
                    $messages[$fieldname] = array_values($field_messages);
473
                }
474
 
475
                return new JsonModel([
476
                    'success'   => false,
477
                    'data'   => $messages
478
                ]);
479
            }
480
        } else {
481
            $response = [
482
                'success' => false,
483
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
484
            ];
485
        }
486
 
487
        return new JsonModel($response);
488
    }
489
 
490
    /**
491
     * Esta función crea un grupo y asigna al usuario al mismo, solo el owner puede hacerlo
492
     * Es una petición POST el url que contiene el ID encriptado del chat (/chat/add-user-to-group/:group_id)
493
     * Parámetros del route
494
     * :group_id = id del grupo encriptado
495
     * Parámetro post
496
     * uid = id encriptado del usuario
497
     * retorna un json en caso de ser  positivo
498
     * [
499
     *  'success' : true,
500
     *  'data' : [
501
     *     [
502
     *       'url_remove_from_group' => 'url para remover el usuario del grupo',
503
     *       'id'                    => 'id del usuario encriptado',
504
     *       'name'                  => 'nombre del usuario',
505
     *       'image'                 => 'imagen del usuario',
506
     *       'type'                  => 'user' //fixed,
507
     *       'online'                => $online,
508
     *     ]
509
     * ]
510
     * En caso de ser negativo puede haber 2 formatos
511
     * [
512
     *  'success' : false,
513
     *  'data' : mensaje de error
514
     * ]
515
     * o
516
     * [
517
     *  'success' : false,
518
     *  'data' : [
519
     *      'fieldname' : [
520
     *          'mensaje de error'
521
     *      ]
522
     *  ]
523
     * ]
524
     * @return \Laminas\View\Model\JsonModel
525
     */
526
    public function addUserToGroupAction()
527
    {
528
        $request    = $this->getRequest();
529
        if($request->isPost()) {
530
            $currentUserPlugin = $this->plugin('currentUserPlugin');
531
            $currentUser = $currentUserPlugin->getUser();
532
 
533
            $group_id   = $this->params()->fromRoute('group_id');
534
            $user_id    = $this->params()->fromPost('uid');
535
 
536
            if(empty($group_id) || empty($user_id)) {
537
                return new JsonModel([
538
                    'success' => false,
539
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
540
                ]);
541
            }
542
 
543
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
544
            $chatGroup = $chatGroupMapper->fetchOneByUuid($group_id);
545
            if(!$chatGroup) {
546
                return new JsonModel([
547
                    'success' => false,
548
                    'data' => 'ERROR_CHAT_GROUP_NOT_FOUND'
549
                ]);
550
            }
551
 
552
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
553
            $chatGroupOwner = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
554
 
555
            if($chatGroupOwner->user_id != $currentUser->id) {
556
                return new JsonModel([
557
                    'success' => false,
558
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_NOT_OWNER'
559
                ]);
560
            }
561
 
562
            $userMapper = UserMapper::getInstance($this->adapter);
563
            $user = $userMapper->fetchOneByUuid($user_id);
564
 
565
            if(!$user) {
566
                return new JsonModel([
567
                    'success' => false,
568
                    'data' => 'ERROR_USER_NOT_FOUND'
569
                ]);
570
            }
571
 
572
            if($chatGroupOwner->user_id == $user->id) {
573
                return new JsonModel([
574
                    'success' => false,
575
                    'data' => 'ERROR_CHAT_I_CAN_NOT_ADD_HIMSELF'
576
                ]);
577
            }
578
 
579
 
580
            $connectionMapper = ConnectionMapper::getInstance($this->adapter);
581
            $connection = $connectionMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
582
            if(!$connection) {
583
                return new JsonModel([
584
                    'success' => false,
585
                    'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
586
                ]);
587
            }
588
 
589
            $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $user->id);
590
            if($chatGroupUser) {
591
                return new JsonModel([
592
                    'success' => false,
593
                    'data' => 'ERROR_THIS_USER_ALREADY_EXISTS_IN_THIS_GROUP'
594
                ]);
595
            }
596
 
597
 
598
            $chatGroupUser = new ChatGroupUser();
599
            $chatGroupUser->group_id    = $chatGroup->id;
600
            $chatGroupUser->user_id     = $user->id;
601
            $chatGroupUser->owner       = ChatGroupUser::OWNER_NO;
602
 
603
            $result = $chatGroupUserMapper->insert($chatGroupUser);
604
            if(!$result) {
605
                return new JsonModel([
606
                    'success' => false,
607
                    'data' => $chatGroupUserMapper->getError()
608
                ]);
609
            }
610
 
611
            if ($this->isInactiveConnection($user->last_heart_beat_at ? $user->last_heart_beat_at : '')) {
612
                $userMapper->updateChatOfflineStatus($user->id);
613
                $online = false;
614
            } else {
615
                $online = true;
616
            }
617
 
618
 
619
            return new JsonModel([
620
                'success' => true,
621
                'data' => [
622
                    'url_remove_from_group' => $this->url()->fromRoute('chat/remove-user-from-group', ['group_id' => $chatGroup->uuid, 'user_id' => $user->uuid]),
623
                    'id'        => $user->uuid,
624
                    'name'      => trim($user->first_name . ' ' . $user->last_name),
625
                    'image'     => $this->url()->fromRoute('storage', ['code' => $user->uuid, 'type' => 'user', 'filename' => $user->image]),
626
                    'type'      => 'user',
627
                    'online'    => $online,
628
                ]
629
            ]);
630
 
631
 
632
        } else {
633
            return new JsonModel([
634
                'success' => false,
635
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
636
            ]);
637
        }
638
 
639
    }
640
 
641
    /**
642
     * Esta función remueve el usuario del grupo
643
     * Es una petición POST el url que contiene el ID encriptado del chat (/chat/remove-user-from-group/:group_id/:user_id)
644
     * y la cuál se recibe en la función heartBeat.
645
     * Parámetros del route
646
     * group_id= id encriptado del grupo
647
     * user_id = id encriptado del usuario
648
     * retorna un json en caso de ser  positivo
649
     * [
650
     *  'success' : true,
651
     * ]
652
     * En caso de ser negativo puede haber 2 formatos
653
     * [
654
     *  'success' : false,
655
     *  'data' : mensaje de error
656
     * ]
657
     * @return \Laminas\View\Model\JsonModel
658
     */
659
    public function removeUserFromGroupAction()
660
    {
661
        $request    = $this->getRequest();
662
        if($request->isPost()) {
663
 
664
            $currentUserPlugin = $this->plugin('currentUserPlugin');
665
            $currentUser = $currentUserPlugin->getUser();
666
 
667
            $user_id = $this->params()->fromRoute('user_id');
668
            $group_id = $this->params()->fromRoute('group_id');
669
 
670
            if(empty($group_id) || empty($user_id)) {
671
                return new JsonModel([
672
                    'success' => false,
673
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
674
                ]);
675
            }
676
 
677
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
678
            $chatGroup = $chatGroupMapper->fetchOneByUuid($group_id);
679
            if(!$chatGroup) {
680
                return new JsonModel([
681
                    'success' => false,
682
                    'data' => 'ERROR_CHAT_GROUP_NOT_FOUND'
683
                ]);
684
            }
685
 
686
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
687
            $chatGroupOwner = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
688
 
689
            if($chatGroupOwner->user_id != $currentUser->id) {
690
                return new JsonModel([
691
                    'success' => false,
692
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_NOT_OWNER'
693
                ]);
694
            }
695
 
696
            $userMapper = UserMapper::getInstance($this->adapter);
697
            $user = $userMapper->fetchOneByUuid($user_id);
698
 
699
            if(!$user) {
700
                return new JsonModel([
701
                    'success' => false,
702
                    'data' => 'ERROR_USER_NOT_FOUND'
703
                ]);
704
            }
705
 
706
            if($chatGroupOwner->user_id == $user->id) {
707
                return new JsonModel([
708
                    'success' => false,
709
                    'data' => 'ERROR_CHAT_I_CAN_NOT_REMOVE_MYSELF'
710
                ]);
711
            }
712
 
713
 
714
 
715
 
716
            $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $user->id);
717
            if(!$chatGroupUser) {
718
                return new JsonModel([
719
                    'success' => false,
720
                    'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
721
                ]);
722
            }
723
 
724
 
725
            $response = $chatGroupUserMapper->deleteByGroupIdAndUserId($chatGroup->id, $user->id);
726
            if($response) {
727
                return new JsonModel([
728
                    'success' => true
729
                ]);
730
            } else {
731
                return new JsonModel([
732
                    'success' => false,
733
                    'data' => $chatGroupMapper->getError()
734
                ]);
735
            }
736
 
737
        } else {
738
            return new JsonModel([
739
                'success' => false,
740
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
741
            ]);
742
        }
743
    }
744
 
745
 
746
    /**
747
     * Abandonar un grupo
748
     * Es una petición POST el url que contiene el ID encriptado del chat (/chat/leave-group/:group_id) y la cuál se recibe en la función heartBeat.
749
     * Parámetros del route
750
     * :group_id = id del grupo encriptado
751
     * En caso de una respuesta positiva
752
     * [
753
     *      'success' => true,
754
     * ]
755
     * En caso de un respuesta negativa
756
     * [
757
     *      'success' => false,
758
     *      'data' => (string) 'mensaje_de_error'
759
     * ]
760
     * @return \Laminas\View\Model\JsonModel
761
     */
762
    public function leaveGroupAction()
763
    {
764
        $request    = $this->getRequest();
765
        if($request->isPost()) {
766
            $currentUserPlugin = $this->plugin('currentUserPlugin');
767
            $currentUser = $currentUserPlugin->getUser();
768
 
769
            $result = false;
770
            $group_id = $this->params()->fromRoute('group_id');
771
 
772
 
773
            if(empty($group_id)) {
774
                return new JsonModel([
775
                    'success' => false,
776
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
777
                ]);
778
            }
779
 
780
 
781
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
782
            $chatGroup = $chatGroupMapper->fetchOneByUuid($group_id);
783
            if(!$chatGroup) {
784
                return new JsonModel([
785
                    'success' => false,
786
                    'data' => 'ERROR_GROUP_NOT_FOUND'
787
                ]);
788
            }
789
 
790
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
791
            $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
792
            if(!$chatGroupUser) {
793
                return new JsonModel([
794
                    'success' => false,
795
                    'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
796
                ]);
797
            }
798
 
799
            if($chatGroupUser->owner == ChatGroupUser::OWNER_YES) {
800
                return new JsonModel([
801
                    'success' => false,
802
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_OWNER'
803
                ]);
804
            }
805
 
806
 
807
            $result = $chatGroupUserMapper->deleteByGroupIdAndUserId($chatGroupUser->group_id, $chatGroupUser->user_id);
808
            if($result) {
809
                return new JsonModel([
810
                    'success' => true
811
                ]);
812
            } else {
813
                return new JsonModel([
814
                    'success' => false,
815
                    'data' => $chatGroupMapper->getError()
816
                ]);
817
            }
818
 
819
 
820
 
821
        } else {
822
            return new JsonModel([
823
                'success' => false,
824
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
825
            ]);
826
        }
827
 
828
    }
829
 
830
    /**
831
     *
832
     * @param ChatGroup $chatGroup
833
     * @param int $page
834
     * @return array
835
     */
836
    private function getAllMessagesForChatGroup($chatGroup, $page = 0)
837
    {
838
        $currentUserPlugin = $this->plugin('currentUserPlugin');
839
        $currentUser = $currentUserPlugin->getUser();
840
 
841
        $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
842
        $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
843
 
844
        if(!$chatGroupUser) {
845
            return [
846
                'success' => false,
847
                'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
848
            ];
849
        }
850
 
851
        if(!in_array(trim($chatGroup->uuid), $_SESSION[self::SESSION_CHAT_OPEN_BOXES])) {
852
            $_SESSION[self::SESSION_CHAT_OPEN_BOXES][] = $chatGroup->uuid;
853
        }
854
 
855
        $chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
856
        $paginator = $chatGroupMessageMapper->getPaginatorByGroupId($chatGroup->id, $page);
857
 
858
        $pages = $paginator->count();
859
        $page  = $paginator->getCurrentPageNumber();
860
 
861
        $items = [];
862
        $users = [];
863
        $userMapper = UserMapper::getInstance($this->adapter);
864
 
865
        foreach ($paginator as $m)
866
        {
867
 
868
            if (isset($users[$m->sender_id])) {
869
                $userdata_from = $users[$m->sender_id];
870
            } else {
871
                $userdata_from = $userMapper->fetchOne($m->sender_id);
872
                $users[ $m->sender_id ] = $userdata_from;
873
            }
874
 
875
            $pic_from = $this->url()->fromRoute('storage', [
876
                'code' => $userdata_from->uuid,
877
                'type' => 'user',
878
                'filename' => $userdata_from->image
879
            ]);
880
            $u =  $userdata_from->id == $currentUser->id ? 1 : 2;
881
            if($m->type == ChatGroupMessage::TYPE_TEXT) {
882
                $content = $this->sanitize($m->content);
883
            } else {
884
                $content = $this->url()->fromRoute('storage', ['code' => $chatGroup->uuid, 'type' => 'chat', 'filename' => $m->content]);
885
            }
886
 
887
            $msgtime = $this->timeAgo($m->added_on);
888
            array_push($items, [
889
                'user_name' => trim($userdata_from->first_name . ' ' .$userdata_from->last_name) ,
890
                'user_id' => $userdata_from->uuid,
891
                'user_image' => $pic_from,
892
                'u' => $u,
893
                'mtype' => $m->type,
894
                'm' => $content,
895
                'time' => $msgtime,
896
                'id' => $m->uuid
897
            ]);
898
        }
899
 
900
        return [
901
            'success' => true,
902
            'data' => [
903
                'page' => $page,
904
                'pages' => $pages,
905
                'items' => $items
906
            ]
907
        ];
908
 
909
 
910
    }
911
 
912
    /**
913
     *
914
     * @param ChatUser $chatUser
915
     * @param int $page
916
     * @return array
917
     */
918
    private function getAllMessagesForChatUser($chatUser, $page = 0)
919
    {
920
        $currentUserPlugin = $this->plugin('currentUserPlugin');
921
        $currentUser = $currentUserPlugin->getUser();
922
 
923
        if(!in_array(trim($chatUser->uuid), $_SESSION[self::SESSION_CHAT_OPEN_BOXES])) {
924
            $_SESSION[self::SESSION_CHAT_OPEN_BOXES][] = $chatUser->uuid;
925
        }
926
 
927
        $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
928
        $paginator = $chatMessageMapper->getAllMessagesPaginatorByChatId($chatUser->id, $page);
929
        $pages = $paginator->count();
930
        $page = $paginator->getCurrentPageNumber();
931
 
932
        $items = [];
933
        $users = [];
934
        $userMapper = UserMapper::getInstance($this->adapter);
935
 
936
        $messages = $paginator->getCurrentItems();
937
        foreach ($messages as $m) {
938
            $from_id = (int) $m->from_id;
939
            $to_id = (int) $m->to_id;
940
 
941
            if (isset($users[$from_id])) {
942
                $userdata_from = $users[$from_id];
943
            } else {
944
                $userdata_from = $userMapper->fetchOne($from_id);
945
                $users[$from_id] = $userdata_from;
946
            }
947
 
948
            $pic_from = $this->url()->fromRoute('storage', [
949
                'code' => $userdata_from->uuid,
950
                'type' => 'user',
951
                'filename' => $userdata_from->image
952
            ]);
953
 
954
            if (isset($users[$to_id])) {
955
                $userdata_to = $users[$to_id];
956
            } else {
957
                $userdata_to = $userMapper->fetchOne($to_id);
958
                $users[ $to_id ] = $userdata_to;
959
            }
960
 
961
            $u = $m->from_id == $currentUser->id ? 1 : 2;
962
 
2129 efrain 963
            $seen = 0;
964
            if ($m->to_id == $currentUser->id) {
965
                $seen = $m->seen == ChatMessage::SEEN_NO ? 1 : 0;
966
            }
1 www 967
 
2129 efrain 968
 
1 www 969
            if($m->type == ChatMessage::TYPE_TEXT) {
970
                $content = $this->sanitize($m->content);
971
            } else {
972
                $content = $this->url()->fromRoute('storage', ['code' => $chatUser->uuid, 'type' => 'chat', 'filename' => $m->content]);
973
            }
974
 
975
            $msgtime = $this->timeAgo($m->added_on);
976
            array_push($items, [
977
                'user_name' => ($userdata_from->first_name . ' ' . $userdata_from->last_name),
978
                'user_id' => $userdata_from->uuid,
979
                'user_image' => $pic_from,
980
                'u' => $u,
981
                'mtype' => $m->type,
982
                'm' => $content,
983
                'time' => $msgtime,
984
                'id' => $m->uuid,
2129 efrain 985
                'seen' => $seen,
1 www 986
            ]);
987
        }
988
 
989
 
990
        if ($this->isInactiveConnection($currentUser->last_heart_beat_at ? $currentUser->last_heart_beat_at : '')) {
991
            $userMapper->updateChatOfflineStatus($currentUser->id);
992
            $online = false;
993
        } else {
994
            $online = true;
995
        }
996
 
997
 
998
        return [
999
            'success' => true,
1000
            'data' => [
1001
                'page' => $page,
1002
                'pages' => $pages,
1003
                'items' => $items,
1004
                'online' => $online
1005
            ]
1006
        ];
1007
    }
1008
 
1009
    /**
1010
     * Recupera los mensajes de un chat individual o grupal
1011
     * Es una petición GET el url que contiene el ID encriptado del chat (/chat/get-all-messages/:id) y la cuál se recibe en la función heartBeat.
1012
     * En caso de una respuesta positiva
1013
     * [
1014
     *      'success' => true,
1015
     *      'data' => [
1016
     *          'page' => 'entero número de página actúal',
1017
     *          'pages' => 'entero número total de páginaS',
1018
     *              'items' => [
1019
     *              'user_name' => 'nombre del usuario que envia',
1020
     *              'user_id_encript' => 'id encriptado del usuario que envia',
1021
     *              'user_image' => 'ruta de la imagén del usuario que envia',
1022
     *              'u' => '1 = si el usuario que envia es el usuario actual , 2 si no lo es',
1023
     *              'mtype' => 'text | file',
1024
     *              'm' => 'texto del mensaje o url del archivo',
1025
     *              'time' => 'cadena que da el tiempo del mensaje ejemplo 1seg',
1026
     *          ],
1027
     *          'online' => 'true/false'
1028
     *      ]
1029
     * ]
1030
     * En caso de un respuesta negativa
1031
     * [
1032
     *      'success' => false,
1033
     *      'data' => (string) 'mensaje_de_error'
1034
     * ]
1035
     * @return \Laminas\View\Model\JsonModel
1036
     */
1037
    public function getAllMessagesAction()
1038
    {
1039
 
1040
        $request    = $this->getRequest();
1041
        if($request->isGet()) {
1042
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1043
            $currentUser = $currentUserPlugin->getUser();
1044
 
1045
 
1046
            $id     = $this->params()->fromRoute('id');
1047
            $page   = filter_var($this->params()->fromQuery('page', 0), FILTER_SANITIZE_NUMBER_INT);
1048
 
1049
            if(!$id) {
1050
                return new JsonModel([
1051
                    'success' => false,
1052
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1053
                ]);
1054
            }
1055
 
1056
            /**** Mensajes de un chat grupal ****/
1057
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1058
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1059
            if ($chatGroup) {
1060
                $response = $this->getAllMessagesForChatGroup($chatGroup, $page);
1061
                return new JsonModel($response);
1062
            } else {
1063
 
1064
                $userMapper = UserMapper::getInstance($this->adapter);
1065
                $user = $userMapper->fetchOneByUuid($id);
1066
                if(!$user) {
1067
                    return new JsonModel([
1068
                        'success' => false,
1069
                        'data' => 'ERROR_USER_NOT_FOUND'
1070
                    ]);
1071
                }
1072
 
1073
 
1074
 
1075
 
1076
 
1077
 
1078
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
1079
                $connection = $connectionMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1080
                if(!$connection || $connection->status != Connection::STATUS_ACCEPTED) {
1081
 
1082
                    return new JsonModel([
1083
                        'success' => false,
1084
                        'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
1085
                    ]);
1086
 
1087
                }
1088
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
1089
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1090
                if(!$chatUser) {
1091
                    $chatUser = new ChatUser();
1092
                    $chatUser->user_id1 = $currentUser->id;
1093
                    $chatUser->user_id2 = $user->id;
1094
 
1095
                    $response = $chatUserMapper->insert($chatUser);
1096
 
1097
 
1098
                    if(!$response) {
1099
                        return new JsonModel([
1100
                            'success' => false,
1101
                            'data' => $chatUserMapper->getError()
1102
                        ]);
1103
                    }
1104
 
1105
                    $chatUser = $chatUserMapper->fetchOne($chatUser->id);
1106
                    $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
1107
                    $dirpath = $fullpath_chat . $chatUser->uuid;
1108
                    if (! file_exists($dirpath)) {
1109
                        mkdir($dirpath, 0777, true);
1110
                        chmod($dirpath, 0777);
1111
                    }
1112
 
1113
                }
1114
 
1115
 
1116
 
1117
                $response = $this->getAllMessagesForChatUser($chatUser, $page);
1118
                return new JsonModel($response);
1119
 
1120
            }
1121
 
1122
        } else {
1123
            return new JsonModel([
1124
                'success' => false,
1125
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1126
            ]);
1127
        }
1128
 
1129
    }
1130
 
1131
    /**
1132
     * Envia un mensaje a un chat individual o grupal
1133
     * Es una petición POST el url que contiene el ID encriptado del chat (/chat/send/:id) y la cuál se recibe en la función heartBeat.
1134
     * Parámetros del route
1135
     * :id = id del chat encriptado
1136
     * Como parámentro solo se espera un campo
1137
     * message: string
1138
     * En caso de una respuesta positiva
1139
     * [
1140
     *      'success' => true,
1141
     *      'user_name' => 'nombre del usuario que envia',
1142
     *      'user_id_encripted' => 'id encriptado del usuario que envia',
1143
     *      'user_image' => 'ruta de la imagén del usuario que envia',
1144
     *      'u' => '1 = si el usuario que envia es el usuario actual , 2 si no lo es',
1145
     *      'mtype' => 'text | file',
1146
     *      'm' => 'texto del mensaje o url del archivo',
1147
     *      'time' => 'cadena que da el tiempo del mensaje ejemplo 1seg',
1148
      * ]
1149
     * En caso de un respuesta negativa
1150
     * [
1151
     *      'success' => false,
1152
     *      'data' => (string) 'mensaje_de_error'
1153
     * ]
1154
     * @return \Laminas\View\Model\JsonModel
1155
     */
1156
    public function sendAction()
1157
    {
1158
 
1159
        $request    = $this->getRequest();
1160
        if($request->isPost()) {
1161
            $id         = $this->params()->fromRoute('id');
1162
            $message    = trim(filter_var($this->params()->fromPost('message', ''), FILTER_SANITIZE_STRING));
1163
 
1164
            if(!$id || empty($message)) {
1165
                return new JsonModel([
1166
                    'success' => false,
1167
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1168
                ]);
1169
            }
1170
 
1171
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1172
            $currentUser = $currentUserPlugin->getUser();
1173
 
1174
            $userMapper = UserMapper::getInstance($this->adapter);
1175
            $sender_result = $userMapper->fetchOne($currentUser->id);
1176
            $sender_name = trim($sender_result->first_name . ' ' . $sender_result->last_name);
1177
            $sender_pic = $this->url()->fromRoute('storage', [
1178
                'code' => $sender_result->uuid,
1179
                'type' => 'user',
1180
                'filename' => $sender_result->image
1181
            ]);
1182
 
1183
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1184
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1185
            if($chatGroup) {
1186
 
1187
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1188
                $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
1189
 
1190
                if(!$chatGroupUser) {
1191
                    return new JsonModel([
1192
                        'success' => false,
1193
                        'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
1194
                    ]);
1195
                }
1196
 
1197
                $chatGroupMessage = new ChatGroupMessage();
1198
                $chatGroupMessage->sender_id = $currentUser->id;
1199
                $chatGroupMessage->group_id = $chatGroup->id;
1200
                $chatGroupMessage->content = $message;
1201
                $chatGroupMessage->type = ChatGroupMessage::TYPE_TEXT;
1202
 
1203
                $chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
1204
                $result = $chatGroupMessageMapper->insert($chatGroupMessage);
1205
                if(!$result) {
1206
                    return new JsonModel([
1207
                        'success' => false,
1208
                        'data' => $chatGroupMessageMapper->getError()
1209
                    ]);
1210
                }
1211
                $chatGroupMessage = $chatGroupMessageMapper->fetchOne($chatGroupMessage->id);
1212
 
1213
 
1214
                $chatGroupUserMessage = new ChatGroupUserMessage();
1215
                $chatGroupUserMessage->group_id = $chatGroupMessage->group_id;
1216
                $chatGroupUserMessage->message_id = $chatGroupMessage->id;
1217
                $chatGroupUserMessage->receiver_id = $currentUser->id;
1218
                $chatGroupUserMessage->recd = ChatGroupUserMessage::RECD_YES;
1219
                $chatGroupUserMessage->seen = ChatGroupUserMessage::SEEN_NO;
1220
 
1221
                $chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
1222
                $result = $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
1223
                if(!$result) {
1224
                    return new JsonModel([
1225
                        'success' => false,
1226
                        'data' => $chatGroupUserMessageMapper->getError()
1227
                    ]);
1228
                }
1229
 
1230
 
1231
                $results = $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
1232
                foreach ($results as $r)
1233
                {
1234
                    if ($r->user_id != $currentUser->id) {
1235
                        $chatGroupUserMessage               = new ChatGroupUserMessage();
1236
                        $chatGroupUserMessage->group_id     = $chatGroupMessage->group_id;
1237
                        $chatGroupUserMessage->message_id   = $chatGroupMessage->id;
1238
                        $chatGroupUserMessage->receiver_id  = $r->user_id;
1239
                        $chatGroupUserMessage->recd         = ChatGroupUserMessage::RECD_NO;
1240
                        $chatGroupUserMessage->seen         = ChatGroupUserMessage::SEEN_NO;
1241
 
1242
                        $result = $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
1243
                        if(!$result) {
1244
                            return new JsonModel([
1245
                                'success' => false,
1246
                                'data' => $chatGroupUserMessageMapper->getError()
1247
                            ]);
1248
                        }
1249
                    }
1250
                }
1251
 
1252
                $msgtime = $this->timeAgo(date('Y-m-d H:i:s'));
1253
                return new JsonModel([
1254
                    'success' => true,
1255
                    'data' => [
1256
                        'user_name'         => $sender_name,
1257
                        'user_id_encripted' => $sender_result->uuid,
1258
                        'user_image'        => $sender_pic,
1259
                        'u'                 => 1,
1260
                        'mtype'             => 'text',
1261
                        'm'                 => $message,
1262
                        'time'              => $msgtime,
1263
                        'id'                => $chatGroupMessage->uuid,
1264
                    ]
1265
                ]);
1266
 
1267
 
1268
 
1269
            } else {
1270
                $userMapper = UserMapper::getInstance($this->adapter);
1271
                $user = $userMapper->fetchOneByUuid($id);
1272
                if(!$user) {
1273
                    return new JsonModel([
1274
                        'success' => false,
1275
                        'data' => 'ERROR_USER_NOT_FOUND'
1276
                    ]);
1277
                }
1278
 
1279
 
1280
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
1281
                $connection = $connectionMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1282
                if(!$connection || $connection->status != Connection::STATUS_ACCEPTED) {
1283
 
1284
                    return new JsonModel([
1285
                        'success' => false,
1286
                        'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
1287
                    ]);
1288
 
1289
                }
1290
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
1291
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1292
                if(!$chatUser) {
1293
                    $chatUser = new ChatUser();
1294
                    $chatUser->user_id1 = $currentUser->id;
1295
                    $chatUser->user_id2 = $user->id;
1296
 
1297
                    $response = $chatUserMapper->insert($chatUser);
1298
                    if(!$response) {
1299
                        return new JsonModel([
1300
                            'success' => false,
1301
                            'data' => $chatUserMapper->getError()
1302
                        ]);
1303
                    }
1304
 
1305
                    $chatUser = $chatUserMapper->fetchOne($chatUser->id);
1306
                    $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
1307
                    $dirpath = $fullpath_chat . $chatUser->uuid;
1308
                    if (! file_exists($dirpath)) {
1309
                        mkdir($dirpath, 0777, true);
1310
                        chmod($dirpath, 0777);
1311
                    }
1312
 
1313
                }
1314
 
1315
 
1316
 
1317
                $chatMessage = new ChatMessage();
1318
                $chatMessage->chat_id   = $chatUser->id;
1319
                $chatMessage->from_id   = $currentUser->id;
1320
                $chatMessage->to_id     = $user->id;
1321
                $chatMessage->content   = $message;
1322
                $chatMessage->type      = ChatMessage::TYPE_TEXT;
1323
                $chatMessage->recd      = ChatMessage::RECD_NO;
1324
                $chatMessage->seen      = ChatMessage::SEEN_NO;
1325
 
1326
                $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
1327
                $result = $chatMessageMapper->insert($chatMessage);
1328
                if(!$result) {
1329
                    return new JsonModel([
1330
                        'success' => false,
1331
                        'data' => $chatMessageMapper->getError()
1332
                    ]);
1333
                }
1334
 
1335
                $chatMessage = $chatMessageMapper->fetchOne($chatMessage->id);
1336
 
1337
                $msgtime = $this->timeAgo(date('Y-m-d H:i:s'));
1338
                return new JsonModel([
1339
                    'success' => true,
1340
                    'data' => [
1341
                        'user_name'     => $sender_name,
1342
                        'user_id'       => $sender_result->uuid,
1343
                        'user_image'    => $sender_pic,
1344
                        'u'             => 1,
1345
                        'mtype'         => ChatMessage::TYPE_TEXT,
1346
                        'm'             => $message,
1347
                        'time'          => $msgtime,
1348
                        'id'            => $chatMessage->uuid,
1349
                    ]
1350
                 ]);
1351
 
1352
 
1353
            }
1354
            return new JsonModel($response);
1355
 
1356
        } else {
1357
            return new JsonModel([
1358
                'success' => false,
1359
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1360
            ]);
1361
        }
1362
 
1363
    }
1364
 
1365
    /**
1366
     * Esta función recuperar los contactos disponibles para agregarlos a un grupo
1367
     * Es una petición GET el url que contiene el ID encriptado del chat (/chat/get-contacts-availables-for-group/:group_id) y la cuál se recibe en la función heartBeat.
1368
     * con el siguiente parámetro
1369
     * uid = id encriptado del usuario
1370
     * retorna un json en caso de ser  positivo
1371
     * [
1372
     *  'success' : true,
1373
     *  'data' : [
1374
     *     [
1375
     *       'id'                    => 'id del usuario encriptado',
1376
     *       'name'                  => 'nombre del usuario',
1377
     *       'image'                 => 'imagen del usuario',
1378
     *       'type'                  => 'user' //fixed,
1379
     *       'online'                => $online,
1380
     *     ]
1381
     * ]
1382
     * En caso de ser negativo puede haber 2 formatos
1383
     * [
1384
     *  'success' : false,
1385
     *  'data' : mensaje de error
1386
     * ]
1387
     * @return \Laminas\View\Model\JsonModel
1388
     */
1389
    public function contactAvailableGroupListAction()
1390
    {
1391
        $request    = $this->getRequest();
1392
        if($request->isGet()) {
1393
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1394
            $currentUser = $currentUserPlugin->getUser();
1395
 
1396
            $id = $this->params()->fromRoute('group_id');
1397
            if(!$id) {
1398
                return new JsonModel([
1399
                    'success' => false,
1400
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1401
                ]);
1402
            }
1403
 
1404
            $userMapper = UserMapper::getInstance($this->adapter);
1405
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1406
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1407
 
1408
            if(!$chatGroup) {
1409
                return new JsonModel([
1410
                    'success' => false,
1411
                    'data' => 'ERROR_GROUP_NOT_FOUND'
1412
                ]);
1413
            }
1414
 
1415
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1416
            $chatGroupOwner = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
1417
 
1418
            if($chatGroupOwner->user_id != $currentUser->id) {
1419
                return new JsonModel([
1420
                    'success' => false,
1421
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_NOT_OWNER'
1422
                ]);
1423
            }
1424
 
1425
 
1426
 
1427
            $contact_ids = [];
1428
            $contacts = $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
1429
            foreach($contacts as $contact)
1430
            {
1431
                array_push($contact_ids, $contact->user_id);
1432
            }
1433
 
1434
            $connectionMapper = ConnectionMapper::getInstance($this->adapter);
1435
            $connection_ids = $connectionMapper->fetchAllConnectionsByUserReturnIds($currentUser->id);
1436
            $connection_ids = array_filter($connection_ids, function($var) use ( $contact_ids) {
1437
                return !in_array($var, $contact_ids);
1438
            });
1439
 
1440
 
1441
            $items = [];
1442
            foreach ($connection_ids as $connection_id)
1443
            {
1444
                $user = $userMapper->fetchOne($connection_id);
1445
                if (! $user) {
1446
                    continue;
1447
                }
1448
 
1449
                $name   = trim($user->first_name . ' ' . $user->last_name);
1450
                $image  = $this->url()->fromRoute('storage', [
1451
                    'code' => $user->uuid,
1452
                    'type' => 'user',
1453
                    'filename' => $user->image
1454
                ]);
1455
 
1456
 
1457
                if ($this->isInactiveConnection($user->last_heart_beat_at ? $user->last_heart_beat_at : '')) {
1458
                    $userMapper->updateChatOfflineStatus($user->id);
1459
                    $online = false;
1460
                } else {
1461
                    $online = true;
1462
                }
1463
 
1464
 
1465
                array_push($items, [
1466
                    'id'        => $user->uuid,
1467
                    'name'      => $name,
1468
                    'image'     => $image,
1469
                    'online'    => $online,
1470
                ]);
1471
            }
1472
 
1473
 
1474
            return new JsonModel([
1475
                'success' => true,
1476
                'data' => $items,
1477
            ]);
1478
 
1479
        } else {
1480
            return new JsonModel([
1481
                'success' => false,
1482
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1483
            ]);
1484
        }
1485
 
1486
    }
1487
 
1488
    /**
1489
     * Esta función recuperar los contactos de un grupo
1490
     * Es una petición GET el url que contiene el ID encriptado del chat (/chat/get-contact-group-list/:group_id) y la cuál se recibe en la función heartBeat.
1491
     * con el siguiente parámetro
1492
     * uid = id encriptado del usuario
1493
     * retorna un json en caso de ser  positivo
1494
     * [
1495
     *  'success' : true,
1496
     *  'data' : [
1497
     *     [
1498
     *       'url_remove_from_group' => 'url para remover el usuario del grupo',
1499
     *       'id'                    => 'id del usuario encriptado',
1500
     *       'name'                  => 'nombre del usuario',
1501
     *       'image'                 => 'imagen del usuario',
1502
     *       'type'                  => 'user' //fixed,
1503
     *       'online'                => $online,
1504
     *     ]
1505
     * ]
1506
     * En caso de ser negativo puede haber 2 formatos
1507
     * [
1508
     *  'success' : false,
1509
     *  'data' : mensaje de error
1510
     * ]
1511
     * o
1512
     * [
1513
     *  'success' : false,
1514
     *  'data' : [
1515
     *      'fieldname' : [
1516
     *          'mensaje de error'
1517
     *      ]
1518
     *  ]
1519
     * ]
1520
     * @return \Laminas\View\Model\JsonModel
1521
     */
1522
 
1523
    public function contactGroupListAction()
1524
    {
1525
 
1526
        $request    = $this->getRequest();
1527
        if($request->isGet()) {
1528
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1529
            $currentUser = $currentUserPlugin->getUser();
1530
 
1531
            $id = $this->params()->fromRoute('group_id');
1532
            if(!$id) {
1533
                return new JsonModel([
1534
                    'success' => false,
1535
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1536
                ]);
1537
            }
1538
 
1539
            $userMapper = UserMapper::getInstance($this->adapter);
1540
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1541
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1542
 
1543
            if(!$chatGroup) {
1544
                return new JsonModel([
1545
                    'success' => false,
1546
                    'data' => 'ERROR_GROUP_NOT_FOUND'
1547
                ]);
1548
            }
1549
 
1550
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1551
 
1552
            $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
1553
 
1554
            if(!$chatGroupUser) {
1555
                return new JsonModel([
1556
                    'success' => false,
1557
                    'data' => 'ERROR_CHAT_GROUP_USER_NOT_FOUND'
1558
                ]);
1559
            }
1560
 
1561
            $items = [];
1562
            $chatGroupUsers = $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
1563
            foreach ($chatGroupUsers as $chatGroupUser)
1564
            {
1565
                $user = $userMapper->fetchOne((int) $chatGroupUser->user_id);
1566
                if (! $user) {
1567
                    continue;
1568
                }
1569
 
1570
                $name   = trim($user->first_name . ' ' . $user->last_name);
1571
                $image  = $this->url()->fromRoute('storage', [
1572
                    'code' => $user->uuid,
1573
                    'type' => 'user',
1574
                    'filename' => $user->image
1575
                ]);
1576
 
1577
 
1578
                if($chatGroupUser->owner == ChatGroupUser::OWNER_YES) {
1579
                    $url_remove_from_group = '';
1580
 
1581
                } else {
1582
                    $url_remove_from_group = $this->url()->fromRoute('chat/remove-user-from-group', ['group_id' => $chatGroup->uuid, 'user_id' => $user->uuid ]);
1583
                }
1584
 
1585
 
1586
                if ($this->isInactiveConnection($user->last_heart_beat_at ? $user->last_heart_beat_at : '')) {
1587
                    $userMapper->updateChatOfflineStatus($user->id);
1588
                    $online = false;
1589
                } else {
1590
                    $online = true;
1591
                }
1592
 
1593
                array_push($items, [
1594
                    'url_remove_from_group' => $url_remove_from_group,
1595
                    'id'                    => $user->uuid,
1596
                    'name'                  => $name,
1597
                    'image'                 => $image,
1598
                    'online'                => $online,
1599
                ]);
1600
 
1601
            }
1602
 
1603
            return new JsonModel([
1604
                'success' => true,
1605
                'data' => $items,
1606
            ]);
1607
 
1608
        } else {
1609
            return new JsonModel([
1610
                'success' => false,
1611
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1612
            ]);
1613
        }
1614
    }
1615
 
1616
    /**
1617
     * Elimina un grupo de chat, solo el owner puede realizarla
1618
     * Es una petición POST el url que contiene el ID encriptado del chat (/chat/delete-group/:group_id) y la cuál se recibe en la función heartBeat.
1619
     * Parámetros del route
1620
     * :group_id = id del grupo encriptado
1621
     * En caso de una respuesta positiva
1622
     * [
1623
     *      'success' => true,
1624
     *      'data'=> (int) registros_borrados
1625
     * ]
1626
     * En caso de un respuesta negativa
1627
     * [
1628
     *      'success' => false,
1629
     *      'data' => (string) 'mensaje_de_error'
1630
     * ]
1631
     * @return \Laminas\View\Model\JsonModel
1632
     */
1633
    public function deleteGroupAction()
1634
    {
1635
 
1636
        $request    = $this->getRequest();
1637
        if($request->isPost()) {
1638
 
1639
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1640
            $currentUser = $currentUserPlugin->getUser();
1641
 
1642
            $id = trim(filter_var($this->params()->fromRoute('group_id'), FILTER_SANITIZE_STRING));
1643
            if(!$id) {
1644
                return new JsonModel([
1645
                    'success' => false,
1646
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1647
                ]);
1648
            }
1649
 
1650
 
1651
 
1652
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1653
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1654
 
1655
            if(!$chatGroup) {
1656
                return new JsonModel([
1657
                    'success' => false,
1658
                    'data' => 'ERROR_GROUP_NOT_FOUND'
1659
                ]);
1660
            }
1661
 
1662
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1663
            $chatGroupOwner = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
1664
 
1665
            if($chatGroupOwner->user_id != $currentUser->id) {
1666
                return new JsonModel([
1667
                    'success' => false,
1668
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_NOT_OWNER'
1669
                ]);
1670
            }
1671
 
1672
 
1673
            $chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
1674
            $result = $chatGroupUserMessageMapper->deleteAllByGroupId($chatGroup->id);
1675
            if(!$result) {
1676
                return new JsonModel([
1677
                    'success' => false,
1678
                    'data' => $chatGroupUserMessageMapper->getError()
1679
                ]);
1680
            }
1681
 
1682
            $chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
1683
            $result = $chatGroupMessageMapper->deleteAllByGroupId($chatGroup->id);
1684
            if(!$result) {
1685
                return new JsonModel([
1686
                    'success' => false,
1687
                    'data' => $chatGroupMessageMapper->getError()
1688
                ]);
1689
            }
1690
 
1691
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1692
            $result = $chatGroupUserMapper->deleteAllByGroupId($chatGroup->id);
1693
            if(!$result) {
1694
                return new JsonModel([
1695
                    'success' => false,
1696
                    'data' => $chatGroupUserMapper->getError()
1697
                ]);
1698
            }
1699
 
1700
            $chatGroupMapper->deleteByGroupId($chatGroup->id);
1701
            if(!$result) {
1702
                return new JsonModel([
1703
                    'success' => false,
1704
                    'data' => $chatGroupMapper->getError()
1705
                ]);
1706
            }
1707
 
1708
 
1709
            $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
1710
            $dirpath = $fullpath_chat . $chatGroup->uuid;
1711
 
1712
            Functions::rmDirRecursive($dirpath);
1713
 
1714
            return new JsonModel([
1715
                'success' => true
1716
            ]);
1717
 
1718
 
1719
        } else {
1720
            return new JsonModel([
1721
                'success' => false,
1722
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1723
            ]);
1724
 
1725
        }
1726
    }
1727
 
1728
    /**
1729
     * Cerrar el chat, consiste en borrar de la variable de sessión para que el mismo no se presente la siguiente vez abierto ,
1730
     * al menos que tenga mensajes sin leer
1731
     * Es una petición POST el url que contiene el ID encriptado del chat (/chat/close/:id)  y la cuál se recibe en la función heartBeat.
1732
     * Parámetros del route
1733
     * :id = id del chat encriptado
1734
     * En caso de una respuesta positiva
1735
     * [
1736
     *  'success' => true
1737
     * ]
1738
     * En caso de un respuesta negativa
1739
     * [
1740
     *  'success' => false,
1741
     *  'data'  => mensaje_de_error
1742
     * ]
1743
     * @return \Laminas\View\Model\JsonModel
1744
     */
1745
    public function closeAction()
1746
    {
1747
        $request    = $this->getRequest();
1748
        if($request->isPost()) {
1749
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1750
            $currentUser = $currentUserPlugin->getUser();
1751
 
1752
            $id = filter_var($this->params()->fromRoute('id'), FILTER_SANITIZE_STRING);
1753
 
1754
            if (!$id) {
1755
                return new JsonModel([
1756
                    'success' => false,
1757
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1758
                ]);
1759
            }
1760
 
1761
            $uuid = '';
1762
 
1763
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1764
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1765
            if ($chatGroup) {
1766
                $uuid = $chatGroup->uuid;
1767
            } else {
1768
 
1769
                $userMapper = UserMapper::getInstance($this->adapter);
1770
                $user = $userMapper->fetchOneByUuid($id);
1771
                if(!$user) {
1772
                    return new JsonModel([
1773
                        'success' => false,
1774
                        'data' => 'ERROR_USER_NOT_FOUND'
1775
                    ]);
1776
                }
1777
 
1778
 
1779
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
1780
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1781
                if($chatUser) {
1782
                    $uuid = $chatUser->uuid;
1783
                }
1784
            }
1785
 
1786
            if($uuid) {
1787
                $_SESSION[self::SESSION_CHAT_OPEN_BOXES] = array_filter($_SESSION[self::SESSION_CHAT_OPEN_BOXES], function($var) use($uuid)  {
1788
                    return $uuid != $var;
1789
                });
1790
            }
1791
 
1792
            return new JsonModel([
1793
                'success' => true
1794
            ]);
1795
        } else {
1796
            return new JsonModel([
1797
                'success' => false,
1798
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1799
            ]);
1800
        }
1801
    }
1802
 
1803
    /**
1804
     * Clear como su nombre lo indica es borrar los mensajes entre el usuario actual y otro usuario con quien sostiene el chat
1805
     * Es una petición POST el url que contiene el ID encriptado del chat (/chat/clear/:id) y la cuál se recibe en la función heartBeat.
1806
     * Parámetros del route
1807
     * :id = id del usuario encriptado
1808
     * En caso de una respuesta positiva
1809
     * [
1810
     *      'success' => true,
1811
     *      'data'=> (int) registros_borrados
1812
     * ]
1813
     * En caso de un respuesta negativa
1814
     * [
1815
     *      'success' => false,
1816
     *      'data' => (string) 'mensaje_de_error'
1817
     * ]
1818
     * @return \Laminas\View\Model\JsonModel
1819
     */
1820
    public function clearAction()
1821
    {
1822
        $request    = $this->getRequest();
1823
        if($request->isPost()) {
1824
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1825
            $currentUser = $currentUserPlugin->getUser();
1826
 
1827
            $id = filter_var($this->params()->fromRoute('id'), FILTER_SANITIZE_STRING);
1828
 
1829
            if (!$id) {
1830
                return new JsonModel([
1831
                    'success' => false,
1832
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1833
                ]);
1834
            }
1835
 
1836
            $uuid = '';
1837
 
1838
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1839
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1840
            if ($chatGroup) {
1841
                $uuid = $chatGroup->uuid;
1842
            } else {
1843
 
1844
                $userMapper = UserMapper::getInstance($this->adapter);
1845
                $user = $userMapper->fetchOneByUuid($id);
1846
                if(!$user) {
1847
                    return new JsonModel([
1848
                        'success' => false,
1849
                        'data' => 'ERROR_USER_NOT_FOUND'
1850
                    ]);
1851
                }
1852
 
1853
 
1854
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
1855
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1856
                if($chatUser) {
1857
                    $uuid = $chatUser->uuid;
1858
                }
1859
            }
1860
 
1861
            if($uuid) {
1862
                $_SESSION[self::SESSION_CHAT_OPEN_BOXES] = array_filter($_SESSION[self::SESSION_CHAT_OPEN_BOXES], function($var) use($uuid)  {
1863
                    return $uuid != $var;
1864
                });
1865
            }
1866
 
1867
            return new JsonModel([
1868
                'success' => true
1869
            ]);
1870
        } else {
1871
            return new JsonModel([
1872
                'success' => false,
1873
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1874
            ]);
1875
        }
1876
    }
1877
 
1878
    public function uploadAction()
1879
    {
1880
        $request    = $this->getRequest();
1881
        if($request->isPost()) {
1882
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1883
            $currentUser = $currentUserPlugin->getUser();
1884
 
1885
            $id = filter_var($this->params()->fromRoute('id'), FILTER_SANITIZE_STRING);
1886
            if (!$id) {
1887
                return new JsonModel([
1888
                    'success' => false,
1889
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1890
                ]);
1891
            }
1892
 
1893
            $files = $this->getRequest()->getFiles()->toArray();
1894
            if(!isset($files['file']) || !empty($files['file']['error'])) {
1895
                return new JsonModel([
1896
                    'success' => false,
1897
                    'data' => 'ERROR_FILE_NOT_UPLOAD'
1898
                ]);
1899
            }
1900
 
1901
            $tmp_filename   = $files['file']['tmp_name'];
1902
            if(!$this->validMimeType($tmp_filename)) {
1903
                return new JsonModel([
1904
                    'success' => false,
1905
                    'data' => 'ERROR_FILE_UPLODED_IS_NOT_VALID'
1906
                ]);
1907
            }
1908
 
1909
 
1910
            $extensions     = explode('.', $files['file']['name']);
1911
            $extension      = strtolower(trim($extensions[count($extensions) - 1]));
1912
            $filename       = uniqid() . '.' . $extension;
1913
 
1914
 
1915
            $mime_type = mime_content_type($tmp_filename);
1916
            if($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {
1917
                $file_type = 'image';
1918
            } else if($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {
1919
                $file_type = 'video';
1920
            } else if($mime_type == 'application/pdf') {
1921
                $file_type = 'document';
1922
            }
1923
 
1924
 
1925
            $userMapper = UserMapper::getInstance($this->adapter);
1926
            $sender_result = $userMapper->fetchOne($currentUser->id);
1927
            $sender_from = trim($sender_result->first_name . ' ' . $sender_result->last_name);
1928
            $sender_pic = $this->url()->fromRoute('storage', [
1929
                'code' => $sender_result->uuid,
1930
                'type' => 'user',
1931
                'filename' => $sender_result->image
1932
            ]);
1933
 
1934
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1935
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1936
            if($chatGroup) {
1937
 
1938
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1939
                $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
1940
 
1941
                if(!$chatGroupUser) {
1942
                    return new JsonModel([
1943
                        'success' => false,
1944
                        'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
1945
                    ]);
1946
                }
1947
 
1948
 
1949
                $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
1950
                $dirpath = $fullpath_chat . $chatGroup->uuid;
1951
                if (! file_exists($dirpath)) {
1952
                    mkdir($dirpath, 0777, true);
1953
                    chmod($dirpath, 0777);
1954
                }
1955
 
1956
                $full_filename = $dirpath . DIRECTORY_SEPARATOR . $filename;
1957
                if(!move_uploaded_file($tmp_filename, $full_filename)) {
1958
                    return new JsonModel([
1959
                        'success' => false,
1960
                        'data' => 'ERROR_FILE_UPLOADED_NOT_MOVE'
1961
                    ]);
1962
                }
1963
 
1964
                $chatGroupMessage = new ChatGroupMessage();
1965
                $chatGroupMessage->sender_id    = $currentUser->id;
1966
                $chatGroupMessage->group_id     = $chatGroup->id;
1967
                $chatGroupMessage->content      = $filename;
1968
                $chatGroupMessage->type         = $file_type;
1969
 
1970
                $chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
1971
                $result = $chatGroupMessageMapper->insert($chatGroupMessage);
1972
                if(!$result) {
1973
                    return new JsonModel([
1974
                        'success' => false,
1975
                        'data' => $chatGroupMessageMapper->getError()
1976
                    ]);
1977
                }
1978
 
1979
                $chatGroupMessage = $chatGroupMessageMapper->fetchOne($chatGroupMessage->id);
1980
 
1981
 
1982
                $chatGroupUserMessage = new ChatGroupUserMessage();
1983
                $chatGroupUserMessage->group_id = $chatGroupMessage->group_id;
1984
                $chatGroupUserMessage->message_id = $chatGroupMessage->id;
1985
                $chatGroupUserMessage->receiver_id = $currentUser->id;
1986
                $chatGroupUserMessage->recd = ChatGroupUserMessage::RECD_YES;
1987
                $chatGroupUserMessage->seen = ChatGroupUserMessage::SEEN_YES;
1988
 
1989
 
1990
                $chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
1991
                $result = $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
1992
                if(!$result) {
1993
                    return new JsonModel([
1994
                        'success' => false,
1995
                        'data' => $chatGroupUserMessageMapper->getError()
1996
                    ]);
1997
                }
1998
 
1999
 
2000
 
2001
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2002
 
2003
                $results = $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
2004
                foreach ($results as $r)
2005
                {
2006
                    if ($r->user_id != $currentUser->id) {
2007
                        $chatGroupUserMessage = new ChatGroupUserMessage();
2008
                        $chatGroupUserMessage->group_id = $chatGroupMessage->group_id;
2009
                        $chatGroupUserMessage->message_id = $chatGroupMessage->id;
2010
                        $chatGroupUserMessage->receiver_id= $r->user_id;
2011
                        $chatGroupUserMessage->recd = ChatGroupUserMessage::RECD_NO;
2012
                        $chatGroupUserMessage->seen = ChatGroupUserMessage::SEEN_NO;
2013
 
2014
                        $result = $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
2015
                        if(!$result) {
2016
                            return new JsonModel([
2017
                                'success' => false,
2018
                                'data' => $chatGroupUserMessageMapper->getError()
2019
                            ]);
2020
                        }
2021
 
2022
 
2023
                    }
2024
                }
2025
 
2026
                $msgtime = $this->timeAgo(date('Y-m-d H:i:s'));
2027
                return new JsonModel([
2028
                    'success' => true,
2029
                    'data' => [
2030
                        'user_name'     => $sender_from,
2031
                        'user_id'       => $currentUser->uuid,
2032
                        'user_image'    => $sender_pic,
2033
                        'u'             => 1,
2034
                        'mtype'         => $file_type,
2035
                        'm'             => $this->url()->fromRoute('storage', ['code' => $chatGroup->uuid, 'type' => 'chat', 'filename' => $filename]),
2036
                        'time'          => $msgtime,
2037
                        'id'            => $chatGroupMessage->uuid
2038
                    ]
2039
                ]);
2040
 
2041
 
2042
            } else {
2043
 
2044
                $user = $userMapper->fetchOneByUuid($id);
2045
                if(!$user) {
2046
                    return new JsonModel([
2047
                        'success' => false,
2048
                        'data' => 'ERROR_USER_NOT_FOUND'
2049
                    ]);
2050
                }
2051
 
2052
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2053
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2054
                if(!$chatUser) {
2055
                    return new JsonModel([
2056
                        'success' => false,
2057
                        'data' => 'ERROR_CHAT_NOT_FOUND'
2058
                    ]);
2059
                }
2060
 
2061
                $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
2062
                $dirpath = $fullpath_chat . $chatUser->uuid;
2063
 
2064
                if (! file_exists($dirpath)) {
2065
                    mkdir($dirpath, 0777, true);
2066
                    chmod($dirpath, 0777);
2067
                }
2068
 
2069
                $full_filename = $dirpath . DIRECTORY_SEPARATOR . $filename;
2070
                if(!move_uploaded_file($tmp_filename, $full_filename)) {
2071
                    return new JsonModel([
2072
                        'success' => false,
2073
                        'data' => 'ERROR_FILE_UPLOADED_NOT_MOVE'
2074
                    ]);
2075
                }
2076
 
2077
                $chatMessage = new ChatMessage();
2078
                $chatMessage->chat_id = $chatUser->id;
2079
                $chatMessage->from_id = $currentUser->id;
2080
                $chatMessage->to_id = $user->id;
2081
                $chatMessage->content = $filename;
2082
                $chatMessage->type = $file_type;
2083
                $chatMessage->recd = ChatMessage::RECD_NO;
2084
                $chatMessage->seen = ChatMessage::SEEN_NO;
2085
 
2086
 
2087
                $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
2088
                $result = $chatMessageMapper->insert($chatMessage);
2089
                if(!$result) {
2090
                    return new JsonModel([
2091
                        'success' => false,
2092
                        'data' =>  $chatMessageMapper->getError()
2093
                    ]);
2094
                }
2095
 
2096
                $chatMessage = $chatMessageMapper->fetchOne($chatMessage->id);
2097
 
2098
 
2099
                $msgtime = $this->timeAgo(date('Y-m-d H:i:s'));
2100
                return new JsonModel([
2101
                    'success' => true,
2102
                    'data' => [
2103
                        'user_name' => $sender_from,
2104
                        'user_id' => $currentUser->uuid,
2105
                        'user_image' => $sender_pic,
2106
                        'u' => 1,
2107
                        'mtype' => $file_type,
2108
                        'm' => $this->url()->fromRoute('storage', ['code' => $currentUser->uuid, 'type' => 'chat', 'filename' => $filename]),
2109
                        'time' => $msgtime,
2110
                        'id' => $chatMessage->uuid
2111
                    ]
2112
                ]);
2113
 
2114
            }
2115
        } else {
2116
            return new JsonModel([
2117
                'success' => false,
2118
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2119
            ]);
2120
        }
2121
    }
2122
 
2123
    public function markSeenAction()
2124
    {
2125
        $request = $this->getRequest();
2126
        if($request->isPost()) {
2127
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2128
            $currentUser = $currentUserPlugin->getUser();
2129
 
2130
            $id = $this->params()->fromRoute('id');
2131
            if (!$id) {
2132
                return new JsonModel([
2133
                    'success' => false,
2134
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2135
                ]);
2136
            }
2137
 
2138
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2139
            $chatGroup =  $chatGroupMapper->fetchOneByUuid($id);
2140
 
2141
            if($chatGroup) {
2142
 
2143
                $charGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2144
                $chatGroupUser = $charGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2145
 
2146
                if(!$chatGroupUser) {
2147
                    return new JsonModel([
2148
                        'success' => false,
2149
                        'data' =>  'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
2150
                    ]);
2151
                }
2152
 
2153
                $charGroupUserMessage = ChatGroupUserMessageMapper::getInstance($this->adapter);
2154
                $result = $charGroupUserMessage->markAsSeenByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2155
                if($result) {
2156
                    return new JsonModel([
2157
                        'success' => true,
2158
                    ]);
2159
                } else {
2160
                    return new JsonModel([
2161
                        'success' => false,
2162
                        'data' =>  $charGroupUserMessage->getError()
2163
                    ]);
2164
                }
2165
 
2166
 
2167
            } else {
2168
                $userMapper = UserMapper::getInstance($this->adapter);
2169
                $user = $userMapper->fetchOneByUuid($id);
2170
 
2171
                if(!$user) {
2172
                    return new JsonModel([
2173
                        'success' => false,
2174
                        'data' => 'ERROR_USER_NOT_FOUND'
2175
                    ]);
2176
                }
2177
 
2178
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2179
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2180
                if(!$chatUser) {
2181
                    return new JsonModel([
2182
                        'success' => false,
2183
                        'data' => 'ERROR_CHAT_NOT_FOUND'
2184
                    ]);
2185
                }
2186
 
2187
                $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
2188
                $result = $chatMessageMapper->markAsSeenByChatIdAndToId($chatUser->id, $currentUser->id);
2189
                if($result) {
2190
                    return new JsonModel([
2191
                        'success' => true,
2192
                    ]);
2193
                } else {
2194
                    return new JsonModel([
2195
                        'success' => false,
2196
                        'data' =>  $charGroupUserMessage->getError()
2197
                    ]);
2198
                }
2199
 
2200
            }
2201
 
2202
 
2203
        } else {
2204
            $response = [
2205
                'success' => false,
2206
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2207
            ];
2208
        }
2209
 
2210
        return new JsonModel($response);
2211
    }
2212
 
2213
 
2214
    public function markReceivedAction()
2215
    {
2216
        $request = $this->getRequest();
2217
        if($request->isPost()) {
2218
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2219
            $currentUser = $currentUserPlugin->getUser();
2220
 
2221
            $id = $this->params()->fromRoute('id');
2222
            if (!$id) {
2223
                return new JsonModel([
2224
                    'success' => false,
2225
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2226
                ]);
2227
            }
2228
 
2229
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2230
            $chatGroup =  $chatGroupMapper->fetchOneByUuid($id);
2231
 
2232
            if($chatGroup) {
2233
 
2234
                $charGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2235
                $chatGroupUser = $charGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2236
 
2237
                if(!$chatGroupUser) {
2238
                    return new JsonModel([
2239
                        'success' => false,
2240
                        'data' =>  'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
2241
                    ]);
2242
                }
2243
 
2244
                $charGroupUserMessage = ChatGroupUserMessageMapper::getInstance($this->adapter);
2245
                $result = $charGroupUserMessage->markAsReceivedByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2246
                if($result) {
2247
                    return new JsonModel([
2248
                        'success' => true,
2249
                    ]);
2250
                } else {
2251
                    return new JsonModel([
2252
                        'success' => false,
2253
                        'data' =>  $charGroupUserMessage->getError()
2254
                    ]);
2255
                }
2256
 
2257
 
2258
            } else {
2259
                $userMapper = UserMapper::getInstance($this->adapter);
2260
                $user = $userMapper->fetchOneByUuid($id);
2261
 
2262
                if(!$user) {
2263
                    return new JsonModel([
2264
                        'success' => false,
2265
                        'data' => 'ERROR_USER_NOT_FOUND'
2266
                    ]);
2267
                }
2268
 
2269
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2270
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2271
                if(!$chatUser) {
2272
                    return new JsonModel([
2273
                        'success' => false,
2274
                        'data' => 'ERROR_CHAT_NOT_FOUND'
2275
                    ]);
2276
                }
2277
 
2278
                $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
2279
                $result = $chatMessageMapper->markAsReceivedByChatIdAndToId($chatUser->id, $currentUser->id);
2280
                if($result) {
2281
                    return new JsonModel([
2282
                        'success' => true,
2283
                    ]);
2284
                } else {
2285
                    return new JsonModel([
2286
                        'success' => false,
2287
                        'data' =>  $charGroupUserMessage->getError()
2288
                    ]);
2289
                }
2290
 
2291
            }
2292
 
2293
 
2294
        } else {
2295
            $response = [
2296
                'success' => false,
2297
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2298
            ];
2299
        }
2300
 
2301
        return new JsonModel($response);
2302
    }
2303
 
2304
 
2305
 
2306
    /**
2307
     *
2308
     * @param string $file
2309
     * @return boolean
2310
     */
2311
    private function validMimeType($file)
2312
    {
2313
        /*
2314
         * image/jpeg jpeg jpg jpe
2315
         * image/gif gif
2316
         * image/png png
2317
         * video/mp4
2318
         * audio/mpeg mpga mp2 mp2a mp3 m2a m3a
2319
         * video/x-flv flv
2320
         * application/msword doc dot
2321
         * application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
2322
         * application/vnd.ms-excel xls xlm xla xlc xlt xlw
2323
         * application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
2324
         * application/vnd.ms-powerpoint ppt pps pot
2325
         * application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
2326
         * application/pdf pdf
2327
         */
2328
        $mime = mime_content_type($file);
2329
        $valid = false;
2330
        $types = [
2331
            'image/jpeg',
2332
            'image/gif',
2333
            'image/png',
2334
            'video/mp4',
2335
            'audio/mpeg',
2336
            'video/x-flv',
2337
            'application/msword',
2338
            'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
2339
            'application/vnd.ms-excel',
2340
            'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
2341
            'application/vnd.ms-powerpoint',
2342
            'application/vnd.openxmlformats-officedocument.presentationml.presentation',
2343
            'application/pdf'
2344
        ];
2345
        foreach ($types as $t) {
2346
            if (strpos($mime, $t) !== false) {
2347
                $valid = true;
2348
                break;
2349
            }
2350
        }
2351
        return $valid;
2352
    }
2353
 
2354
    /**
2355
     *
2356
     * @param string $text
2357
     * @return string
2358
     */
2359
    private function sanitize($text)
2360
    {
2361
        $text = htmlspecialchars($text, ENT_QUOTES);
2362
        $text = str_replace("\n\r", "\n", $text);
2363
        $text = str_replace("\r\n", "\n", $text);
2364
        $text = str_replace("\n", "<br>", $text);
2365
        return $text;
2366
    }
2367
 
2368
    /**
2369
     *
2370
     * @param string $timestamp
2371
     * @return string
2372
     */
2373
    private function timeAgo($timestamp)
2374
    {
2375
        $datetime1 = new \DateTime("now");
2376
        $datetime2 = date_create($timestamp);
2377
        $diff = date_diff($datetime1, $datetime2);
2378
        $timemsg = '';
2379
        if ($diff->y > 0) {
2380
            $timemsg = $diff->y . ' anio' . ($diff->y > 1 ? "s" : '');
2381
        } else if ($diff->m > 0) {
2382
            $timemsg = $diff->m . ' mes' . ($diff->m > 1 ? "s" : '');
2383
        } else if ($diff->d > 0) {
2384
            $timemsg = $diff->d . ' dia' . ($diff->d > 1 ? "s" : '');
2385
        } else if ($diff->h > 0) {
2386
            $timemsg = $diff->h . ' hora' . ($diff->h > 1 ? "s" : '');
2387
        } else if ($diff->i > 0) {
2388
            $timemsg = $diff->i . ' minuto' . ($diff->i > 1 ? "s" : '');
2389
        } else if ($diff->s > 0) {
2390
            $timemsg = $diff->s . ' segundo' . ($diff->s > 1 ? "s" : '');
2391
        }
2392
        if (!$timemsg) {
2393
            $timemsg = "Ahora";
2394
        } else {
2395
            $timemsg = $timemsg . '';
2396
        }
2397
        return $timemsg;
2398
    }
2399
 
2400
    /**
2401
     *
2402
     * @param string $timestamp
2403
     * @return boolean
2404
     */
2405
    private function isInactiveConnection($timestamp)
2406
    {
2407
        if (empty($timestamp)) {
2408
            return true;
2409
        }
2410
 
2411
        $now = date('Y-m-d H:i:s');
2412
        $datetime1 = date_create($now);
2413
        $datetime2 = date_create($timestamp);
2414
        $diff = date_diff($datetime1, $datetime2);
2415
 
2416
        if ($diff->y > 0 || $diff->m > 0 || $diff->d > 0 || $diff->h > 0 || $diff->i > 0) {
2417
            return true;
2418
        }
2419
 
2420
        return ($diff->s) > 15 ? true : false;
2421
    }
2422
}