Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 3116 | Rev 3121 | 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
 
3116 efrain 1412
            if($currentUser->id == $chatUser->user_id1) {
3117 efrain 1413
                $chatUserMapper->markIsOpen2($chatUser->id);
3116 efrain 1414
            } else {
3117 efrain 1415
                $chatUserMapper->markIsOpen1($chatUser->id);
3116 efrain 1416
            }
1417
 
1418
 
3086 efrain 1419
            $userMapper->updateLastActivity($currentUser->id);
1420
 
1 www 1421
            return new JsonModel($response);
1422
 
1423
        } else {
1424
            return new JsonModel([
1425
                'success' => false,
1426
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1427
            ]);
1428
        }
1429
 
1430
    }
1431
 
1432
    /**
1433
     * Esta función recuperar los contactos disponibles para agregarlos a un grupo
1434
     * 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.
1435
     * con el siguiente parámetro
1436
     * uid = id encriptado del usuario
1437
     * retorna un json en caso de ser  positivo
1438
     * [
1439
     *  'success' : true,
1440
     *  'data' : [
1441
     *     [
1442
     *       'id'                    => 'id del usuario encriptado',
1443
     *       'name'                  => 'nombre del usuario',
1444
     *       'image'                 => 'imagen del usuario',
1445
     *       'type'                  => 'user' //fixed,
1446
     *       'online'                => $online,
1447
     *     ]
1448
     * ]
1449
     * En caso de ser negativo puede haber 2 formatos
1450
     * [
1451
     *  'success' : false,
1452
     *  'data' : mensaje de error
1453
     * ]
1454
     * @return \Laminas\View\Model\JsonModel
1455
     */
1456
    public function contactAvailableGroupListAction()
1457
    {
1458
        $request    = $this->getRequest();
1459
        if($request->isGet()) {
1460
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1461
            $currentUser = $currentUserPlugin->getUser();
1462
 
1463
            $id = $this->params()->fromRoute('group_id');
1464
            if(!$id) {
1465
                return new JsonModel([
1466
                    'success' => false,
1467
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1468
                ]);
1469
            }
1470
 
1471
            $userMapper = UserMapper::getInstance($this->adapter);
1472
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1473
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1474
 
1475
            if(!$chatGroup) {
1476
                return new JsonModel([
1477
                    'success' => false,
1478
                    'data' => 'ERROR_GROUP_NOT_FOUND'
1479
                ]);
1480
            }
1481
 
1482
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1483
            $chatGroupOwner = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
1484
 
1485
            if($chatGroupOwner->user_id != $currentUser->id) {
1486
                return new JsonModel([
1487
                    'success' => false,
1488
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_NOT_OWNER'
1489
                ]);
1490
            }
1491
 
1492
 
1493
 
1494
            $contact_ids = [];
1495
            $contacts = $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
1496
            foreach($contacts as $contact)
1497
            {
1498
                array_push($contact_ids, $contact->user_id);
1499
            }
1500
 
1501
            $connectionMapper = ConnectionMapper::getInstance($this->adapter);
1502
            $connection_ids = $connectionMapper->fetchAllConnectionsByUserReturnIds($currentUser->id);
1503
            $connection_ids = array_filter($connection_ids, function($var) use ( $contact_ids) {
1504
                return !in_array($var, $contact_ids);
1505
            });
1506
 
1507
 
1508
            $items = [];
1509
            foreach ($connection_ids as $connection_id)
1510
            {
1511
                $user = $userMapper->fetchOne($connection_id);
1512
                if (! $user) {
1513
                    continue;
1514
                }
1515
 
1516
                $name   = trim($user->first_name . ' ' . $user->last_name);
1517
                $image  = $this->url()->fromRoute('storage', [
1518
                    'code' => $user->uuid,
1519
                    'type' => 'user',
1520
                    'filename' => $user->image
1521
                ]);
1522
 
1523
 
1524
                array_push($items, [
1525
                    'id'        => $user->uuid,
1526
                    'name'      => $name,
1527
                    'image'     => $image,
3086 efrain 1528
                    'online'    => $user->online ? 1 : 0,
1 www 1529
                ]);
1530
            }
1531
 
1532
 
3086 efrain 1533
 
1534
            $userMapper->updateLastActivity($currentUser->id);
1535
 
1 www 1536
            return new JsonModel([
1537
                'success' => true,
1538
                'data' => $items,
1539
            ]);
1540
 
1541
        } else {
1542
            return new JsonModel([
1543
                'success' => false,
1544
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1545
            ]);
1546
        }
1547
 
1548
    }
1549
 
1550
    /**
1551
     * Esta función recuperar los contactos de un grupo
1552
     * 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.
1553
     * con el siguiente parámetro
1554
     * uid = id encriptado del usuario
1555
     * retorna un json en caso de ser  positivo
1556
     * [
1557
     *  'success' : true,
1558
     *  'data' : [
1559
     *     [
1560
     *       'url_remove_from_group' => 'url para remover el usuario del grupo',
1561
     *       'id'                    => 'id del usuario encriptado',
1562
     *       'name'                  => 'nombre del usuario',
1563
     *       'image'                 => 'imagen del usuario',
1564
     *       'type'                  => 'user' //fixed,
1565
     *       'online'                => $online,
1566
     *     ]
1567
     * ]
1568
     * En caso de ser negativo puede haber 2 formatos
1569
     * [
1570
     *  'success' : false,
1571
     *  'data' : mensaje de error
1572
     * ]
1573
     * o
1574
     * [
1575
     *  'success' : false,
1576
     *  'data' : [
1577
     *      'fieldname' : [
1578
     *          'mensaje de error'
1579
     *      ]
1580
     *  ]
1581
     * ]
1582
     * @return \Laminas\View\Model\JsonModel
1583
     */
1584
 
1585
    public function contactGroupListAction()
1586
    {
1587
 
1588
        $request    = $this->getRequest();
1589
        if($request->isGet()) {
1590
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1591
            $currentUser = $currentUserPlugin->getUser();
1592
 
1593
            $id = $this->params()->fromRoute('group_id');
1594
            if(!$id) {
1595
                return new JsonModel([
1596
                    'success' => false,
1597
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1598
                ]);
1599
            }
1600
 
1601
            $userMapper = UserMapper::getInstance($this->adapter);
1602
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1603
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1604
 
1605
            if(!$chatGroup) {
1606
                return new JsonModel([
1607
                    'success' => false,
1608
                    'data' => 'ERROR_GROUP_NOT_FOUND'
1609
                ]);
1610
            }
1611
 
1612
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1613
 
1614
            $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
1615
 
1616
            if(!$chatGroupUser) {
1617
                return new JsonModel([
1618
                    'success' => false,
1619
                    'data' => 'ERROR_CHAT_GROUP_USER_NOT_FOUND'
1620
                ]);
1621
            }
1622
 
1623
            $items = [];
1624
            $chatGroupUsers = $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
1625
            foreach ($chatGroupUsers as $chatGroupUser)
1626
            {
1627
                $user = $userMapper->fetchOne((int) $chatGroupUser->user_id);
1628
                if (! $user) {
1629
                    continue;
1630
                }
1631
 
1632
                $name   = trim($user->first_name . ' ' . $user->last_name);
1633
                $image  = $this->url()->fromRoute('storage', [
1634
                    'code' => $user->uuid,
1635
                    'type' => 'user',
1636
                    'filename' => $user->image
1637
                ]);
1638
 
1639
 
1640
                if($chatGroupUser->owner == ChatGroupUser::OWNER_YES) {
1641
                    $url_remove_from_group = '';
1642
 
1643
                } else {
1644
                    $url_remove_from_group = $this->url()->fromRoute('chat/remove-user-from-group', ['group_id' => $chatGroup->uuid, 'user_id' => $user->uuid ]);
1645
                }
1646
 
1647
 
1648
                array_push($items, [
1649
                    'url_remove_from_group' => $url_remove_from_group,
1650
                    'id'                    => $user->uuid,
1651
                    'name'                  => $name,
1652
                    'image'                 => $image,
3086 efrain 1653
                    'online'                => $user->online ? 1 : 0,
1 www 1654
                ]);
1655
 
1656
            }
3086 efrain 1657
 
1658
            $userMapper->updateLastActivity($currentUser->id);
1 www 1659
 
1660
            return new JsonModel([
1661
                'success' => true,
1662
                'data' => $items,
1663
            ]);
1664
 
1665
        } else {
1666
            return new JsonModel([
1667
                'success' => false,
1668
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1669
            ]);
1670
        }
1671
    }
1672
 
1673
    /**
1674
     * Elimina un grupo de chat, solo el owner puede realizarla
1675
     * 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.
1676
     * Parámetros del route
1677
     * :group_id = id del grupo encriptado
1678
     * En caso de una respuesta positiva
1679
     * [
1680
     *      'success' => true,
1681
     *      'data'=> (int) registros_borrados
1682
     * ]
1683
     * En caso de un respuesta negativa
1684
     * [
1685
     *      'success' => false,
1686
     *      'data' => (string) 'mensaje_de_error'
1687
     * ]
1688
     * @return \Laminas\View\Model\JsonModel
1689
     */
1690
    public function deleteGroupAction()
1691
    {
1692
 
1693
        $request    = $this->getRequest();
1694
        if($request->isPost()) {
1695
 
1696
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1697
            $currentUser = $currentUserPlugin->getUser();
1698
 
1699
            $id = trim(filter_var($this->params()->fromRoute('group_id'), FILTER_SANITIZE_STRING));
1700
            if(!$id) {
1701
                return new JsonModel([
1702
                    'success' => false,
1703
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1704
                ]);
1705
            }
1706
 
1707
 
1708
 
1709
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1710
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1711
 
1712
            if(!$chatGroup) {
1713
                return new JsonModel([
1714
                    'success' => false,
1715
                    'data' => 'ERROR_GROUP_NOT_FOUND'
1716
                ]);
1717
            }
1718
 
1719
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1720
            $chatGroupOwner = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
1721
 
1722
            if($chatGroupOwner->user_id != $currentUser->id) {
1723
                return new JsonModel([
1724
                    'success' => false,
1725
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_NOT_OWNER'
1726
                ]);
1727
            }
1728
 
1729
 
1730
            $chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
1731
            $result = $chatGroupUserMessageMapper->deleteAllByGroupId($chatGroup->id);
1732
            if(!$result) {
1733
                return new JsonModel([
1734
                    'success' => false,
1735
                    'data' => $chatGroupUserMessageMapper->getError()
1736
                ]);
1737
            }
1738
 
1739
            $chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
1740
            $result = $chatGroupMessageMapper->deleteAllByGroupId($chatGroup->id);
1741
            if(!$result) {
1742
                return new JsonModel([
1743
                    'success' => false,
1744
                    'data' => $chatGroupMessageMapper->getError()
1745
                ]);
1746
            }
1747
 
1748
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1749
            $result = $chatGroupUserMapper->deleteAllByGroupId($chatGroup->id);
1750
            if(!$result) {
1751
                return new JsonModel([
1752
                    'success' => false,
1753
                    'data' => $chatGroupUserMapper->getError()
1754
                ]);
1755
            }
1756
 
1757
            $chatGroupMapper->deleteByGroupId($chatGroup->id);
1758
            if(!$result) {
1759
                return new JsonModel([
1760
                    'success' => false,
1761
                    'data' => $chatGroupMapper->getError()
1762
                ]);
1763
            }
1764
 
1765
 
1766
            $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
1767
            $dirpath = $fullpath_chat . $chatGroup->uuid;
1768
 
1769
            Functions::rmDirRecursive($dirpath);
1770
 
3086 efrain 1771
 
1772
            $userMapper = UserMapper::getInstance($this->adapter);
1773
            $userMapper->updateLastActivity($currentUser->id);
1774
 
1 www 1775
            return new JsonModel([
1776
                'success' => true
1777
            ]);
1778
 
1779
 
1780
        } else {
1781
            return new JsonModel([
1782
                'success' => false,
1783
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1784
            ]);
1785
 
1786
        }
1787
    }
1788
 
1789
    /**
1790
     * Cerrar el chat, consiste en borrar de la variable de sessión para que el mismo no se presente la siguiente vez abierto ,
1791
     * al menos que tenga mensajes sin leer
1792
     * 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.
1793
     * Parámetros del route
1794
     * :id = id del chat encriptado
1795
     * En caso de una respuesta positiva
1796
     * [
1797
     *  'success' => true
1798
     * ]
1799
     * En caso de un respuesta negativa
1800
     * [
1801
     *  'success' => false,
1802
     *  'data'  => mensaje_de_error
1803
     * ]
1804
     * @return \Laminas\View\Model\JsonModel
1805
     */
1806
    public function closeAction()
1807
    {
1808
        $request    = $this->getRequest();
1809
        if($request->isPost()) {
1810
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1811
            $currentUser = $currentUserPlugin->getUser();
1812
 
1813
            $id = filter_var($this->params()->fromRoute('id'), FILTER_SANITIZE_STRING);
1814
 
1815
            if (!$id) {
1816
                return new JsonModel([
1817
                    'success' => false,
1818
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1819
                ]);
1820
            }
1821
 
1822
 
1823
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1824
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1825
            if ($chatGroup) {
3099 efrain 1826
 
1827
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1828
                $chatGroupUserMapper->markIsClose($chatGroup->id, $currentUser->id);
1829
 
1830
 
1 www 1831
            } else {
1832
 
1833
                $userMapper = UserMapper::getInstance($this->adapter);
1834
                $user = $userMapper->fetchOneByUuid($id);
1835
                if(!$user) {
1836
                    return new JsonModel([
1837
                        'success' => false,
1838
                        'data' => 'ERROR_USER_NOT_FOUND'
1839
                    ]);
1840
                }
1841
 
1842
 
1843
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
1844
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1845
                if($chatUser) {
3099 efrain 1846
 
1847
                    if($currentUser->id == $chatUser->user_id1) {
3113 efrain 1848
                        $chatUserMapper->markIsClose1($chatUser->id);
1849
                    } else {
3112 efrain 1850
                        $chatUserMapper->markIsClose2($chatUser->id);
3099 efrain 1851
                    }
1852
 
1853
 
1 www 1854
                }
1855
            }
1856
 
3086 efrain 1857
 
1858
            $userMapper->updateLastActivity($currentUser->id);
1 www 1859
 
1860
            return new JsonModel([
1861
                'success' => true
1862
            ]);
1863
        } else {
1864
            return new JsonModel([
1865
                'success' => false,
1866
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1867
            ]);
1868
        }
1869
    }
1870
 
1871
    /**
1872
     * Clear como su nombre lo indica es borrar los mensajes entre el usuario actual y otro usuario con quien sostiene el chat
1873
     * 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.
1874
     * Parámetros del route
1875
     * :id = id del usuario encriptado
1876
     * En caso de una respuesta positiva
1877
     * [
1878
     *      'success' => true,
1879
     *      'data'=> (int) registros_borrados
1880
     * ]
1881
     * En caso de un respuesta negativa
1882
     * [
1883
     *      'success' => false,
1884
     *      'data' => (string) 'mensaje_de_error'
1885
     * ]
1886
     * @return \Laminas\View\Model\JsonModel
1887
     */
1888
    public function clearAction()
1889
    {
1890
        $request    = $this->getRequest();
1891
        if($request->isPost()) {
1892
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1893
            $currentUser = $currentUserPlugin->getUser();
1894
 
1895
            $id = filter_var($this->params()->fromRoute('id'), FILTER_SANITIZE_STRING);
1896
 
1897
            if (!$id) {
1898
                return new JsonModel([
1899
                    'success' => false,
1900
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1901
                ]);
1902
            }
1903
 
1904
            $uuid = '';
1905
 
1906
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1907
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1908
            if ($chatGroup) {
3099 efrain 1909
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1910
                $chatGroupUserMapper->markIsClose($chatGroup->id, $currentUser->id);
1 www 1911
            } else {
1912
 
1913
                $userMapper = UserMapper::getInstance($this->adapter);
1914
                $user = $userMapper->fetchOneByUuid($id);
1915
                if(!$user) {
1916
                    return new JsonModel([
1917
                        'success' => false,
1918
                        'data' => 'ERROR_USER_NOT_FOUND'
1919
                    ]);
1920
                }
1921
 
1922
 
1923
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
1924
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1925
                if($chatUser) {
3099 efrain 1926
                    if($currentUser->id == $chatUser->user_id1) {
3113 efrain 1927
                        $chatUserMapper->markIsClose1($chatUser->id);
1928
                    } else {
3112 efrain 1929
                        $chatUserMapper->markIsClose2($chatUser->id);
3099 efrain 1930
                    }
1931
 
1 www 1932
                }
1933
            }
3086 efrain 1934
 
3099 efrain 1935
 
3086 efrain 1936
            $userMapper->updateLastActivity($currentUser->id);
1937
 
1 www 1938
            return new JsonModel([
1939
                'success' => true
1940
            ]);
1941
        } else {
1942
            return new JsonModel([
1943
                'success' => false,
1944
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1945
            ]);
1946
        }
1947
    }
1948
 
1949
    public function uploadAction()
1950
    {
1951
        $request    = $this->getRequest();
1952
        if($request->isPost()) {
1953
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1954
            $currentUser = $currentUserPlugin->getUser();
1955
 
1956
            $id = filter_var($this->params()->fromRoute('id'), FILTER_SANITIZE_STRING);
1957
            if (!$id) {
1958
                return new JsonModel([
1959
                    'success' => false,
1960
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1961
                ]);
1962
            }
1963
 
1964
            $files = $this->getRequest()->getFiles()->toArray();
1965
            if(!isset($files['file']) || !empty($files['file']['error'])) {
1966
                return new JsonModel([
1967
                    'success' => false,
1968
                    'data' => 'ERROR_FILE_NOT_UPLOAD'
1969
                ]);
1970
            }
1971
 
1972
            $tmp_filename   = $files['file']['tmp_name'];
1973
            if(!$this->validMimeType($tmp_filename)) {
1974
                return new JsonModel([
1975
                    'success' => false,
1976
                    'data' => 'ERROR_FILE_UPLODED_IS_NOT_VALID'
1977
                ]);
1978
            }
1979
 
1980
 
1981
            $extensions     = explode('.', $files['file']['name']);
1982
            $extension      = strtolower(trim($extensions[count($extensions) - 1]));
1983
            $filename       = uniqid() . '.' . $extension;
1984
 
1985
 
1986
            $mime_type = mime_content_type($tmp_filename);
1987
            if($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {
1988
                $file_type = 'image';
1989
            } else if($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {
1990
                $file_type = 'video';
1991
            } else if($mime_type == 'application/pdf') {
1992
                $file_type = 'document';
1993
            }
1994
 
1995
 
1996
            $userMapper = UserMapper::getInstance($this->adapter);
1997
            $sender_result = $userMapper->fetchOne($currentUser->id);
1998
            $sender_from = trim($sender_result->first_name . ' ' . $sender_result->last_name);
1999
            $sender_pic = $this->url()->fromRoute('storage', [
2000
                'code' => $sender_result->uuid,
2001
                'type' => 'user',
2002
                'filename' => $sender_result->image
2003
            ]);
2004
 
2005
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2006
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
2007
            if($chatGroup) {
2008
 
2009
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2010
                $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2011
 
2012
                if(!$chatGroupUser) {
2013
                    return new JsonModel([
2014
                        'success' => false,
2015
                        'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
2016
                    ]);
2017
                }
2018
 
2019
 
2020
                $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
2021
                $dirpath = $fullpath_chat . $chatGroup->uuid;
2022
                if (! file_exists($dirpath)) {
2023
                    mkdir($dirpath, 0777, true);
2024
                    chmod($dirpath, 0777);
2025
                }
2026
 
2027
                $full_filename = $dirpath . DIRECTORY_SEPARATOR . $filename;
2028
                if(!move_uploaded_file($tmp_filename, $full_filename)) {
2029
                    return new JsonModel([
2030
                        'success' => false,
2031
                        'data' => 'ERROR_FILE_UPLOADED_NOT_MOVE'
2032
                    ]);
2033
                }
2034
 
2035
                $chatGroupMessage = new ChatGroupMessage();
2036
                $chatGroupMessage->sender_id    = $currentUser->id;
2037
                $chatGroupMessage->group_id     = $chatGroup->id;
2038
                $chatGroupMessage->content      = $filename;
2039
                $chatGroupMessage->type         = $file_type;
2040
 
2041
                $chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
2042
                $result = $chatGroupMessageMapper->insert($chatGroupMessage);
2043
                if(!$result) {
2044
                    return new JsonModel([
2045
                        'success' => false,
2046
                        'data' => $chatGroupMessageMapper->getError()
2047
                    ]);
2048
                }
2049
 
2050
                $chatGroupMessage = $chatGroupMessageMapper->fetchOne($chatGroupMessage->id);
2051
 
2052
 
2053
                $chatGroupUserMessage = new ChatGroupUserMessage();
2054
                $chatGroupUserMessage->group_id = $chatGroupMessage->group_id;
2055
                $chatGroupUserMessage->message_id = $chatGroupMessage->id;
2056
                $chatGroupUserMessage->receiver_id = $currentUser->id;
2057
                $chatGroupUserMessage->recd = ChatGroupUserMessage::RECD_YES;
2058
                $chatGroupUserMessage->seen = ChatGroupUserMessage::SEEN_YES;
2059
 
2060
 
2061
                $chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
2062
                $result = $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
2063
                if(!$result) {
2064
                    return new JsonModel([
2065
                        'success' => false,
2066
                        'data' => $chatGroupUserMessageMapper->getError()
2067
                    ]);
2068
                }
2069
 
2070
 
2071
 
2072
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2073
 
2074
                $results = $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
2075
                foreach ($results as $r)
2076
                {
2077
                    if ($r->user_id != $currentUser->id) {
2078
                        $chatGroupUserMessage = new ChatGroupUserMessage();
2079
                        $chatGroupUserMessage->group_id = $chatGroupMessage->group_id;
2080
                        $chatGroupUserMessage->message_id = $chatGroupMessage->id;
2081
                        $chatGroupUserMessage->receiver_id= $r->user_id;
2082
                        $chatGroupUserMessage->recd = ChatGroupUserMessage::RECD_NO;
2083
                        $chatGroupUserMessage->seen = ChatGroupUserMessage::SEEN_NO;
2084
 
2085
                        $result = $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
2086
                        if(!$result) {
2087
                            return new JsonModel([
2088
                                'success' => false,
2089
                                'data' => $chatGroupUserMessageMapper->getError()
2090
                            ]);
2091
                        }
2092
 
2093
 
2094
                    }
2095
                }
3086 efrain 2096
 
2097
 
2098
                $userMapper->updateLastActivity($currentUser->id);
2099
 
2100
                $utilMapper = UtilMapper::getInstance($this->adapter);
2101
                $now = $utilMapper->getDatebaseNow();
1 www 2102
 
3086 efrain 2103
                $msgtime = $this->timeAgo($now, $now);
1 www 2104
                return new JsonModel([
2105
                    'success' => true,
2106
                    'data' => [
2107
                        'user_name'     => $sender_from,
2108
                        'user_id'       => $currentUser->uuid,
2109
                        'user_image'    => $sender_pic,
2110
                        'u'             => 1,
2111
                        'mtype'         => $file_type,
2112
                        'm'             => $this->url()->fromRoute('storage', ['code' => $chatGroup->uuid, 'type' => 'chat', 'filename' => $filename]),
2113
                        'time'          => $msgtime,
2114
                        'id'            => $chatGroupMessage->uuid
2115
                    ]
2116
                ]);
2117
 
2118
 
2119
            } else {
2120
 
2121
                $user = $userMapper->fetchOneByUuid($id);
2122
                if(!$user) {
2123
                    return new JsonModel([
2124
                        'success' => false,
2125
                        'data' => 'ERROR_USER_NOT_FOUND'
2126
                    ]);
2127
                }
2128
 
2129
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2130
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2131
                if(!$chatUser) {
2132
                    return new JsonModel([
2133
                        'success' => false,
2134
                        'data' => 'ERROR_CHAT_NOT_FOUND'
2135
                    ]);
2136
                }
2137
 
2138
                $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
2139
                $dirpath = $fullpath_chat . $chatUser->uuid;
2140
 
2141
                if (! file_exists($dirpath)) {
2142
                    mkdir($dirpath, 0777, true);
2143
                    chmod($dirpath, 0777);
2144
                }
2145
 
2146
                $full_filename = $dirpath . DIRECTORY_SEPARATOR . $filename;
2147
                if(!move_uploaded_file($tmp_filename, $full_filename)) {
2148
                    return new JsonModel([
2149
                        'success' => false,
2150
                        'data' => 'ERROR_FILE_UPLOADED_NOT_MOVE'
2151
                    ]);
2152
                }
2153
 
2154
                $chatMessage = new ChatMessage();
2155
                $chatMessage->chat_id = $chatUser->id;
2156
                $chatMessage->from_id = $currentUser->id;
2157
                $chatMessage->to_id = $user->id;
2158
                $chatMessage->content = $filename;
2159
                $chatMessage->type = $file_type;
2160
                $chatMessage->recd = ChatMessage::RECD_NO;
2161
                $chatMessage->seen = ChatMessage::SEEN_NO;
2162
 
2163
 
2164
                $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
2165
                $result = $chatMessageMapper->insert($chatMessage);
2166
                if(!$result) {
2167
                    return new JsonModel([
2168
                        'success' => false,
2169
                        'data' =>  $chatMessageMapper->getError()
2170
                    ]);
2171
                }
2172
 
2173
                $chatMessage = $chatMessageMapper->fetchOne($chatMessage->id);
2174
 
3086 efrain 2175
                $userMapper->updateLastActivity($currentUser->id);
1 www 2176
 
3086 efrain 2177
                $utilMapper = UtilMapper::getInstance($this->adapter);
2178
                $now = $utilMapper->getDatebaseNow();
2179
 
2180
                $msgtime = $this->timeAgo($chatMessage->added_on, $now);
1 www 2181
                return new JsonModel([
2182
                    'success' => true,
2183
                    'data' => [
2184
                        'user_name' => $sender_from,
2185
                        'user_id' => $currentUser->uuid,
2186
                        'user_image' => $sender_pic,
2187
                        'u' => 1,
2188
                        'mtype' => $file_type,
2189
                        'm' => $this->url()->fromRoute('storage', ['code' => $currentUser->uuid, 'type' => 'chat', 'filename' => $filename]),
2190
                        'time' => $msgtime,
2191
                        'id' => $chatMessage->uuid
2192
                    ]
2193
                ]);
2194
 
2195
            }
2196
        } else {
2197
            return new JsonModel([
2198
                'success' => false,
2199
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2200
            ]);
2201
        }
2202
    }
2203
 
2204
    public function markSeenAction()
2205
    {
2206
        $request = $this->getRequest();
2207
        if($request->isPost()) {
2208
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2209
            $currentUser = $currentUserPlugin->getUser();
2210
 
2211
            $id = $this->params()->fromRoute('id');
2212
            if (!$id) {
2213
                return new JsonModel([
2214
                    'success' => false,
2215
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2216
                ]);
2217
            }
2218
 
2219
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2220
            $chatGroup =  $chatGroupMapper->fetchOneByUuid($id);
2221
 
2222
            if($chatGroup) {
2223
 
2224
                $charGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2225
                $chatGroupUser = $charGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2226
 
2227
                if(!$chatGroupUser) {
2228
                    return new JsonModel([
2229
                        'success' => false,
2230
                        'data' =>  'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
2231
                    ]);
2232
                }
2233
 
2234
                $charGroupUserMessage = ChatGroupUserMessageMapper::getInstance($this->adapter);
2235
                $result = $charGroupUserMessage->markAsSeenByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2236
                if($result) {
2237
                    return new JsonModel([
2238
                        'success' => true,
2239
                    ]);
2240
                } else {
2241
                    return new JsonModel([
2242
                        'success' => false,
2243
                        'data' =>  $charGroupUserMessage->getError()
2244
                    ]);
2245
                }
2246
 
2247
 
2248
            } else {
2249
                $userMapper = UserMapper::getInstance($this->adapter);
2250
                $user = $userMapper->fetchOneByUuid($id);
2251
 
2252
                if(!$user) {
2253
                    return new JsonModel([
2254
                        'success' => false,
2255
                        'data' => 'ERROR_USER_NOT_FOUND'
2256
                    ]);
2257
                }
2258
 
2259
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2260
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2261
                if(!$chatUser) {
2262
                    return new JsonModel([
2263
                        'success' => false,
2264
                        'data' => 'ERROR_CHAT_NOT_FOUND'
2265
                    ]);
2266
                }
2267
 
2268
                $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
2269
                $result = $chatMessageMapper->markAsSeenByChatIdAndToId($chatUser->id, $currentUser->id);
2270
                if($result) {
2271
                    return new JsonModel([
2272
                        'success' => true,
2273
                    ]);
2274
                } else {
2275
                    return new JsonModel([
2276
                        'success' => false,
2277
                        'data' =>  $charGroupUserMessage->getError()
2278
                    ]);
2279
                }
2280
 
2281
            }
2282
 
2283
 
2284
        } else {
2285
            $response = [
2286
                'success' => false,
2287
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2288
            ];
2289
        }
2290
 
2291
        return new JsonModel($response);
2292
    }
2293
 
2294
 
2295
    public function markReceivedAction()
2296
    {
2297
        $request = $this->getRequest();
2298
        if($request->isPost()) {
2299
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2300
            $currentUser = $currentUserPlugin->getUser();
2301
 
2302
            $id = $this->params()->fromRoute('id');
2303
            if (!$id) {
2304
                return new JsonModel([
2305
                    'success' => false,
2306
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2307
                ]);
2308
            }
2309
 
2310
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2311
            $chatGroup =  $chatGroupMapper->fetchOneByUuid($id);
2312
 
2313
            if($chatGroup) {
2314
 
2315
                $charGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2316
                $chatGroupUser = $charGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2317
 
2318
                if(!$chatGroupUser) {
2319
                    return new JsonModel([
2320
                        'success' => false,
2321
                        'data' =>  'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
2322
                    ]);
2323
                }
2324
 
2325
                $charGroupUserMessage = ChatGroupUserMessageMapper::getInstance($this->adapter);
2326
                $result = $charGroupUserMessage->markAsReceivedByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2327
                if($result) {
2328
                    return new JsonModel([
2329
                        'success' => true,
2330
                    ]);
2331
                } else {
2332
                    return new JsonModel([
2333
                        'success' => false,
2334
                        'data' =>  $charGroupUserMessage->getError()
2335
                    ]);
2336
                }
2337
 
2338
 
2339
            } else {
2340
                $userMapper = UserMapper::getInstance($this->adapter);
2341
                $user = $userMapper->fetchOneByUuid($id);
2342
 
2343
                if(!$user) {
2344
                    return new JsonModel([
2345
                        'success' => false,
2346
                        'data' => 'ERROR_USER_NOT_FOUND'
2347
                    ]);
2348
                }
2349
 
2350
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2351
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2352
                if(!$chatUser) {
2353
                    return new JsonModel([
2354
                        'success' => false,
2355
                        'data' => 'ERROR_CHAT_NOT_FOUND'
2356
                    ]);
2357
                }
2358
 
2359
                $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
2360
                $result = $chatMessageMapper->markAsReceivedByChatIdAndToId($chatUser->id, $currentUser->id);
2361
                if($result) {
2362
                    return new JsonModel([
2363
                        'success' => true,
2364
                    ]);
2365
                } else {
2366
                    return new JsonModel([
2367
                        'success' => false,
2368
                        'data' =>  $charGroupUserMessage->getError()
2369
                    ]);
2370
                }
2371
 
2372
            }
2373
 
2374
 
2375
        } else {
2376
            $response = [
2377
                'success' => false,
2378
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2379
            ];
2380
        }
2381
 
2382
        return new JsonModel($response);
2383
    }
2384
 
2385
 
2386
 
2387
    /**
2388
     *
2389
     * @param string $file
2390
     * @return boolean
2391
     */
2392
    private function validMimeType($file)
2393
    {
2394
        /*
2395
         * image/jpeg jpeg jpg jpe
2396
         * image/gif gif
2397
         * image/png png
2398
         * video/mp4
2399
         * audio/mpeg mpga mp2 mp2a mp3 m2a m3a
2400
         * video/x-flv flv
2401
         * application/msword doc dot
2402
         * application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
2403
         * application/vnd.ms-excel xls xlm xla xlc xlt xlw
2404
         * application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
2405
         * application/vnd.ms-powerpoint ppt pps pot
2406
         * application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
2407
         * application/pdf pdf
2408
         */
2409
        $mime = mime_content_type($file);
2410
        $valid = false;
2411
        $types = [
2412
            'image/jpeg',
2413
            'image/gif',
2414
            'image/png',
2415
            'video/mp4',
2416
            'audio/mpeg',
2417
            'video/x-flv',
2418
            'application/msword',
2419
            'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
2420
            'application/vnd.ms-excel',
2421
            'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
2422
            'application/vnd.ms-powerpoint',
2423
            'application/vnd.openxmlformats-officedocument.presentationml.presentation',
2424
            'application/pdf'
2425
        ];
2426
        foreach ($types as $t) {
2427
            if (strpos($mime, $t) !== false) {
2428
                $valid = true;
2429
                break;
2430
            }
2431
        }
2432
        return $valid;
2433
    }
2434
 
2435
    /**
2436
     *
2437
     * @param string $text
2438
     * @return string
2439
     */
2440
    private function sanitize($text)
2441
    {
2442
        $text = htmlspecialchars($text, ENT_QUOTES);
2443
        $text = str_replace("\n\r", "\n", $text);
2444
        $text = str_replace("\r\n", "\n", $text);
2445
        $text = str_replace("\n", "<br>", $text);
2446
        return $text;
2447
    }
2448
 
2449
    /**
2450
     *
2451
     * @param string $timestamp
3086 efrain 2452
     * @param string $now
1 www 2453
     * @return string
2454
     */
3086 efrain 2455
    private function timeAgo($timestamp, $now = '')
1 www 2456
    {
3086 efrain 2457
 
2458
        if($now) {
2459
            $datetime1 = \DateTime::createFromFormat('Y-m-d H:i:s', $now);
2460
        } else {
2461
            $now = date('Y-m-d H:i:s');
2462
            $datetime1 = date_create($now);
2463
        }
1 www 2464
        $datetime2 = date_create($timestamp);
3086 efrain 2465
 
1 www 2466
        $diff = date_diff($datetime1, $datetime2);
2467
        $timemsg = '';
2468
        if ($diff->y > 0) {
2536 stevensc 2469
            $timemsg = $diff->y . ' año' . ($diff->y > 1 ? "s" : '');
1 www 2470
        } else if ($diff->m > 0) {
2536 stevensc 2471
            $timemsg = $diff->m . ' mes' . ($diff->m > 1 ? "es" : '');
1 www 2472
        } else if ($diff->d > 0) {
2473
            $timemsg = $diff->d . ' dia' . ($diff->d > 1 ? "s" : '');
2474
        } else if ($diff->h > 0) {
2475
            $timemsg = $diff->h . ' hora' . ($diff->h > 1 ? "s" : '');
2476
        } else if ($diff->i > 0) {
2477
            $timemsg = $diff->i . ' minuto' . ($diff->i > 1 ? "s" : '');
2478
        } else if ($diff->s > 0) {
2479
            $timemsg = $diff->s . ' segundo' . ($diff->s > 1 ? "s" : '');
2480
        }
2481
        if (!$timemsg) {
2482
            $timemsg = "Ahora";
2483
        } else {
2484
            $timemsg = $timemsg . '';
2485
        }
2486
        return $timemsg;
2487
    }
2488
 
2489
    /**
2490
     *
2491
     * @param string $timestamp
3086 efrain 2492
     * @param string $now
1 www 2493
     * @return boolean
2494
     */
3086 efrain 2495
    private function isInactiveConnection($timestamp, $now = '')
1 www 2496
    {
3086 efrain 2497
        if($now) {
2498
            $datetime1 = \DateTime::createFromFormat('Y-m-d H:i:s', $now);
2499
        } else {
2500
            $now = date('Y-m-d H:i:s');
2501
            $datetime1 = date_create($now);
2502
        }
2503
 
2504
 
1 www 2505
        if (empty($timestamp)) {
2506
            return true;
2507
        }
2508
 
3086 efrain 2509
 
1 www 2510
        $datetime2 = date_create($timestamp);
2511
        $diff = date_diff($datetime1, $datetime2);
2512
 
2513
        if ($diff->y > 0 || $diff->m > 0 || $diff->d > 0 || $diff->h > 0 || $diff->i > 0) {
2514
            return true;
2515
        }
2516
 
2517
        return ($diff->s) > 15 ? true : false;
2518
    }
2519
}