Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 4132 | Rev 4857 | 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;
4131 efrain 29
use LeadersLinked\Library\Zoom;
30
use LeadersLinked\Form\Chat\ZoomAddForm;
31
use LeadersLinked\Model\ZoomMeeting;
32
use LeadersLinked\Mapper\ZoomMeetingMapper;
33
use LeadersLinked\Model\ZoomMeetingUser;
34
use LeadersLinked\Model\CalendarEvent;
35
use LeadersLinked\Mapper\CalendarEventMapper;
36
use LeadersLinked\Mapper\ZoomMeetingUserMapper;
1 www 37
 
38
 
39
class ChatController extends AbstractActionController
40
{
3099 efrain 41
 
1 www 42
    /**
43
     *
44
     * @var AdapterInterface
45
     */
46
    private $adapter;
47
 
48
    /**
49
     *
50
     * @var AbstractAdapter
51
     */
52
    private $cache;
53
 
54
    /**
55
     *
56
     * @var LoggerInterface
57
     */
58
    private $logger;
59
 
60
    /**
61
     *
62
     * @var array
63
     */
64
    private $config;
65
 
66
    /**
67
     *
68
     * @param AdapterInterface $adapter
69
     * @param AbstractAdapter $cache
70
     * @param LoggerInterface $logger
71
     * @param array $config
72
     */
73
    public function __construct($adapter, $cache, $logger, $config)
74
    {
75
        $this->adapter  = $adapter;
76
        $this->cache    = $cache;
77
        $this->logger   = $logger;
78
        $this->config   = $config;
79
 
3099 efrain 80
 
1 www 81
    }
82
 
83
    /**
84
     *
85
     * Ruta usada para mostrar el chat en pantalla completa usada en los moviles
86
     *
87
     */
88
    public function indexAction()
89
    {
90
        $currentUserPlugin = $this->plugin('currentUserPlugin');
91
        $currentUser = $currentUserPlugin->getUser();
92
 
93
        $connectionMapper = ConnectionMapper:: getInstance($this->adapter);
94
        $connectionIds = $connectionMapper->fetchAllConnectionsByUserReturnIds( $currentUser->id );
95
 
96
        $contacts = [];
97
        if($connectionIds) {
3086 efrain 98
 
99
            $utilMapper = UtilMapper::getInstance($this->adapter);
100
            $now = $utilMapper->getDatebaseNow();
101
 
1 www 102
            $userMapper = UserMapper::getInstance($this->adapter);
103
            $users = $userMapper->fetchAllByIds($connectionIds);
104
 
105
            foreach($users as $user)
106
            {
107
                $username = trim($user->first_name . ' ' . $user->last_name);
3086 efrain 108
                $status = $user->online ? 'LABEL_ONLINE' : 'LABEL_OFFLINE';
1 www 109
                $user_image = $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]);
110
 
111
                array_push($contacts, ['id' => $user->uuid, 'status'=> $status,'name'=> $username, 'image' => $user_image]);
112
 
113
            }
114
        }
115
 
116
        $groups = [];
117
        $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
118
        $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
119
 
120
        $results = $chatGroupUserMapper->fetchAllByUserId($currentUser->id);
121
        if(is_array($results)) {
122
            foreach ($results as $r)
123
            {
124
 
125
                $chatOwner = $chatGroupUserMapper->fetchOwnerByGroupId($r->group_id);
126
                $userOwner = $userMapper->fetchOne( $chatOwner->user_id );
127
                $chatGroup = $chatGroupMapper->fetchOne($r->group_id);
128
 
129
                array_push($groups, ['id' => $chatGroup->uuid, 'name' => $chatGroup->name, 'owner_id' => $userOwner->uuid ]);
130
 
131
 
132
 
133
            }
134
        }
135
 
1893 efrain 136
        /*
1 www 137
        $this->layout()->setTemplate('layout/layout-chat.phtml');
138
        $this->layout()->setVariables([
139
            'is_chat' => true
1893 efrain 140
        ]);*/
1 www 141
        $viewModel = new ViewModel();
142
        $viewModel->setTemplate('leaders-linked/chat/chat.phtml');
143
        $viewModel->setVariables([
144
            'contacts' => $contacts,
145
            'groups' => $groups,
146
            'user_id' => $currentUser->id,
4113 efrain 147
            'is_chat' => true,
148
            'timezone' => $currentUser->timezone,
1 www 149
        ]);
150
        return $viewModel ;
151
 
152
 
153
    }
154
 
155
    /**
156
     * Recuperamos los contactos y grupos
157
     * tiene que enviarse un petición GET a la siguiente url: /chat/heart-beat
158
     * retorna un json en caso de ser  positivo
159
     * [
160
     *  'success' : true,
161
     *  'data' : [
162
     *     [
163
     *       'url_leave'                                => 'url para abandonar el grupo en caso de no ser el propietario',
164
     *       'url_delete'                               => 'url para borrar el grupo si es el propietario',
165
     *       'url_add_user_to_group'                    => 'url para agregar un usuario al grupo si es el propietario',
166
     *       'url_get_contacts_availables_for_group'    => 'url para obtener los usuarios disponibles para agregarlos al grupo',
167
     *       'url_get_contact_group_list'               => 'url para obtener los usuarios del grupo si es el propietario',
168
     *       'url_clear'                                => 'url para limpiar los mensajes del grupo',
3121 efrain 169
     *       'url_close'                                => 'url para marcar como cerrado el chat',
170
     *       'url_open'                                 => 'url para marcar como abierto el chat',
1 www 171
     *       'url_send'                                 => 'url para enviar un mensaje',
172
     *       'url_upload'                               => 'url para subir un archivo, imagen o video',
173
     *       'url_get_all_messages'                     => 'url para para obtener los mensajes',
174
     *       'url_mark_seen'                            => 'url para marcar los mensajes como vistos'
175
     *       'url_mark_received'                        => 'url para marcar los mensajes como recibios'
4113 efrain 176
     *       'url_zoom'                                 => 'url para crear la conferencia de zoom'
1 www 177
     *       'id'                                       => 'id del grupo encriptado',
178
     *       'name'                                     => 'nombre del grupo',
179
     *       'type'                                     => 'group', //fixed
180
     *       'is_open'                                  => 'true/false',
181
     *       'unsee_messages'                           => 'true/false',
2241 efrain 182
     *       'unread_messages'                          => 'true/false',
183
     *       'count_not_seen_messages'  => 'cantidad de mensajes no vistos',
184
     *       'count_not_received_messages' => 'cantidad de mensajes no recibidos',
2242 efrain 185
     *       'last_message'                => 'tiempo desde el ultimo mensaje',
1 www 186
     *      ],
187
     *      [
188
     *        'url_clear'               => 'url para limpiar los mensajes del grupo',
3121 efrain 189
     *        'url_close'               => 'url para marcar como cerrado el chat',
190
     *        'url_open'                => 'url para marcar como abierto el chat',
1 www 191
     *        'url_send'                => 'url para enviar un mensaje',
192
     *        'url_upload'              => 'url para subir un archivo, imagen o video',
193
     *        'url_get_all_messages'    => 'url para para obtener los mensajes',
3121 efrain 194
     *        'url_mark_seen'           => 'url para marcar los mensajes como vistos'
195
     *        'url_mark_received'       => 'url para marcar los mensajes como recibios'
4113 efrain 196
     *        'url_zoom'                                 => 'url para crear la conferencia de zoom'
1 www 197
     *        'id'                      => 'id del usuario encriptado',
198
     *        'name'                    => 'nombre del usuario',
199
     *        'image'                   => 'imagen del usuario',
200
     *        'type'                    => 'user' //fixed,
201
     *        'profile'                 => 'url del profile',
202
     *        'online'                  => 'true/false',
203
     *        'is_open'                 => 'true/false',
204
     *        'unsee_messages'          => 'true/false'
2241 efrain 205
     *        'unread_messages'         => 'true/false',
206
     *        'count_not_seen_messages'  => 'cantidad de mensajes no vistos',
207
     *        'count_not_received_messages' => 'cantidad de mensajes no recibidos',
2242 efrain 208
     *        'last_message'                => 'tiempo desde el ultimo mensaje',
1 www 209
     *     ]
210
     * ]
211
     * En caso de ser negativo puede haber 2 formatos
212
     * [
213
     *  'success' : false,
214
     *  'data' : mensaje de error
215
     * ]
216
     * o
217
     * [
218
     *  'success' : false,
219
     *  'data' : [
220
     *      'fieldname' : [
221
     *          'mensaje de error'
222
     *      ]
223
     *  ]
224
     * ]
225
     * @return \Laminas\View\Model\JsonModel
226
     */
227
    public function heartBeatAction()
228
    {
229
        $request    = $this->getRequest();
230
        if($request->isGet()) {
3138 efrain 231
            $utilMapper = UtilMapper::getInstance($this->adapter);
232
            $now = $utilMapper->getDatebaseNow();
1 www 233
 
234
            $currentUserPlugin = $this->plugin('currentUserPlugin');
235
            $currentUser = $currentUserPlugin->getUser();
236
 
237
            $userMapper = UserMapper::getInstance($this->adapter);
238
            $userMapper->updateChatOnlineStatus($currentUser->id);
239
 
240
            $chats      = [];
241
 
242
            $chatGroupMapper            = ChatGroupMapper::getInstance($this->adapter);
243
            $chatGroupUserMapper        = ChatGroupUserMapper::getInstance($this->adapter);
244
            $chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
245
 
246
 
247
            $results = $chatGroupUserMapper->fetchAllByUserId($currentUser->id);
248
 
249
            if (is_array($results)) {
250
                foreach ($results as $r)
251
                {
252
 
3099 efrain 253
                    $chatGroup      = $chatGroupMapper->fetchOne($r->group_id);
254
                    $chatUserOwner  = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
255
                    $chatUser       = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
256
 
257
                    $is_open                        = $chatUser->open == ChatGroupUser::OPEN_YES;
258
                    $count_not_seen_messages        = $chatGroupUserMessageMapper->countNotSeenMessages($chatGroup->id, $currentUser->id);
259
                    $count_not_received_messages    = $chatGroupUserMessageMapper->countNotReceivedMessages($chatGroup->id, $currentUser->id);
2241 efrain 260
                    $lastMessage                    = $chatGroupUserMessageMapper->fetchLastMessage($chatGroup->id, $currentUser->id);
2219 efrain 261
 
2241 efrain 262
                    if($lastMessage) {
3138 efrain 263
                        $lastMessage = Functions::timeAgo($lastMessage->added_on, $now);
2241 efrain 264
                    } else {
265
                        $lastMessage = '';
266
                    }
267
 
268
 
269
 
270
 
2219 efrain 271
                    $not_seen_messages     = $count_not_seen_messages > 0;
272
                    $not_received_messages = $count_not_received_messages > 0;
1 www 273
 
274
                    if($chatUserOwner->user_id == $currentUser->id ) {
275
 
276
                        $chat = [
277
                            'url_leave'                             => '',
278
                            'url_delete'                            => $this->url()->fromRoute('chat/delete-group', ['group_id' => $chatGroup->uuid]),
279
                            'url_add_user_to_group'                 => $this->url()->fromRoute('chat/add-user-to-group', ['group_id' => $chatGroup->uuid]),
280
                            'url_get_contact_group_list'            => $this->url()->fromRoute('chat/get-contact-group-list', ['group_id' => $chatGroup->uuid]),
281
                            'url_get_contacts_availables_for_group' => $this->url()->fromRoute('chat/get-contacts-availables-for-group', ['group_id' => $chatGroup->uuid]),
282
                            'url_clear'                             => $this->url()->fromRoute('chat/clear', ['id' => $chatGroup->uuid]),
283
                            'url_close'                             => $this->url()->fromRoute('chat/close', ['id' => $chatGroup->uuid]),
3121 efrain 284
                            'url_open'                              => $this->url()->fromRoute('chat/open', ['id' => $chatGroup->uuid]),
1 www 285
                            'url_send'                              => $this->url()->fromRoute('chat/send', ['id' => $chatGroup->uuid]),
286
                            'url_upload'                            => $this->url()->fromRoute('chat/upload', ['id' => $chatGroup->uuid]),
287
                            'url_get_all_messages'                  => $this->url()->fromRoute('chat/get-all-messages', ['id' => $chatGroup->uuid]),
288
                            'url_mark_seen'                         => $this->url()->fromRoute('chat/mark-seen', ['id' => $chatGroup->uuid]),
289
                            'url_mark_received'                     => $this->url()->fromRoute('chat/mark-received', ['id' => $chatGroup->uuid]),
4131 efrain 290
                            'url_zoom'                              => $this->url()->fromRoute('chat/zoom', ['id' => $chatGroup->uuid, 'type' => 'chat']),
1 www 291
                            'id'                                    => $chatGroup->uuid,
292
                            'name'                                  => $chatGroup->name,
293
                            'type'                                  => 'group',
294
                            'is_open'                               => $is_open ? 1 : 0,
295
                            'not_seen_messages'                     => $not_seen_messages,
296
                            'not_received_messages'                 => $not_received_messages,
2219 efrain 297
                            'count_not_seen_messages'               => $count_not_seen_messages,
298
                            'count_not_received_messages'           => $count_not_received_messages,
2241 efrain 299
                            'last_message'                          => $lastMessage
1 www 300
 
301
                        ];
302
                    } else {
303
 
304
                        $chat = [
305
                            'url_delete'                    => '',
306
                            'url_add_user_to_group'         => '',
307
                            'url_get_contact_group_list'    => $this->url()->fromRoute('chat/get-contact-group-list', ['group_id' => $chatGroup->uuid]),
308
                            'url_leave'                     => $this->url()->fromRoute('chat/leave-group', ['group_id' => $chatGroup->uuid]),
309
                            'url_clear'                     => $this->url()->fromRoute('chat/clear', ['id' => $chatGroup->uuid]),
310
                            'url_close'                     => $this->url()->fromRoute('chat/close', ['id' => $chatGroup->uuid]),
3121 efrain 311
                            'url_open'                      => $this->url()->fromRoute('chat/open', ['id' => $chatGroup->uuid]),
1 www 312
                            'url_send'                      => $this->url()->fromRoute('chat/send', ['id' => $chatGroup->uuid]),
313
                            'url_upload'                    => $this->url()->fromRoute('chat/upload', ['id' => $chatGroup->uuid]),
314
                            'url_get_all_messages'          => $this->url()->fromRoute('chat/get-all-messages', ['id' => $chatGroup->uuid]),
315
                            'url_mark_seen'                 => $this->url()->fromRoute('chat/mark-seen', ['id' => $chatGroup->uuid]),
316
                            'url_mark_received'             => $this->url()->fromRoute('chat/mark-received', ['id' => $chatGroup->uuid]),
4113 efrain 317
                            'zoom'                          => $this->url()->fromRoute('chat/zoom', ['id' => $chatGroup->uuid, 'type' => 'chat']),
4132 efrain 318
                            'url_zoom'                      => $this->url()->fromRoute('chat/zoom', ['id' => $chatGroup->uuid, 'type' => 'chat']),
1 www 319
                            'id'                            => $chatGroup->uuid,
320
                            'name'                          => $chatGroup->name,
321
                            'type'                          => 'group',
322
                            'is_open'                       => $is_open ? 1 : 0,
323
                            'not_seen_messages'             => $not_seen_messages,
324
                            'not_received_messages'         => $not_received_messages,
2219 efrain 325
                            'count_not_seen_messages'       => $count_not_seen_messages,
326
                            'count_not_received_messages'   => $count_not_received_messages,
2241 efrain 327
                            'last_message'                  => $lastMessage
1 www 328
                        ];
329
                    }
330
 
331
                   array_push($chats, $chat);
332
                }
333
            }
334
 
335
            $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
336
            $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
337
 
338
            $connectionMapper = ConnectionMapper::getInstance($this->adapter);
339
            $connectionIds = $connectionMapper->fetchAllConnectionsByUserReturnIds($currentUser->id);
340
 
341
 
342
 
343
            if ($connectionIds) {
344
 
345
                $userMapper = UserMapper::getInstance($this->adapter);
346
                $users = $userMapper->fetchAllByIds($connectionIds);
347
 
348
                foreach ($users as $user)
349
                {
350
                    $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2614 efrain 351
                    if($chatUser) {
352
                        $count_not_received_messages = $chatMessageMapper->countNotReceivedMessagesByChatIdAndToId($chatUser->id, $currentUser->id);
353
                        $count_not_seen_messages = $chatMessageMapper->countNotSeenMessagesByChatIdAndToId($chatUser->id, $currentUser->id);
354
                        $lastMessage = $chatMessageMapper->fetchLastMessage($chatUser->id, $currentUser->id);
355
 
356
                        if($lastMessage) {
3138 efrain 357
                            $lastMessage = Functions::timeAgo($lastMessage->added_on, $now);
2242 efrain 358
                        } else {
359
                            $lastMessage = '';
360
                        }
2219 efrain 361
 
3099 efrain 362
                        if($currentUser->id == $chatUser->user_id1) {
363
                            $is_open = $chatUser->user_open1 == ChatUser::OPEN_YES;
364
                        } else {
365
                            $is_open = $chatUser->user_open2 == ChatUser::OPEN_YES;
366
                        }
2219 efrain 367
 
3099 efrain 368
 
2219 efrain 369
                        $not_received_messages = $count_not_received_messages > 0;
370
                        $not_seen_messages = $count_not_seen_messages > 0;
1 www 371
                    } else {
372
                        $is_open = false;
2614 efrain 373
                        $count_not_received_messages = 0;
374
                        $count_not_seen_messages =  0;
1 www 375
                        $not_seen_messages = false;
376
                        $not_received_messages = false;
2614 efrain 377
                        $lastMessage = '';
2241 efrain 378
 
1 www 379
                    }
380
 
381
 
382
                    $chat = [
383
                        'url_clear'                 => $this->url()->fromRoute('chat/clear', ['id' => $user->uuid]),
384
                        'url_close'                 => $this->url()->fromRoute('chat/close', ['id' => $user->uuid]),
3121 efrain 385
                        'url_open'                  => $this->url()->fromRoute('chat/open', ['id' => $user->uuid]),
1 www 386
                        'url_send'                  => $this->url()->fromRoute('chat/send', ['id' => $user->uuid]),
387
                        'url_upload'                => $this->url()->fromRoute('chat/upload', ['id' => $user->uuid]),
388
                        'url_mark_seen'             => $this->url()->fromRoute('chat/mark-seen', ['id' => $user->uuid]),
389
                        'url_mark_received'         => $this->url()->fromRoute('chat/mark-received', ['id' => $user->uuid]),
390
                        'url_get_all_messages'      => $this->url()->fromRoute('chat/get-all-messages', ['id' => $user->uuid]),
4141 efrain 391
                        'url_zoom'                  => $this->url()->fromRoute('chat/zoom', ['id' => $user->uuid, 'type' => 'chat']),
1 www 392
                        'id'                        => $user->uuid,
393
                        'name'                      => trim($user->first_name . ' ' . $user->last_name),
394
                        'image'                     => $this->url()->fromRoute('storage', ['code' => $user->uuid, 'type' => 'user', 'filename' => $user->image]),
395
                        'profile'                   => $this->url()->fromRoute('profile/view', ['id' =>$user->uuid]),
396
                        'type'                      => 'user',
3086 efrain 397
                        'online'                    => $user->online ? 1 : 0,
1 www 398
                        'is_open'                   => $is_open ? 1 : 0,
399
                        'not_seen_messages'         => $not_seen_messages,
400
                        'not_received_messages'     => $not_received_messages,
2219 efrain 401
                        'count_not_seen_messages'       => $count_not_seen_messages,
402
                        'count_not_received_messages'   => $count_not_received_messages,
2241 efrain 403
                        'last_message'                  => $lastMessage
2219 efrain 404
 
1 www 405
                    ];
406
 
407
                    array_push($chats, $chat);
408
                }
409
            }
410
 
411
            $userMapper->updateLastHeartBeat($currentUser->id);
412
 
413
            $response = [
414
                'success' => true,
415
                'data' => $chats
416
            ];
417
 
418
        } else {
419
            $response = [
420
                'success' => false,
421
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
422
            ];
423
        }
424
 
425
        return new JsonModel($response);
426
    }
427
 
428
 
429
 
430
    /**
431
     * Esta función crea un grupo y asigna al usuario actual como el owner del mismo,
432
     * tiene que enviarse un petición POST a la siguiente url: /chat/create-group
433
     * con el siguiente parámetro
434
     * name = un string con un máximo de 50 carácteres
435
     * retorna un json en caso de ser  positivo
436
     * [
437
     *  'success' : true,
438
     *  'data' : ID del grupo encriptado
439
     * ]
440
     * En caso de ser negativo puede haber 2 formatos
441
     * [
442
     *  'success' : false,
443
     *  'data' : mensaje de error
444
     * ]
445
     * o
446
     * [
447
     *  'success' : false,
448
     *  'data' : [
449
     *      'fieldname' : [
450
     *          'mensaje de error'
451
     *      ]
452
     *  ]
453
     * ]
454
     * @return \Laminas\View\Model\JsonModel
455
     */
456
    public function createGroupAction()
457
    {
458
        $request    = $this->getRequest();
459
        if($request->isPost()) {
460
            $form = new  CreateGroupForm();
461
            $form->setData($request->getPost()->toArray());
462
 
463
            if($form->isValid()) {
464
                $dataPost = (array) $form->getData();
465
                $name = $dataPost['name'];
466
 
467
 
468
                $currentUserPlugin = $this->plugin('currentUserPlugin');
469
                $currentUser = $currentUserPlugin->getUser();
470
 
471
                $chatGroup = new ChatGroup();
472
                $chatGroup->name = $name;
473
 
474
 
475
                $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
476
                $result = $chatGroupMapper->insert($chatGroup);
477
                if ($result) {
478
                    $chatGroup = $chatGroupMapper->fetchOne($chatGroup->id);
479
 
480
 
481
 
482
                    $chatGroupUser = new ChatGroupUser();
483
                    $chatGroupUser->group_id = $chatGroup->id;
484
                    $chatGroupUser->user_id = $currentUser->id;
485
                    $chatGroupUser->owner = ChatGroupUser::OWNER_YES;
486
 
487
                    $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
488
                    $result = $chatGroupUserMapper->insert($chatGroupUser);
489
 
490
                    if($result)  {
3086 efrain 491
 
492
                        $userMapper = UserMapper::getInstance($this->adapter);
493
                        $userMapper->updateLastActivity($currentUser->id);
494
 
1 www 495
                        $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
496
                        $dirpath = $fullpath_chat . $chatGroup->uuid;
497
                        if (! file_exists($dirpath)) {
498
                            mkdir($dirpath, 0777, true);
499
                            chmod($dirpath, 0777);
500
                        }
501
 
502
                        $response = [
503
                            'success' => true,
504
                            'data' => $chatGroup->uuid,
505
                        ];
506
                    } else {
507
                        $response = [
508
                            'success' => false,
509
                            'data' => $chatGroupUserMapper->getError(),
510
                        ];
511
                    }
512
 
513
                } else {
514
                    $response = [
515
                        'success' => false,
516
                        'data' => $chatGroupMapper->getError(),
517
                    ];
518
                }
519
            } else {
520
                $messages = [];
521
                $form_messages = (array) $form->getMessages();
522
                foreach($form_messages  as $fieldname => $field_messages)
523
                {
524
 
525
                    $messages[$fieldname] = array_values($field_messages);
526
                }
527
 
528
                return new JsonModel([
529
                    'success'   => false,
530
                    'data'   => $messages
531
                ]);
532
            }
533
        } else {
534
            $response = [
535
                'success' => false,
536
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
537
            ];
538
        }
539
 
540
        return new JsonModel($response);
541
    }
542
 
543
    /**
544
     * Esta función crea un grupo y asigna al usuario al mismo, solo el owner puede hacerlo
545
     * Es una petición POST el url que contiene el ID encriptado del chat (/chat/add-user-to-group/:group_id)
546
     * Parámetros del route
547
     * :group_id = id del grupo encriptado
548
     * Parámetro post
549
     * uid = id encriptado del usuario
550
     * retorna un json en caso de ser  positivo
551
     * [
552
     *  'success' : true,
553
     *  'data' : [
554
     *     [
555
     *       'url_remove_from_group' => 'url para remover el usuario del grupo',
556
     *       'id'                    => 'id del usuario encriptado',
557
     *       'name'                  => 'nombre del usuario',
558
     *       'image'                 => 'imagen del usuario',
559
     *       'type'                  => 'user' //fixed,
560
     *       'online'                => $online,
561
     *     ]
562
     * ]
563
     * En caso de ser negativo puede haber 2 formatos
564
     * [
565
     *  'success' : false,
566
     *  'data' : mensaje de error
567
     * ]
568
     * o
569
     * [
570
     *  'success' : false,
571
     *  'data' : [
572
     *      'fieldname' : [
573
     *          'mensaje de error'
574
     *      ]
575
     *  ]
576
     * ]
577
     * @return \Laminas\View\Model\JsonModel
578
     */
579
    public function addUserToGroupAction()
580
    {
581
        $request    = $this->getRequest();
582
        if($request->isPost()) {
583
            $currentUserPlugin = $this->plugin('currentUserPlugin');
584
            $currentUser = $currentUserPlugin->getUser();
585
 
586
            $group_id   = $this->params()->fromRoute('group_id');
587
            $user_id    = $this->params()->fromPost('uid');
588
 
589
            if(empty($group_id) || empty($user_id)) {
590
                return new JsonModel([
591
                    'success' => false,
592
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
593
                ]);
594
            }
595
 
596
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
597
            $chatGroup = $chatGroupMapper->fetchOneByUuid($group_id);
598
            if(!$chatGroup) {
599
                return new JsonModel([
600
                    'success' => false,
601
                    'data' => 'ERROR_CHAT_GROUP_NOT_FOUND'
602
                ]);
603
            }
604
 
605
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
606
            $chatGroupOwner = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
607
 
608
            if($chatGroupOwner->user_id != $currentUser->id) {
609
                return new JsonModel([
610
                    'success' => false,
611
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_NOT_OWNER'
612
                ]);
613
            }
614
 
615
            $userMapper = UserMapper::getInstance($this->adapter);
616
            $user = $userMapper->fetchOneByUuid($user_id);
617
 
618
            if(!$user) {
619
                return new JsonModel([
620
                    'success' => false,
621
                    'data' => 'ERROR_USER_NOT_FOUND'
622
                ]);
623
            }
624
 
625
            if($chatGroupOwner->user_id == $user->id) {
626
                return new JsonModel([
627
                    'success' => false,
628
                    'data' => 'ERROR_CHAT_I_CAN_NOT_ADD_HIMSELF'
629
                ]);
630
            }
631
 
632
 
633
            $connectionMapper = ConnectionMapper::getInstance($this->adapter);
634
            $connection = $connectionMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
635
            if(!$connection) {
636
                return new JsonModel([
637
                    'success' => false,
638
                    'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
639
                ]);
640
            }
641
 
642
            $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $user->id);
643
            if($chatGroupUser) {
644
                return new JsonModel([
645
                    'success' => false,
646
                    'data' => 'ERROR_THIS_USER_ALREADY_EXISTS_IN_THIS_GROUP'
647
                ]);
648
            }
649
 
650
 
651
            $chatGroupUser = new ChatGroupUser();
652
            $chatGroupUser->group_id    = $chatGroup->id;
653
            $chatGroupUser->user_id     = $user->id;
654
            $chatGroupUser->owner       = ChatGroupUser::OWNER_NO;
655
 
656
            $result = $chatGroupUserMapper->insert($chatGroupUser);
657
            if(!$result) {
658
                return new JsonModel([
659
                    'success' => false,
660
                    'data' => $chatGroupUserMapper->getError()
661
                ]);
662
            }
663
 
3086 efrain 664
 
665
 
666
            $userMapper->updateLastActivity($currentUser->id);
1 www 667
 
668
            return new JsonModel([
669
                'success' => true,
670
                'data' => [
671
                    'url_remove_from_group' => $this->url()->fromRoute('chat/remove-user-from-group', ['group_id' => $chatGroup->uuid, 'user_id' => $user->uuid]),
672
                    'id'        => $user->uuid,
673
                    'name'      => trim($user->first_name . ' ' . $user->last_name),
674
                    'image'     => $this->url()->fromRoute('storage', ['code' => $user->uuid, 'type' => 'user', 'filename' => $user->image]),
675
                    'type'      => 'user',
3086 efrain 676
                    'online'    => $user->online ? 1 : 0,
1 www 677
                ]
678
            ]);
679
 
680
 
681
        } else {
682
            return new JsonModel([
683
                'success' => false,
684
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
685
            ]);
686
        }
687
 
688
    }
689
 
690
    /**
691
     * Esta función remueve el usuario del grupo
692
     * Es una petición POST el url que contiene el ID encriptado del chat (/chat/remove-user-from-group/:group_id/:user_id)
693
     * y la cuál se recibe en la función heartBeat.
694
     * Parámetros del route
695
     * group_id= id encriptado del grupo
696
     * user_id = id encriptado del usuario
697
     * retorna un json en caso de ser  positivo
698
     * [
699
     *  'success' : true,
700
     * ]
701
     * En caso de ser negativo puede haber 2 formatos
702
     * [
703
     *  'success' : false,
704
     *  'data' : mensaje de error
705
     * ]
706
     * @return \Laminas\View\Model\JsonModel
707
     */
708
    public function removeUserFromGroupAction()
709
    {
710
        $request    = $this->getRequest();
711
        if($request->isPost()) {
712
 
713
            $currentUserPlugin = $this->plugin('currentUserPlugin');
714
            $currentUser = $currentUserPlugin->getUser();
715
 
716
            $user_id = $this->params()->fromRoute('user_id');
717
            $group_id = $this->params()->fromRoute('group_id');
718
 
719
            if(empty($group_id) || empty($user_id)) {
720
                return new JsonModel([
721
                    'success' => false,
722
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
723
                ]);
724
            }
725
 
726
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
727
            $chatGroup = $chatGroupMapper->fetchOneByUuid($group_id);
728
            if(!$chatGroup) {
729
                return new JsonModel([
730
                    'success' => false,
731
                    'data' => 'ERROR_CHAT_GROUP_NOT_FOUND'
732
                ]);
733
            }
734
 
735
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
736
            $chatGroupOwner = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
737
 
738
            if($chatGroupOwner->user_id != $currentUser->id) {
739
                return new JsonModel([
740
                    'success' => false,
741
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_NOT_OWNER'
742
                ]);
743
            }
744
 
745
            $userMapper = UserMapper::getInstance($this->adapter);
746
            $user = $userMapper->fetchOneByUuid($user_id);
747
 
748
            if(!$user) {
749
                return new JsonModel([
750
                    'success' => false,
751
                    'data' => 'ERROR_USER_NOT_FOUND'
752
                ]);
753
            }
754
 
755
            if($chatGroupOwner->user_id == $user->id) {
756
                return new JsonModel([
757
                    'success' => false,
758
                    'data' => 'ERROR_CHAT_I_CAN_NOT_REMOVE_MYSELF'
759
                ]);
760
            }
761
 
762
 
763
 
764
 
765
            $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $user->id);
766
            if(!$chatGroupUser) {
767
                return new JsonModel([
768
                    'success' => false,
769
                    'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
770
                ]);
771
            }
772
 
773
 
774
            $response = $chatGroupUserMapper->deleteByGroupIdAndUserId($chatGroup->id, $user->id);
775
            if($response) {
3086 efrain 776
                $userMapper->updateLastActivity($currentUser->id);
777
 
1 www 778
                return new JsonModel([
779
                    'success' => true
780
                ]);
781
            } else {
782
                return new JsonModel([
783
                    'success' => false,
784
                    'data' => $chatGroupMapper->getError()
785
                ]);
786
            }
787
 
788
        } else {
789
            return new JsonModel([
790
                'success' => false,
791
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
792
            ]);
793
        }
794
    }
795
 
796
 
797
    /**
798
     * Abandonar un grupo
799
     * 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.
800
     * Parámetros del route
801
     * :group_id = id del grupo encriptado
802
     * En caso de una respuesta positiva
803
     * [
804
     *      'success' => true,
805
     * ]
806
     * En caso de un respuesta negativa
807
     * [
808
     *      'success' => false,
809
     *      'data' => (string) 'mensaje_de_error'
810
     * ]
811
     * @return \Laminas\View\Model\JsonModel
812
     */
813
    public function leaveGroupAction()
814
    {
815
        $request    = $this->getRequest();
816
        if($request->isPost()) {
817
            $currentUserPlugin = $this->plugin('currentUserPlugin');
818
            $currentUser = $currentUserPlugin->getUser();
819
 
820
            $result = false;
821
            $group_id = $this->params()->fromRoute('group_id');
822
 
823
 
824
            if(empty($group_id)) {
825
                return new JsonModel([
826
                    'success' => false,
827
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
828
                ]);
829
            }
830
 
831
 
832
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
833
            $chatGroup = $chatGroupMapper->fetchOneByUuid($group_id);
834
            if(!$chatGroup) {
835
                return new JsonModel([
836
                    'success' => false,
837
                    'data' => 'ERROR_GROUP_NOT_FOUND'
838
                ]);
839
            }
840
 
841
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
842
            $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
843
            if(!$chatGroupUser) {
844
                return new JsonModel([
845
                    'success' => false,
846
                    'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
847
                ]);
848
            }
849
 
850
            if($chatGroupUser->owner == ChatGroupUser::OWNER_YES) {
851
                return new JsonModel([
852
                    'success' => false,
853
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_OWNER'
854
                ]);
855
            }
856
 
857
 
858
            $result = $chatGroupUserMapper->deleteByGroupIdAndUserId($chatGroupUser->group_id, $chatGroupUser->user_id);
859
            if($result) {
3086 efrain 860
 
861
                $userMapper = UserMapper::getInstance($this->adapter);
862
                $userMapper->updateLastActivity($currentUser->id);
863
 
1 www 864
                return new JsonModel([
865
                    'success' => true
866
                ]);
867
            } else {
868
                return new JsonModel([
869
                    'success' => false,
870
                    'data' => $chatGroupMapper->getError()
871
                ]);
872
            }
873
 
874
 
875
 
876
        } else {
877
            return new JsonModel([
878
                'success' => false,
879
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
880
            ]);
881
        }
882
 
883
    }
884
 
885
    /**
886
     *
887
     * @param ChatGroup $chatGroup
888
     * @param int $page
889
     * @return array
890
     */
891
    private function getAllMessagesForChatGroup($chatGroup, $page = 0)
892
    {
893
        $currentUserPlugin = $this->plugin('currentUserPlugin');
894
        $currentUser = $currentUserPlugin->getUser();
895
 
896
        $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
897
        $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
898
 
899
        if(!$chatGroupUser) {
900
            return [
901
                'success' => false,
902
                'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
903
            ];
904
        }
905
 
3121 efrain 906
 
1 www 907
 
908
        $chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
909
        $paginator = $chatGroupMessageMapper->getPaginatorByGroupId($chatGroup->id, $page);
910
 
911
        $pages = $paginator->count();
912
        $page  = $paginator->getCurrentPageNumber();
913
 
914
        $items = [];
915
        $users = [];
916
        $userMapper = UserMapper::getInstance($this->adapter);
917
 
3086 efrain 918
        $utilMapper = UtilMapper::getInstance($this->adapter);
919
        $now = $utilMapper->getDatebaseNow();
920
 
1 www 921
        foreach ($paginator as $m)
922
        {
923
 
924
            if (isset($users[$m->sender_id])) {
925
                $userdata_from = $users[$m->sender_id];
926
            } else {
927
                $userdata_from = $userMapper->fetchOne($m->sender_id);
928
                $users[ $m->sender_id ] = $userdata_from;
929
            }
930
 
931
            $pic_from = $this->url()->fromRoute('storage', [
932
                'code' => $userdata_from->uuid,
933
                'type' => 'user',
934
                'filename' => $userdata_from->image
935
            ]);
936
            $u =  $userdata_from->id == $currentUser->id ? 1 : 2;
937
            if($m->type == ChatGroupMessage::TYPE_TEXT) {
938
                $content = $this->sanitize($m->content);
939
            } else {
940
                $content = $this->url()->fromRoute('storage', ['code' => $chatGroup->uuid, 'type' => 'chat', 'filename' => $m->content]);
941
            }
942
 
3086 efrain 943
 
944
 
3138 efrain 945
            $msgtime = Functions::timeAgo($m->added_on, $now);
1 www 946
            array_push($items, [
947
                'user_name' => trim($userdata_from->first_name . ' ' .$userdata_from->last_name) ,
948
                'user_id' => $userdata_from->uuid,
949
                'user_image' => $pic_from,
950
                'u' => $u,
951
                'mtype' => $m->type,
952
                'm' => $content,
953
                'time' => $msgtime,
954
                'id' => $m->uuid
955
            ]);
956
        }
957
 
958
        return [
959
            'success' => true,
960
            'data' => [
961
                'page' => $page,
962
                'pages' => $pages,
963
                'items' => $items
964
            ]
965
        ];
966
 
967
 
968
    }
969
 
970
    /**
971
     *
972
     * @param ChatUser $chatUser
973
     * @param int $page
974
     * @return array
975
     */
976
    private function getAllMessagesForChatUser($chatUser, $page = 0)
977
    {
978
        $currentUserPlugin = $this->plugin('currentUserPlugin');
979
        $currentUser = $currentUserPlugin->getUser();
980
 
3099 efrain 981
 
1 www 982
        $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
983
        $paginator = $chatMessageMapper->getAllMessagesPaginatorByChatId($chatUser->id, $page);
984
        $pages = $paginator->count();
985
        $page = $paginator->getCurrentPageNumber();
986
 
987
        $items = [];
988
        $users = [];
989
        $userMapper = UserMapper::getInstance($this->adapter);
990
 
3086 efrain 991
        $utilMapper = UtilMapper::getInstance($this->adapter);
992
        $now = $utilMapper->getDatebaseNow();
993
 
1 www 994
        $messages = $paginator->getCurrentItems();
995
        foreach ($messages as $m) {
996
            $from_id = (int) $m->from_id;
997
            $to_id = (int) $m->to_id;
998
 
999
            if (isset($users[$from_id])) {
1000
                $userdata_from = $users[$from_id];
1001
            } else {
1002
                $userdata_from = $userMapper->fetchOne($from_id);
1003
                $users[$from_id] = $userdata_from;
1004
            }
1005
 
1006
            $pic_from = $this->url()->fromRoute('storage', [
1007
                'code' => $userdata_from->uuid,
1008
                'type' => 'user',
1009
                'filename' => $userdata_from->image
1010
            ]);
1011
 
1012
            if (isset($users[$to_id])) {
1013
                $userdata_to = $users[$to_id];
1014
            } else {
1015
                $userdata_to = $userMapper->fetchOne($to_id);
1016
                $users[ $to_id ] = $userdata_to;
1017
            }
1018
 
1019
            $u = $m->from_id == $currentUser->id ? 1 : 2;
1020
 
2129 efrain 1021
            $seen = 0;
1022
            if ($m->to_id == $currentUser->id) {
1023
                $seen = $m->seen == ChatMessage::SEEN_NO ? 1 : 0;
1024
            }
1 www 1025
 
2129 efrain 1026
 
1 www 1027
            if($m->type == ChatMessage::TYPE_TEXT) {
1028
                $content = $this->sanitize($m->content);
1029
            } else {
1030
                $content = $this->url()->fromRoute('storage', ['code' => $chatUser->uuid, 'type' => 'chat', 'filename' => $m->content]);
1031
            }
1032
 
3138 efrain 1033
            $msgtime = Functions::timeAgo($m->added_on, $now);
1 www 1034
            array_push($items, [
1035
                'user_name' => ($userdata_from->first_name . ' ' . $userdata_from->last_name),
1036
                'user_id' => $userdata_from->uuid,
1037
                'user_image' => $pic_from,
1038
                'u' => $u,
1039
                'mtype' => $m->type,
1040
                'm' => $content,
1041
                'time' => $msgtime,
1042
                'id' => $m->uuid,
2129 efrain 1043
                'seen' => $seen,
1 www 1044
            ]);
1045
        }
1046
 
1047
 
1048
 
1049
 
3086 efrain 1050
 
1 www 1051
        return [
1052
            'success' => true,
1053
            'data' => [
1054
                'page' => $page,
1055
                'pages' => $pages,
1056
                'items' => $items,
3086 efrain 1057
                'online' => $currentUser->online ? 1 : 0,
1 www 1058
            ]
1059
        ];
1060
    }
1061
 
1062
    /**
1063
     * Recupera los mensajes de un chat individual o grupal
1064
     * 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.
1065
     * En caso de una respuesta positiva
1066
     * [
1067
     *      'success' => true,
1068
     *      'data' => [
1069
     *          'page' => 'entero número de página actúal',
1070
     *          'pages' => 'entero número total de páginaS',
1071
     *              'items' => [
1072
     *              'user_name' => 'nombre del usuario que envia',
1073
     *              'user_id_encript' => 'id encriptado del usuario que envia',
1074
     *              'user_image' => 'ruta de la imagén del usuario que envia',
1075
     *              'u' => '1 = si el usuario que envia es el usuario actual , 2 si no lo es',
1076
     *              'mtype' => 'text | file',
1077
     *              'm' => 'texto del mensaje o url del archivo',
1078
     *              'time' => 'cadena que da el tiempo del mensaje ejemplo 1seg',
1079
     *          ],
1080
     *          'online' => 'true/false'
1081
     *      ]
1082
     * ]
1083
     * En caso de un respuesta negativa
1084
     * [
1085
     *      'success' => false,
1086
     *      'data' => (string) 'mensaje_de_error'
1087
     * ]
1088
     * @return \Laminas\View\Model\JsonModel
1089
     */
1090
    public function getAllMessagesAction()
1091
    {
1092
 
1093
        $request    = $this->getRequest();
1094
        if($request->isGet()) {
1095
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1096
            $currentUser = $currentUserPlugin->getUser();
1097
 
1098
 
1099
            $id     = $this->params()->fromRoute('id');
1100
            $page   = filter_var($this->params()->fromQuery('page', 0), FILTER_SANITIZE_NUMBER_INT);
1101
 
1102
            if(!$id) {
1103
                return new JsonModel([
1104
                    'success' => false,
1105
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1106
                ]);
1107
            }
1108
 
1109
            /**** Mensajes de un chat grupal ****/
1110
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1111
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1112
            if ($chatGroup) {
1113
                $response = $this->getAllMessagesForChatGroup($chatGroup, $page);
1114
                return new JsonModel($response);
1115
            } else {
1116
 
1117
                $userMapper = UserMapper::getInstance($this->adapter);
1118
                $user = $userMapper->fetchOneByUuid($id);
1119
                if(!$user) {
1120
                    return new JsonModel([
1121
                        'success' => false,
1122
                        'data' => 'ERROR_USER_NOT_FOUND'
1123
                    ]);
1124
                }
1125
 
1126
 
1127
 
1128
 
1129
 
1130
 
1131
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
1132
                $connection = $connectionMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1133
                if(!$connection || $connection->status != Connection::STATUS_ACCEPTED) {
1134
 
1135
                    return new JsonModel([
1136
                        'success' => false,
1137
                        'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
1138
                    ]);
1139
 
1140
                }
1141
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
1142
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1143
                if(!$chatUser) {
1144
                    $chatUser = new ChatUser();
1145
                    $chatUser->user_id1 = $currentUser->id;
1146
                    $chatUser->user_id2 = $user->id;
1147
 
1148
                    $response = $chatUserMapper->insert($chatUser);
1149
 
1150
 
1151
                    if(!$response) {
1152
                        return new JsonModel([
1153
                            'success' => false,
1154
                            'data' => $chatUserMapper->getError()
1155
                        ]);
1156
                    }
1157
 
1158
                    $chatUser = $chatUserMapper->fetchOne($chatUser->id);
1159
                    $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
1160
                    $dirpath = $fullpath_chat . $chatUser->uuid;
1161
                    if (! file_exists($dirpath)) {
1162
                        mkdir($dirpath, 0777, true);
1163
                        chmod($dirpath, 0777);
1164
                    }
1165
 
1166
                }
1167
 
1168
 
1169
 
1170
                $response = $this->getAllMessagesForChatUser($chatUser, $page);
1171
                return new JsonModel($response);
1172
 
1173
            }
1174
 
1175
        } else {
1176
            return new JsonModel([
1177
                'success' => false,
1178
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1179
            ]);
1180
        }
1181
 
1182
    }
3121 efrain 1183
 
1 www 1184
 
3121 efrain 1185
 
1 www 1186
    /**
1187
     * Envia un mensaje a un chat individual o grupal
1188
     * 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.
1189
     * Parámetros del route
1190
     * :id = id del chat encriptado
1191
     * Como parámentro solo se espera un campo
1192
     * message: string
1193
     * En caso de una respuesta positiva
1194
     * [
1195
     *      'success' => true,
1196
     *      'user_name' => 'nombre del usuario que envia',
1197
     *      'user_id_encripted' => 'id encriptado del usuario que envia',
1198
     *      'user_image' => 'ruta de la imagén del usuario que envia',
1199
     *      'u' => '1 = si el usuario que envia es el usuario actual , 2 si no lo es',
1200
     *      'mtype' => 'text | file',
1201
     *      'm' => 'texto del mensaje o url del archivo',
1202
     *      'time' => 'cadena que da el tiempo del mensaje ejemplo 1seg',
1203
      * ]
1204
     * En caso de un respuesta negativa
1205
     * [
1206
     *      'success' => false,
1207
     *      'data' => (string) 'mensaje_de_error'
1208
     * ]
1209
     * @return \Laminas\View\Model\JsonModel
1210
     */
1211
    public function sendAction()
1212
    {
1213
 
1214
        $request    = $this->getRequest();
1215
        if($request->isPost()) {
1216
            $id         = $this->params()->fromRoute('id');
1217
            $message    = trim(filter_var($this->params()->fromPost('message', ''), FILTER_SANITIZE_STRING));
1218
 
1219
            if(!$id || empty($message)) {
1220
                return new JsonModel([
1221
                    'success' => false,
1222
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1223
                ]);
1224
            }
1225
 
1226
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1227
            $currentUser = $currentUserPlugin->getUser();
1228
 
1229
            $userMapper = UserMapper::getInstance($this->adapter);
1230
            $sender_result = $userMapper->fetchOne($currentUser->id);
1231
            $sender_name = trim($sender_result->first_name . ' ' . $sender_result->last_name);
1232
            $sender_pic = $this->url()->fromRoute('storage', [
1233
                'code' => $sender_result->uuid,
1234
                'type' => 'user',
1235
                'filename' => $sender_result->image
1236
            ]);
1237
 
1238
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1239
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1240
            if($chatGroup) {
1241
 
1242
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1243
                $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
1244
 
1245
                if(!$chatGroupUser) {
1246
                    return new JsonModel([
1247
                        'success' => false,
1248
                        'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
1249
                    ]);
1250
                }
1251
 
1252
                $chatGroupMessage = new ChatGroupMessage();
1253
                $chatGroupMessage->sender_id = $currentUser->id;
1254
                $chatGroupMessage->group_id = $chatGroup->id;
1255
                $chatGroupMessage->content = $message;
1256
                $chatGroupMessage->type = ChatGroupMessage::TYPE_TEXT;
1257
 
1258
                $chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
1259
                $result = $chatGroupMessageMapper->insert($chatGroupMessage);
1260
                if(!$result) {
1261
                    return new JsonModel([
1262
                        'success' => false,
1263
                        'data' => $chatGroupMessageMapper->getError()
1264
                    ]);
1265
                }
1266
                $chatGroupMessage = $chatGroupMessageMapper->fetchOne($chatGroupMessage->id);
1267
 
1268
 
1269
                $chatGroupUserMessage = new ChatGroupUserMessage();
1270
                $chatGroupUserMessage->group_id = $chatGroupMessage->group_id;
1271
                $chatGroupUserMessage->message_id = $chatGroupMessage->id;
1272
                $chatGroupUserMessage->receiver_id = $currentUser->id;
1273
                $chatGroupUserMessage->recd = ChatGroupUserMessage::RECD_YES;
1274
                $chatGroupUserMessage->seen = ChatGroupUserMessage::SEEN_NO;
1275
 
1276
                $chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
1277
                $result = $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
1278
                if(!$result) {
1279
                    return new JsonModel([
1280
                        'success' => false,
1281
                        'data' => $chatGroupUserMessageMapper->getError()
1282
                    ]);
1283
                }
1284
 
1285
 
1286
                $results = $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
1287
                foreach ($results as $r)
1288
                {
1289
                    if ($r->user_id != $currentUser->id) {
1290
                        $chatGroupUserMessage               = new ChatGroupUserMessage();
1291
                        $chatGroupUserMessage->group_id     = $chatGroupMessage->group_id;
1292
                        $chatGroupUserMessage->message_id   = $chatGroupMessage->id;
1293
                        $chatGroupUserMessage->receiver_id  = $r->user_id;
1294
                        $chatGroupUserMessage->recd         = ChatGroupUserMessage::RECD_NO;
1295
                        $chatGroupUserMessage->seen         = ChatGroupUserMessage::SEEN_NO;
1296
 
1297
                        $result = $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
1298
                        if(!$result) {
1299
                            return new JsonModel([
1300
                                'success' => false,
1301
                                'data' => $chatGroupUserMessageMapper->getError()
1302
                            ]);
1303
                        }
1304
                    }
1305
                }
3086 efrain 1306
 
1307
                $utilMapper = UtilMapper::getInstance($this->adapter);
1308
                $now = $utilMapper->getDatebaseNow();
1 www 1309
 
3138 efrain 1310
                $msgtime = Functions::timeAgo($now, $now);
1 www 1311
                return new JsonModel([
1312
                    'success' => true,
1313
                    'data' => [
1314
                        'user_name'         => $sender_name,
1315
                        'user_id_encripted' => $sender_result->uuid,
1316
                        'user_image'        => $sender_pic,
1317
                        'u'                 => 1,
1318
                        'mtype'             => 'text',
1319
                        'm'                 => $message,
1320
                        'time'              => $msgtime,
1321
                        'id'                => $chatGroupMessage->uuid,
1322
                    ]
1323
                ]);
1324
 
1325
 
1326
 
1327
            } else {
1328
                $userMapper = UserMapper::getInstance($this->adapter);
1329
                $user = $userMapper->fetchOneByUuid($id);
1330
                if(!$user) {
1331
                    return new JsonModel([
1332
                        'success' => false,
1333
                        'data' => 'ERROR_USER_NOT_FOUND'
1334
                    ]);
1335
                }
1336
 
1337
 
1338
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
1339
                $connection = $connectionMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1340
                if(!$connection || $connection->status != Connection::STATUS_ACCEPTED) {
1341
 
1342
                    return new JsonModel([
1343
                        'success' => false,
1344
                        'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
1345
                    ]);
1346
 
1347
                }
1348
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
1349
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1350
                if(!$chatUser) {
1351
                    $chatUser = new ChatUser();
1352
                    $chatUser->user_id1 = $currentUser->id;
1353
                    $chatUser->user_id2 = $user->id;
1354
 
1355
                    $response = $chatUserMapper->insert($chatUser);
1356
                    if(!$response) {
1357
                        return new JsonModel([
1358
                            'success' => false,
1359
                            'data' => $chatUserMapper->getError()
1360
                        ]);
1361
                    }
1362
 
1363
                    $chatUser = $chatUserMapper->fetchOne($chatUser->id);
1364
                    $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
1365
                    $dirpath = $fullpath_chat . $chatUser->uuid;
1366
                    if (! file_exists($dirpath)) {
1367
                        mkdir($dirpath, 0777, true);
1368
                        chmod($dirpath, 0777);
1369
                    }
1370
 
1371
                }
1372
 
1373
 
1374
 
1375
                $chatMessage = new ChatMessage();
1376
                $chatMessage->chat_id   = $chatUser->id;
1377
                $chatMessage->from_id   = $currentUser->id;
1378
                $chatMessage->to_id     = $user->id;
1379
                $chatMessage->content   = $message;
1380
                $chatMessage->type      = ChatMessage::TYPE_TEXT;
1381
                $chatMessage->recd      = ChatMessage::RECD_NO;
1382
                $chatMessage->seen      = ChatMessage::SEEN_NO;
1383
 
1384
                $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
1385
                $result = $chatMessageMapper->insert($chatMessage);
1386
                if(!$result) {
1387
                    return new JsonModel([
1388
                        'success' => false,
1389
                        'data' => $chatMessageMapper->getError()
1390
                    ]);
1391
                }
1392
 
1393
                $chatMessage = $chatMessageMapper->fetchOne($chatMessage->id);
3086 efrain 1394
 
1395
                $utilMapper = UtilMapper::getInstance($this->adapter);
1396
                $now = $utilMapper->getDatebaseNow();
1 www 1397
 
3138 efrain 1398
                $msgtime = Functions::timeAgo($now, $now);
1 www 1399
                return new JsonModel([
1400
                    'success' => true,
1401
                    'data' => [
1402
                        'user_name'     => $sender_name,
1403
                        'user_id'       => $sender_result->uuid,
1404
                        'user_image'    => $sender_pic,
1405
                        'u'             => 1,
1406
                        'mtype'         => ChatMessage::TYPE_TEXT,
1407
                        'm'             => $message,
1408
                        'time'          => $msgtime,
1409
                        'id'            => $chatMessage->uuid,
1410
                    ]
1411
                 ]);
1412
 
1413
 
1414
            }
3086 efrain 1415
 
3121 efrain 1416
 
3116 efrain 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) {
3121 efrain 1826
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1827
                $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
3099 efrain 1828
 
3121 efrain 1829
                if(!$chatGroupUser) {
1830
                    return new JsonModel([
1831
                        'success' => false,
1832
                        'data' =>  'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
1833
                    ]);
1834
                }
1835
 
3099 efrain 1836
                $chatGroupUserMapper->markIsClose($chatGroup->id, $currentUser->id);
1837
 
1838
 
1 www 1839
            } else {
1840
 
1841
                $userMapper = UserMapper::getInstance($this->adapter);
1842
                $user = $userMapper->fetchOneByUuid($id);
1843
                if(!$user) {
1844
                    return new JsonModel([
1845
                        'success' => false,
1846
                        'data' => 'ERROR_USER_NOT_FOUND'
1847
                    ]);
1848
                }
1849
 
1850
 
1851
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
1852
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1853
                if($chatUser) {
3099 efrain 1854
 
1855
                    if($currentUser->id == $chatUser->user_id1) {
3113 efrain 1856
                        $chatUserMapper->markIsClose1($chatUser->id);
1857
                    } else {
3112 efrain 1858
                        $chatUserMapper->markIsClose2($chatUser->id);
3099 efrain 1859
                    }
1860
 
1861
 
1 www 1862
                }
1863
            }
1864
 
3086 efrain 1865
 
1866
            $userMapper->updateLastActivity($currentUser->id);
1 www 1867
 
1868
            return new JsonModel([
1869
                'success' => true
1870
            ]);
1871
        } else {
1872
            return new JsonModel([
1873
                'success' => false,
1874
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1875
            ]);
1876
        }
1877
    }
1878
 
1879
    /**
1880
     * Clear como su nombre lo indica es borrar los mensajes entre el usuario actual y otro usuario con quien sostiene el chat
1881
     * 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.
1882
     * Parámetros del route
1883
     * :id = id del usuario encriptado
1884
     * En caso de una respuesta positiva
1885
     * [
1886
     *      'success' => true,
1887
     *      'data'=> (int) registros_borrados
1888
     * ]
1889
     * En caso de un respuesta negativa
1890
     * [
1891
     *      'success' => false,
1892
     *      'data' => (string) 'mensaje_de_error'
1893
     * ]
1894
     * @return \Laminas\View\Model\JsonModel
1895
     */
1896
    public function clearAction()
1897
    {
1898
        $request    = $this->getRequest();
1899
        if($request->isPost()) {
1900
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1901
            $currentUser = $currentUserPlugin->getUser();
1902
 
1903
            $id = filter_var($this->params()->fromRoute('id'), FILTER_SANITIZE_STRING);
1904
 
1905
            if (!$id) {
1906
                return new JsonModel([
1907
                    'success' => false,
1908
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1909
                ]);
1910
            }
3121 efrain 1911
 
1 www 1912
 
1913
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1914
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1915
            if ($chatGroup) {
3099 efrain 1916
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
3121 efrain 1917
                $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
1918
 
1919
                if(!$chatGroupUser) {
1920
                    return new JsonModel([
1921
                        'success' => false,
1922
                        'data' =>  'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
1923
                    ]);
1924
                }
1925
 
3099 efrain 1926
                $chatGroupUserMapper->markIsClose($chatGroup->id, $currentUser->id);
1 www 1927
            } else {
1928
 
1929
                $userMapper = UserMapper::getInstance($this->adapter);
1930
                $user = $userMapper->fetchOneByUuid($id);
1931
                if(!$user) {
1932
                    return new JsonModel([
1933
                        'success' => false,
1934
                        'data' => 'ERROR_USER_NOT_FOUND'
1935
                    ]);
1936
                }
1937
 
1938
 
1939
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
1940
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
1941
                if($chatUser) {
3099 efrain 1942
                    if($currentUser->id == $chatUser->user_id1) {
3113 efrain 1943
                        $chatUserMapper->markIsClose1($chatUser->id);
1944
                    } else {
3112 efrain 1945
                        $chatUserMapper->markIsClose2($chatUser->id);
3099 efrain 1946
                    }
1947
 
1 www 1948
                }
1949
            }
3086 efrain 1950
 
3099 efrain 1951
 
3086 efrain 1952
            $userMapper->updateLastActivity($currentUser->id);
1953
 
1 www 1954
            return new JsonModel([
1955
                'success' => true
1956
            ]);
1957
        } else {
1958
            return new JsonModel([
1959
                'success' => false,
1960
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1961
            ]);
1962
        }
1963
    }
1964
 
3121 efrain 1965
    /**
1966
     * Marca como abierto el caht
1967
     * Es una petición POST el url que contiene el ID encriptado del chat (/chat/open/:id) y la cuál se recibe en la función heartBeat.
1968
     * Parámetros del route
1969
     * :id = id del usuario encriptado
1970
     * En caso de una respuesta positiva
1971
     * [
1972
     *      'success' => true,
1973
     *      'data'=> (int) registros_borrados
1974
     * ]
1975
     * En caso de un respuesta negativa
1976
     * [
1977
     *      'success' => false,
1978
     *      'data' => (string) 'mensaje_de_error'
1979
     * ]
1980
     * @return \Laminas\View\Model\JsonModel
1981
     */
1982
    public function openAction()
1983
    {
1984
        $request    = $this->getRequest();
1985
        if($request->isPost()) {
1986
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1987
            $currentUser = $currentUserPlugin->getUser();
1988
 
1989
            $id = filter_var($this->params()->fromRoute('id'), FILTER_SANITIZE_STRING);
1990
 
1991
            if (!$id) {
1992
                return new JsonModel([
1993
                    'success' => false,
1994
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1995
                ]);
1996
            }
1997
 
1998
 
1999
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2000
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
2001
            if ($chatGroup) {
2002
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2003
                $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2004
 
2005
                if(!$chatGroupUser) {
2006
                    return new JsonModel([
2007
                        'success' => false,
2008
                        'data' =>  'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
2009
                    ]);
2010
                }
2011
 
2012
                $chatGroupUserMapper->markIsOpen($chatGroup->id, $currentUser->id);
2013
            } else {
2014
 
2015
                $userMapper = UserMapper::getInstance($this->adapter);
2016
                $user = $userMapper->fetchOneByUuid($id);
2017
                if(!$user) {
2018
                    return new JsonModel([
2019
                        'success' => false,
2020
                        'data' => 'ERROR_USER_NOT_FOUND'
2021
                    ]);
2022
                }
2023
 
2024
 
2025
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2026
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2027
                if($chatUser) {
2028
                    if($currentUser->id == $chatUser->user_id1) {
2029
                        $chatUserMapper->markIsOpen1($chatUser->id);
2030
                    } else {
2031
                        $chatUserMapper->markIsOpen2($chatUser->id);
2032
                    }
2033
 
2034
                }
2035
            }
2036
 
2037
 
2038
            $userMapper->updateLastActivity($currentUser->id);
2039
 
2040
            return new JsonModel([
2041
                'success' => true
2042
            ]);
2043
        } else {
2044
            return new JsonModel([
2045
                'success' => false,
2046
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2047
            ]);
2048
        }
2049
    }
2050
 
1 www 2051
    public function uploadAction()
2052
    {
2053
        $request    = $this->getRequest();
2054
        if($request->isPost()) {
2055
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2056
            $currentUser = $currentUserPlugin->getUser();
2057
 
2058
            $id = filter_var($this->params()->fromRoute('id'), FILTER_SANITIZE_STRING);
2059
            if (!$id) {
2060
                return new JsonModel([
2061
                    'success' => false,
2062
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2063
                ]);
2064
            }
2065
 
2066
            $files = $this->getRequest()->getFiles()->toArray();
2067
            if(!isset($files['file']) || !empty($files['file']['error'])) {
2068
                return new JsonModel([
2069
                    'success' => false,
2070
                    'data' => 'ERROR_FILE_NOT_UPLOAD'
2071
                ]);
2072
            }
2073
 
2074
            $tmp_filename   = $files['file']['tmp_name'];
2075
            if(!$this->validMimeType($tmp_filename)) {
2076
                return new JsonModel([
2077
                    'success' => false,
2078
                    'data' => 'ERROR_FILE_UPLODED_IS_NOT_VALID'
2079
                ]);
2080
            }
2081
 
2082
 
2083
            $extensions     = explode('.', $files['file']['name']);
2084
            $extension      = strtolower(trim($extensions[count($extensions) - 1]));
2085
            $filename       = uniqid() . '.' . $extension;
2086
 
2087
 
2088
            $mime_type = mime_content_type($tmp_filename);
2089
            if($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {
2090
                $file_type = 'image';
2091
            } else if($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {
2092
                $file_type = 'video';
2093
            } else if($mime_type == 'application/pdf') {
2094
                $file_type = 'document';
2095
            }
2096
 
2097
 
2098
            $userMapper = UserMapper::getInstance($this->adapter);
2099
            $sender_result = $userMapper->fetchOne($currentUser->id);
2100
            $sender_from = trim($sender_result->first_name . ' ' . $sender_result->last_name);
2101
            $sender_pic = $this->url()->fromRoute('storage', [
2102
                'code' => $sender_result->uuid,
2103
                'type' => 'user',
2104
                'filename' => $sender_result->image
2105
            ]);
2106
 
2107
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2108
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
2109
            if($chatGroup) {
2110
 
2111
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2112
                $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2113
 
2114
                if(!$chatGroupUser) {
2115
                    return new JsonModel([
2116
                        'success' => false,
2117
                        'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
2118
                    ]);
2119
                }
2120
 
2121
 
2122
                $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
2123
                $dirpath = $fullpath_chat . $chatGroup->uuid;
2124
                if (! file_exists($dirpath)) {
2125
                    mkdir($dirpath, 0777, true);
2126
                    chmod($dirpath, 0777);
2127
                }
2128
 
2129
                $full_filename = $dirpath . DIRECTORY_SEPARATOR . $filename;
2130
                if(!move_uploaded_file($tmp_filename, $full_filename)) {
2131
                    return new JsonModel([
2132
                        'success' => false,
2133
                        'data' => 'ERROR_FILE_UPLOADED_NOT_MOVE'
2134
                    ]);
2135
                }
2136
 
2137
                $chatGroupMessage = new ChatGroupMessage();
2138
                $chatGroupMessage->sender_id    = $currentUser->id;
2139
                $chatGroupMessage->group_id     = $chatGroup->id;
2140
                $chatGroupMessage->content      = $filename;
2141
                $chatGroupMessage->type         = $file_type;
2142
 
2143
                $chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
2144
                $result = $chatGroupMessageMapper->insert($chatGroupMessage);
2145
                if(!$result) {
2146
                    return new JsonModel([
2147
                        'success' => false,
2148
                        'data' => $chatGroupMessageMapper->getError()
2149
                    ]);
2150
                }
2151
 
2152
                $chatGroupMessage = $chatGroupMessageMapper->fetchOne($chatGroupMessage->id);
2153
 
2154
 
2155
                $chatGroupUserMessage = new ChatGroupUserMessage();
2156
                $chatGroupUserMessage->group_id = $chatGroupMessage->group_id;
2157
                $chatGroupUserMessage->message_id = $chatGroupMessage->id;
2158
                $chatGroupUserMessage->receiver_id = $currentUser->id;
2159
                $chatGroupUserMessage->recd = ChatGroupUserMessage::RECD_YES;
2160
                $chatGroupUserMessage->seen = ChatGroupUserMessage::SEEN_YES;
2161
 
2162
 
2163
                $chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
2164
                $result = $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
2165
                if(!$result) {
2166
                    return new JsonModel([
2167
                        'success' => false,
2168
                        'data' => $chatGroupUserMessageMapper->getError()
2169
                    ]);
2170
                }
2171
 
2172
 
2173
 
2174
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2175
 
2176
                $results = $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
2177
                foreach ($results as $r)
2178
                {
2179
                    if ($r->user_id != $currentUser->id) {
2180
                        $chatGroupUserMessage = new ChatGroupUserMessage();
2181
                        $chatGroupUserMessage->group_id = $chatGroupMessage->group_id;
2182
                        $chatGroupUserMessage->message_id = $chatGroupMessage->id;
2183
                        $chatGroupUserMessage->receiver_id= $r->user_id;
2184
                        $chatGroupUserMessage->recd = ChatGroupUserMessage::RECD_NO;
2185
                        $chatGroupUserMessage->seen = ChatGroupUserMessage::SEEN_NO;
2186
 
2187
                        $result = $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
2188
                        if(!$result) {
2189
                            return new JsonModel([
2190
                                'success' => false,
2191
                                'data' => $chatGroupUserMessageMapper->getError()
2192
                            ]);
2193
                        }
2194
 
2195
 
2196
                    }
2197
                }
3086 efrain 2198
 
2199
 
2200
                $userMapper->updateLastActivity($currentUser->id);
2201
 
2202
                $utilMapper = UtilMapper::getInstance($this->adapter);
2203
                $now = $utilMapper->getDatebaseNow();
1 www 2204
 
3138 efrain 2205
                $msgtime = Functions::timeAgo($now, $now);
1 www 2206
                return new JsonModel([
2207
                    'success' => true,
2208
                    'data' => [
2209
                        'user_name'     => $sender_from,
2210
                        'user_id'       => $currentUser->uuid,
2211
                        'user_image'    => $sender_pic,
2212
                        'u'             => 1,
2213
                        'mtype'         => $file_type,
2214
                        'm'             => $this->url()->fromRoute('storage', ['code' => $chatGroup->uuid, 'type' => 'chat', 'filename' => $filename]),
2215
                        'time'          => $msgtime,
2216
                        'id'            => $chatGroupMessage->uuid
2217
                    ]
2218
                ]);
2219
 
2220
 
2221
            } else {
2222
 
2223
                $user = $userMapper->fetchOneByUuid($id);
2224
                if(!$user) {
2225
                    return new JsonModel([
2226
                        'success' => false,
2227
                        'data' => 'ERROR_USER_NOT_FOUND'
2228
                    ]);
2229
                }
2230
 
2231
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2232
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2233
                if(!$chatUser) {
2234
                    return new JsonModel([
2235
                        'success' => false,
2236
                        'data' => 'ERROR_CHAT_NOT_FOUND'
2237
                    ]);
2238
                }
2239
 
2240
                $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
2241
                $dirpath = $fullpath_chat . $chatUser->uuid;
2242
 
2243
                if (! file_exists($dirpath)) {
2244
                    mkdir($dirpath, 0777, true);
2245
                    chmod($dirpath, 0777);
2246
                }
2247
 
2248
                $full_filename = $dirpath . DIRECTORY_SEPARATOR . $filename;
2249
                if(!move_uploaded_file($tmp_filename, $full_filename)) {
2250
                    return new JsonModel([
2251
                        'success' => false,
2252
                        'data' => 'ERROR_FILE_UPLOADED_NOT_MOVE'
2253
                    ]);
2254
                }
2255
 
2256
                $chatMessage = new ChatMessage();
2257
                $chatMessage->chat_id = $chatUser->id;
2258
                $chatMessage->from_id = $currentUser->id;
2259
                $chatMessage->to_id = $user->id;
2260
                $chatMessage->content = $filename;
2261
                $chatMessage->type = $file_type;
2262
                $chatMessage->recd = ChatMessage::RECD_NO;
2263
                $chatMessage->seen = ChatMessage::SEEN_NO;
2264
 
2265
 
2266
                $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
2267
                $result = $chatMessageMapper->insert($chatMessage);
2268
                if(!$result) {
2269
                    return new JsonModel([
2270
                        'success' => false,
2271
                        'data' =>  $chatMessageMapper->getError()
2272
                    ]);
2273
                }
2274
 
2275
                $chatMessage = $chatMessageMapper->fetchOne($chatMessage->id);
2276
 
3086 efrain 2277
                $userMapper->updateLastActivity($currentUser->id);
1 www 2278
 
3086 efrain 2279
                $utilMapper = UtilMapper::getInstance($this->adapter);
2280
                $now = $utilMapper->getDatebaseNow();
2281
 
3138 efrain 2282
                $msgtime = Functions::timeAgo($chatMessage->added_on, $now);
1 www 2283
                return new JsonModel([
2284
                    'success' => true,
2285
                    'data' => [
2286
                        'user_name' => $sender_from,
2287
                        'user_id' => $currentUser->uuid,
2288
                        'user_image' => $sender_pic,
2289
                        'u' => 1,
2290
                        'mtype' => $file_type,
2291
                        'm' => $this->url()->fromRoute('storage', ['code' => $currentUser->uuid, 'type' => 'chat', 'filename' => $filename]),
2292
                        'time' => $msgtime,
2293
                        'id' => $chatMessage->uuid
2294
                    ]
2295
                ]);
2296
 
2297
            }
2298
        } else {
2299
            return new JsonModel([
2300
                'success' => false,
2301
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2302
            ]);
2303
        }
2304
    }
2305
 
2306
    public function markSeenAction()
2307
    {
2308
        $request = $this->getRequest();
2309
        if($request->isPost()) {
2310
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2311
            $currentUser = $currentUserPlugin->getUser();
2312
 
2313
            $id = $this->params()->fromRoute('id');
2314
            if (!$id) {
2315
                return new JsonModel([
2316
                    'success' => false,
2317
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2318
                ]);
2319
            }
2320
 
2321
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2322
            $chatGroup =  $chatGroupMapper->fetchOneByUuid($id);
2323
 
2324
            if($chatGroup) {
2325
 
2326
                $charGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2327
                $chatGroupUser = $charGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2328
 
2329
                if(!$chatGroupUser) {
2330
                    return new JsonModel([
2331
                        'success' => false,
2332
                        'data' =>  'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
2333
                    ]);
2334
                }
2335
 
2336
                $charGroupUserMessage = ChatGroupUserMessageMapper::getInstance($this->adapter);
2337
                $result = $charGroupUserMessage->markAsSeenByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2338
                if($result) {
2339
                    return new JsonModel([
2340
                        'success' => true,
2341
                    ]);
2342
                } else {
2343
                    return new JsonModel([
2344
                        'success' => false,
2345
                        'data' =>  $charGroupUserMessage->getError()
2346
                    ]);
2347
                }
2348
 
2349
 
2350
            } else {
2351
                $userMapper = UserMapper::getInstance($this->adapter);
2352
                $user = $userMapper->fetchOneByUuid($id);
2353
 
2354
                if(!$user) {
2355
                    return new JsonModel([
2356
                        'success' => false,
2357
                        'data' => 'ERROR_USER_NOT_FOUND'
2358
                    ]);
2359
                }
2360
 
2361
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2362
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2363
                if(!$chatUser) {
2364
                    return new JsonModel([
2365
                        'success' => false,
2366
                        'data' => 'ERROR_CHAT_NOT_FOUND'
2367
                    ]);
2368
                }
2369
 
2370
                $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
2371
                $result = $chatMessageMapper->markAsSeenByChatIdAndToId($chatUser->id, $currentUser->id);
2372
                if($result) {
2373
                    return new JsonModel([
2374
                        'success' => true,
2375
                    ]);
2376
                } else {
2377
                    return new JsonModel([
2378
                        'success' => false,
2379
                        'data' =>  $charGroupUserMessage->getError()
2380
                    ]);
2381
                }
2382
 
2383
            }
2384
 
2385
 
2386
        } else {
2387
            $response = [
2388
                'success' => false,
2389
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2390
            ];
2391
        }
2392
 
2393
        return new JsonModel($response);
2394
    }
2395
 
2396
 
2397
    public function markReceivedAction()
2398
    {
2399
        $request = $this->getRequest();
2400
        if($request->isPost()) {
2401
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2402
            $currentUser = $currentUserPlugin->getUser();
2403
 
2404
            $id = $this->params()->fromRoute('id');
2405
            if (!$id) {
2406
                return new JsonModel([
2407
                    'success' => false,
2408
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2409
                ]);
2410
            }
2411
 
2412
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2413
            $chatGroup =  $chatGroupMapper->fetchOneByUuid($id);
2414
 
2415
            if($chatGroup) {
2416
 
2417
                $charGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2418
                $chatGroupUser = $charGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2419
 
2420
                if(!$chatGroupUser) {
2421
                    return new JsonModel([
2422
                        'success' => false,
2423
                        'data' =>  'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
2424
                    ]);
2425
                }
2426
 
2427
                $charGroupUserMessage = ChatGroupUserMessageMapper::getInstance($this->adapter);
2428
                $result = $charGroupUserMessage->markAsReceivedByGroupIdAndUserId($chatGroup->id, $currentUser->id);
2429
                if($result) {
2430
                    return new JsonModel([
2431
                        'success' => true,
2432
                    ]);
2433
                } else {
2434
                    return new JsonModel([
2435
                        'success' => false,
2436
                        'data' =>  $charGroupUserMessage->getError()
2437
                    ]);
2438
                }
2439
 
2440
 
2441
            } else {
2442
                $userMapper = UserMapper::getInstance($this->adapter);
2443
                $user = $userMapper->fetchOneByUuid($id);
2444
 
2445
                if(!$user) {
2446
                    return new JsonModel([
2447
                        'success' => false,
2448
                        'data' => 'ERROR_USER_NOT_FOUND'
2449
                    ]);
2450
                }
2451
 
2452
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2453
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2454
                if(!$chatUser) {
2455
                    return new JsonModel([
2456
                        'success' => false,
2457
                        'data' => 'ERROR_CHAT_NOT_FOUND'
2458
                    ]);
2459
                }
2460
 
2461
                $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
2462
                $result = $chatMessageMapper->markAsReceivedByChatIdAndToId($chatUser->id, $currentUser->id);
2463
                if($result) {
2464
                    return new JsonModel([
2465
                        'success' => true,
2466
                    ]);
2467
                } else {
2468
                    return new JsonModel([
2469
                        'success' => false,
2470
                        'data' =>  $charGroupUserMessage->getError()
2471
                    ]);
2472
                }
2473
 
2474
            }
2475
 
2476
 
2477
        } else {
2478
            $response = [
2479
                'success' => false,
2480
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2481
            ];
2482
        }
2483
 
2484
        return new JsonModel($response);
2485
    }
4131 efrain 2486
 
2487
    public function zoomAction()
2488
    {
2489
        $request = $this->getRequest();
2490
        if($request->isPost()) {
2491
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2492
            $currentUser = $currentUserPlugin->getUser();
2493
 
2494
            $id = $this->params()->fromRoute('id');
2495
 
2496
            if (!$id) {
2497
                return new JsonModel([
2498
                    'success' => false,
2499
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2500
                ]);
2501
            }
2502
 
2503
            $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2504
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2505
 
4141 efrain 2506
            $chatUser = null;
2507
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
4131 efrain 2508
 
4141 efrain 2509
            if($chatGroup) {
2510
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2511
                $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
4131 efrain 2512
 
4141 efrain 2513
                if(!$chatGroupUser) {
4131 efrain 2514
                    $data = [
2515
                        'success' => false,
2516
                        'data' =>  'ERROR_ZOOM_CHAT_UNAUTHORIZE'
2517
                    ];
2518
 
2519
 
2520
                    return new JsonModel($data);
2521
                }
4141 efrain 2522
 
4131 efrain 2523
            } else {
4141 efrain 2524
 
2525
                $userMapper = UserMapper::getInstance($this->adapter);
2526
                $user = $userMapper->fetchOneByUuid($id);
2527
                if(!$user) {
2528
                    return new JsonModel([
2529
                        'success' => false,
2530
                        'data' => 'ERROR_USER_NOT_FOUND'
2531
                    ]);
2532
                }
4131 efrain 2533
 
4141 efrain 2534
 
2535
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
2536
                $connection = $connectionMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2537
                if(!$connection || $connection->status != Connection::STATUS_ACCEPTED) {
4131 efrain 2538
 
4141 efrain 2539
                    return new JsonModel([
2540
                        'success' => false,
2541
                        'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
2542
                    ]);
2543
 
2544
                }
2545
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2546
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
2547
                if(!$chatUser) {
2548
                    $chatUser = new ChatUser();
2549
                    $chatUser->user_id1 = $currentUser->id;
2550
                    $chatUser->user_id2 = $user->id;
2551
 
2552
                    $response = $chatUserMapper->insert($chatUser);
2553
                    if(!$response) {
2554
                        return new JsonModel([
4131 efrain 2555
                            'success' => false,
4141 efrain 2556
                            'data' => $chatUserMapper->getError()
2557
                        ]);
4131 efrain 2558
                    }
2559
 
4141 efrain 2560
                    $chatUser = $chatUserMapper->fetchOne($chatUser->id);
2561
                    $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
2562
                    $dirpath = $fullpath_chat . $chatUser->uuid;
2563
                    if (! file_exists($dirpath)) {
2564
                        mkdir($dirpath, 0777, true);
2565
                        chmod($dirpath, 0777);
2566
                    }
2567
 
4131 efrain 2568
                }
4141 efrain 2569
 
4131 efrain 2570
            }
2571
 
2572
 
2573
 
2574
 
4141 efrain 2575
 
4131 efrain 2576
            if(!$chatUser && !$chatGroup) {
2577
                $data = [
2578
                    'success' => false,
2579
                    'data' => 'ERROR_ZOOM_CHAT_NOT_FOUND'
2580
                ];
2581
 
2582
 
2583
                return new JsonModel($data);
2584
            }
2585
 
2586
            $dataPost = $request->getPost()->toArray();
2587
            $form = new ZoomAddForm();
2588
            $form->setData($dataPost);
2589
            if($form->isValid()) {
2590
 
2591
                $dataPost = (array) $form->getData();
1 www 2592
 
4131 efrain 2593
 
2594
                $dtStart = \DateTime::createFromFormat('Y-m-d H:i:s',$dataPost['date'] . ' ' . $dataPost['time']);
2595
                if(!$dtStart) {
2596
                    return new JsonModel([
2597
                        'success' => false,
2598
                        'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2599
                    ]);
2600
                }
2601
 
2602
 
2603
 
2604
                $dtEnd = \DateTime::createFromFormat('Y-m-d H:i:s',$dataPost['date'] . ' ' . $dataPost['time']);
2605
                $dtEnd->add(new \DateInterval('PT' . $dataPost['duration'] . 'M'));
2606
 
2607
                $start_time = $dtStart->format('Y-m-d\TH:i:s');
2608
                $zoom = new Zoom($this->adapter, $this->config);
2609
                $result = $zoom->add($dataPost['title'], $dataPost['description'], $dataPost['type'], $start_time, $dataPost['duration'], $dataPost['timezone'], $dataPost['password']);
2610
 
1 www 2611
 
4131 efrain 2612
 
2613
                if($result['success']) {
2614
 
2615
 
2616
                    $zoomMeetingMapper = ZoomMeetingMapper::getInstance($this->adapter);
2617
                    $zoomMeeting = $zoomMeetingMapper->fetchOne($result['data']['id']);
2618
 
2619
                    if($zoomMeeting) {
2620
                        return new JsonModel([
2621
                            'success' => false,
2622
                            'data' => 'ERROR_ZOOM_MEETING_ALREADY_FOUND'
2623
                        ]);
2624
                    }
2625
 
2626
 
2627
                    $zoomMeeting = new ZoomMeeting();
2628
                    $zoomMeeting->id = $result['data']['id'];
2629
                    $zoomMeeting->topic = $dataPost['title'];
2630
                    $zoomMeeting->agenda =$dataPost['description'];
2631
                    $zoomMeeting->duration = $dataPost['duration'];
2632
                    $zoomMeeting->join_url = $result['data']['join_url'];
2633
                    $zoomMeeting->start_time = $dtStart->format('Y-m-d H:i:s');
4141 efrain 2634
                    $zoomMeeting->end_time = $dtEnd->format('Y-m-d H:i:s');
4131 efrain 2635
                    $zoomMeeting->timezone = $dataPost['timezone'];
2636
                    $zoomMeeting->type = $dataPost['type'];
2637
                    $zoomMeeting->uuid = $result['data'][ 'uuid'];
2638
                    $zoomMeeting->password = $dataPost['password'];
2639
 
2640
 
2641
                    if(!$zoomMeetingMapper->insert($zoomMeeting)) {
2642
                        return new JsonModel([
2643
                            'success' => false,
2644
                            'data' => $zoomMeetingMapper->getError()
2645
                        ]);
2646
                    }
2647
 
2648
 
2649
 
2650
 
2651
                    $chatMessageContent = "LABEL_ZOOM_MEETING \r\n" .
2652
                        " LABEL_ZOOM_MEETING_START_DATE : " . $dtStart->format('Y-m-d') . "\r\n" .
4141 efrain 2653
                        " LABEL_ZOOM_MEETING_START_TIME : " . $dtStart->format('H:i a') . "\r\n" .
2654
                        " LABEL_ZOOM_MEETING_TIMEZONE : " . $zoomMeeting->timezone . "\r\n" .
4131 efrain 2655
                        " LABEL_ZOOM_MEETING_TITLE :  " . $zoomMeeting->topic  . "\r\n" .
2656
                        " LABEL_ZOOM_MEETING_URL : " . $zoomMeeting->join_url . "\r\n" .
2657
                        " LABEL_ZOOM_MEETING_PASSWORD : " . $zoomMeeting->password . "\r\n" ;
4141 efrain 2658
 
4131 efrain 2659
 
2660
                    $zoomMeetingUser = new ZoomMeetingUser();
2661
                    $zoomMeetingUser->zoom_meeting_id = $zoomMeeting->id;
2662
                    $zoomMeetingUser->user_id = $currentUser->id;
2663
                    $zoomMeetingUser->type = ZoomMeetingUser::TYPE_CREATOR;
2664
 
1 www 2665
 
4131 efrain 2666
 
2667
                    $zoomMeetingUserMapper = ZoomMeetingUserMapper::getInstance($this->adapter);
2668
                    $zoomMeetingUserMapper->insert($zoomMeetingUser);
2669
 
2670
                    if($chatUser) {
2671
 
2672
                        if($chatUser->user_id1 == $currentUser->id) {
2673
                            $zoomMeetingUser = new ZoomMeetingUser();
2674
                            $zoomMeetingUser->zoom_meeting_id = $zoomMeeting->id;
2675
                            $zoomMeetingUser->user_id = $chatUser->user_id2;
2676
                            $zoomMeetingUser->type = ZoomMeetingUser::TYPE_CREATOR;
2677
                            $zoomMeetingUserMapper->insert($zoomMeetingUser);
2678
 
2679
                        } else {
2680
                            $zoomMeetingUser = new ZoomMeetingUser();
2681
                            $zoomMeetingUser->zoom_meeting_id = $zoomMeeting->id;
2682
                            $zoomMeetingUser->user_id = $chatUser->user_id1;
2683
                            $zoomMeetingUser->type = ZoomMeetingUser::TYPE_CREATOR;
2684
                            $zoomMeetingUserMapper->insert($zoomMeetingUser);
2685
                        }
2686
 
2687
                        $chatMessage = new ChatMessage();
2688
                        $chatMessage->recd = ChatMessage::RECD_NO;
2689
                        $chatMessage->seen = ChatMessage::SEEN_NO;
2690
                        $chatMessage->type = ChatMessage::TYPE_TEXT;
2691
                        $chatMessage->content = $chatMessageContent;
2692
                        $chatMessage->from_id = $currentUser->id;
2693
                        $chatMessage->to_id = $chatUser->user_id1 == $currentUser->id ? $chatUser->user_id2 : $chatUser->user_id1;
2694
                        $chatMessage->chat_id = $chatUser->id;
2695
 
2696
 
2697
                        $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
2698
                        $chatMessageMapper->insert($chatMessage);
2699
 
2700
 
4141 efrain 2701
                        $chatUserMapper->markIsOpen1($chatUser->id);
2702
                        $chatUserMapper->markIsOpen2($chatUser->id);
4131 efrain 2703
 
2704
 
2705
 
2706
 
2707
 
2708
 
2709
 
4141 efrain 2710
 
2711
 
2712
                    } else if($chatGroup)
4131 efrain 2713
                    {
2714
 
2715
                        $chatGroupMessage = new ChatGroupMessage();
2716
                        $chatGroupMessage->group_id = $chatGroup->id;
2717
                        $chatGroupMessage->content = $chatMessageContent;
2718
                        $chatGroupMessage->sender_id = $currentUser->id;
2719
                        $chatGroupMessage->type = ChatGroupMessage::TYPE_TEXT;
2720
                        $chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
2721
                        if($chatGroupMessageMapper->insert($chatGroupMessage)) {
2722
 
2723
                            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2724
                            $groupUsers =   $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
2725
 
2726
 
2727
                            $chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
2728
                            foreach($groupUsers as $groupUser)
2729
                            {
4141 efrain 2730
 
2731
                                if($groupUser->user_id != $currentUser->id) {
2732
 
2733
                                    $zoomMeetingUser = new ZoomMeetingUser();
2734
                                    $zoomMeetingUser->zoom_meeting_id = $zoomMeeting->id;
2735
                                    $zoomMeetingUser->user_id = $groupUser->user_id;
2736
                                    $zoomMeetingUser->type = ZoomMeetingUser::TYPE_CREATOR;
2737
                                    $zoomMeetingUserMapper->insert($zoomMeetingUser);
2738
                                }
2739
 
2740
 
4131 efrain 2741
                                $chatGroupUserMessage = new ChatGroupUserMessage();
2742
                                $chatGroupUserMessage->group_id = $chatGroup->id;
2743
                                $chatGroupUserMessage->message_id = $chatGroupMessage->id;
2744
                                $chatGroupUserMessage->receiver_id = $groupUser->user_id;
2745
                                $chatGroupUserMessage->recd = ChatGroupUserMessage::RECD_NO;
2746
                                $chatGroupUserMessage->seen = ChatGroupUserMessage::SEEN_NO;
2747
                                $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
2748
 
2749
                                $chatGroupUserMapper->markIsOpen($groupUser->group_id, $groupUser->user_id);
2750
                            }
2751
                        }
2752
                    }
2753
 
2754
                    return new JsonModel([
2755
                        'success' => true,
2756
                        'data' => 'LABEL_ZOOM_NEW_MEETING_SUCCESSFULLY'
2757
                    ]);
2758
 
2759
 
2760
                } else {
2761
                    return new JsonModel([
2762
                        'success' => false,
2763
                        'data' => 'ERROR_ZOOM_CREATING_NEW_MEETING'
2764
                    ]);
2765
                }
2766
 
2767
 
2768
 
2769
 
2770
            } else {
2771
 
2772
 
2773
 
2774
                $messages = [];
2775
                $form_messages = (array) $form->getMessages();
2776
                foreach($form_messages  as $fieldname => $field_messages)
2777
                {
2778
 
2779
                    $messages[$fieldname] = array_values($field_messages);
2780
                }
2781
 
2782
                return new JsonModel([
2783
                    'success'   => false,
2784
                    'data'   => $messages
2785
                ]);
2786
 
2787
 
2788
                return new JsonModel($response);
2789
            }
2790
 
2791
 
2792
 
2793
 
2794
 
2795
 
2796
        } else {
2797
            $response = [
2798
                'success' => false,
2799
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2800
            ];
2801
        }
2802
 
2803
    return new JsonModel($response);
2804
    }
2805
 
2806
 
2807
 
1 www 2808
    /**
2809
     *
2810
     * @param string $file
2811
     * @return boolean
2812
     */
2813
    private function validMimeType($file)
2814
    {
2815
        /*
2816
         * image/jpeg jpeg jpg jpe
2817
         * image/gif gif
2818
         * image/png png
2819
         * video/mp4
2820
         * audio/mpeg mpga mp2 mp2a mp3 m2a m3a
2821
         * video/x-flv flv
2822
         * application/msword doc dot
2823
         * application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
2824
         * application/vnd.ms-excel xls xlm xla xlc xlt xlw
2825
         * application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
2826
         * application/vnd.ms-powerpoint ppt pps pot
2827
         * application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
2828
         * application/pdf pdf
2829
         */
2830
        $mime = mime_content_type($file);
2831
        $valid = false;
2832
        $types = [
2833
            'image/jpeg',
2834
            'image/gif',
2835
            'image/png',
2836
            'video/mp4',
2837
            'audio/mpeg',
2838
            'video/x-flv',
2839
            'application/msword',
2840
            'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
2841
            'application/vnd.ms-excel',
2842
            'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
2843
            'application/vnd.ms-powerpoint',
2844
            'application/vnd.openxmlformats-officedocument.presentationml.presentation',
2845
            'application/pdf'
2846
        ];
2847
        foreach ($types as $t) {
2848
            if (strpos($mime, $t) !== false) {
2849
                $valid = true;
2850
                break;
2851
            }
2852
        }
2853
        return $valid;
2854
    }
2855
 
2856
    /**
2857
     *
2858
     * @param string $text
2859
     * @return string
2860
     */
2861
    private function sanitize($text)
2862
    {
2863
        $text = htmlspecialchars($text, ENT_QUOTES);
2864
        $text = str_replace("\n\r", "\n", $text);
2865
        $text = str_replace("\r\n", "\n", $text);
2866
        $text = str_replace("\n", "<br>", $text);
2867
        return $text;
2868
    }
2869
 
2870
    /**
2871
     *
2872
     * @param string $timestamp
3086 efrain 2873
     * @param string $now
1 www 2874
     * @return string
2875
     */
3086 efrain 2876
    private function timeAgo($timestamp, $now = '')
1 www 2877
    {
3086 efrain 2878
 
2879
        if($now) {
2880
            $datetime1 = \DateTime::createFromFormat('Y-m-d H:i:s', $now);
2881
        } else {
2882
            $now = date('Y-m-d H:i:s');
2883
            $datetime1 = date_create($now);
2884
        }
1 www 2885
        $datetime2 = date_create($timestamp);
3086 efrain 2886
 
1 www 2887
        $diff = date_diff($datetime1, $datetime2);
2888
        $timemsg = '';
2889
        if ($diff->y > 0) {
2536 stevensc 2890
            $timemsg = $diff->y . ' año' . ($diff->y > 1 ? "s" : '');
1 www 2891
        } else if ($diff->m > 0) {
2536 stevensc 2892
            $timemsg = $diff->m . ' mes' . ($diff->m > 1 ? "es" : '');
1 www 2893
        } else if ($diff->d > 0) {
2894
            $timemsg = $diff->d . ' dia' . ($diff->d > 1 ? "s" : '');
2895
        } else if ($diff->h > 0) {
2896
            $timemsg = $diff->h . ' hora' . ($diff->h > 1 ? "s" : '');
2897
        } else if ($diff->i > 0) {
2898
            $timemsg = $diff->i . ' minuto' . ($diff->i > 1 ? "s" : '');
2899
        } else if ($diff->s > 0) {
2900
            $timemsg = $diff->s . ' segundo' . ($diff->s > 1 ? "s" : '');
2901
        }
2902
        if (!$timemsg) {
2903
            $timemsg = "Ahora";
2904
        } else {
2905
            $timemsg = $timemsg . '';
2906
        }
2907
        return $timemsg;
2908
    }
2909
 
2910
    /**
2911
     *
2912
     * @param string $timestamp
3086 efrain 2913
     * @param string $now
1 www 2914
     * @return boolean
2915
     */
3086 efrain 2916
    private function isInactiveConnection($timestamp, $now = '')
1 www 2917
    {
3086 efrain 2918
        if($now) {
2919
            $datetime1 = \DateTime::createFromFormat('Y-m-d H:i:s', $now);
2920
        } else {
2921
            $now = date('Y-m-d H:i:s');
2922
            $datetime1 = date_create($now);
2923
        }
2924
 
2925
 
1 www 2926
        if (empty($timestamp)) {
2927
            return true;
2928
        }
2929
 
3086 efrain 2930
 
1 www 2931
        $datetime2 = date_create($timestamp);
2932
        $diff = date_diff($datetime1, $datetime2);
2933
 
2934
        if ($diff->y > 0 || $diff->m > 0 || $diff->d > 0 || $diff->h > 0 || $diff->i > 0) {
2935
            return true;
2936
        }
2937
 
2938
        return ($diff->s) > 15 ? true : false;
2939
    }
2940
}