Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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