Proyectos de Subversion LeadersLinked - Backend

Rev

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

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