Proyectos de Subversion LeadersLinked - Backend

Rev

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