Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

Rev 6849 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 www 1
<?php
5937 anderson 2
 
3
declare(strict_types=1);
4
 
1 www 5
namespace LeadersLinked\Controller;
6
 
7
use Laminas\Db\Adapter\AdapterInterface;
6849 efrain 8
 
1 www 9
use Laminas\Mvc\Controller\AbstractActionController;
10
use Laminas\Log\LoggerInterface;
11
use Laminas\View\Model\JsonModel;
12
use Laminas\View\Model\ViewModel;
13
use LeadersLinked\Library\Functions;
14
use LeadersLinked\Mapper\UserMapper;
15
use LeadersLinked\Mapper\ConnectionMapper;
16
use LeadersLinked\Mapper\ChatMessageMapper;
17
use LeadersLinked\Mapper\ChatGroupMapper;
18
use LeadersLinked\Mapper\ChatGroupMessageMapper;
19
use LeadersLinked\Mapper\ChatGroupUserMessageMapper;
20
use LeadersLinked\Mapper\ChatUserMapper;
21
use LeadersLinked\Model\ChatMessage;
22
use LeadersLinked\Model\ChatGroupMessage;
23
use LeadersLinked\Model\ChatGroupUserMessage;
24
use LeadersLinked\Model\Connection;
25
use LeadersLinked\Model\ChatGroup;
26
use LeadersLinked\Model\ChatUser;
4857 efrain 27
use LeadersLinked\Model\Network;
1 www 28
use LeadersLinked\Form\Chat\CreateGroupForm;
29
use LeadersLinked\Mapper\ChatGroupUserMapper;
30
use LeadersLinked\Model\ChatGroupUser;
4131 efrain 31
use LeadersLinked\Library\Zoom;
32
use LeadersLinked\Form\Chat\ZoomAddForm;
33
use LeadersLinked\Model\ZoomMeeting;
34
use LeadersLinked\Mapper\ZoomMeetingMapper;
35
use LeadersLinked\Model\ZoomMeetingUser;
36
use LeadersLinked\Mapper\ZoomMeetingUserMapper;
5343 efrain 37
use LeadersLinked\Model\User;
6866 efrain 38
use Laminas\Mvc\I18n\Translator;
39
use LeadersLinked\Cache\CacheInterface;
1 www 40
 
41
 
42
class ChatController extends AbstractActionController
43
{
44
    /**
45
     *
6866 efrain 46
     * @var \Laminas\Db\Adapter\AdapterInterface
1 www 47
     */
48
    private $adapter;
6866 efrain 49
 
1 www 50
    /**
51
     *
6866 efrain 52
     * @var \LeadersLinked\Cache\CacheInterface
1 www 53
     */
6866 efrain 54
    private $cache;
55
 
56
 
57
    /**
58
     *
59
     * @var \Laminas\Log\LoggerInterface
60
     */
1 www 61
    private $logger;
6866 efrain 62
 
1 www 63
    /**
64
     *
65
     * @var array
66
     */
67
    private $config;
6866 efrain 68
 
69
 
1 www 70
    /**
71
     *
6866 efrain 72
     * @var \Laminas\Mvc\I18n\Translator
73
     */
74
    private $translator;
75
 
76
 
77
    /**
78
     *
79
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
80
     * @param \LeadersLinked\Cache\CacheInterface $cache
81
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
1 www 82
     * @param array $config
6866 efrain 83
     * @param \Laminas\Mvc\I18n\Translator $translator
1 www 84
     */
6866 efrain 85
    public function __construct($adapter, $cache, $logger, $config, $translator)
1 www 86
    {
6866 efrain 87
        $this->adapter      = $adapter;
88
        $this->cache        = $cache;
89
        $this->logger       = $logger;
90
        $this->config       = $config;
91
        $this->translator   = $translator;
5937 anderson 92
    }
1 www 93
 
94
    /**
95
     *
96
     * Ruta usada para mostrar el chat en pantalla completa usada en los moviles
97
     *
98
     */
99
    public function indexAction()
100
    {
101
        $currentUserPlugin = $this->plugin('currentUserPlugin');
102
        $currentUser = $currentUserPlugin->getUser();
5937 anderson 103
 
4857 efrain 104
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
105
        $currentNetwork = $currentNetworkPlugin->getNetwork();
5937 anderson 106
 
4857 efrain 107
        $userIds = [];
5937 anderson 108
        if ($currentNetwork->relationship_user_mode == Network::RELATIONSHIP_USER_MODE_USER_2_USER) {
109
 
110
 
111
            $connectionMapper = ConnectionMapper::getInstance($this->adapter);
112
            $userIds = $connectionMapper->fetchAllConnectionsByUserReturnIds($currentUser->id);
4857 efrain 113
        } else {
5937 anderson 114
 
4857 efrain 115
            $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
116
            $records = $chatUserMapper->fetchAllByUserId($currentUser->id);
5937 anderson 117
 
118
            foreach ($records as $record) {
119
                if ($record->user_id1 == $currentUser->id) {
4857 efrain 120
                    array_push($userIds, $record->user_id2);
121
                } else {
122
                    array_push($userIds, $record->user_id1);
123
                }
124
            }
125
        }
5937 anderson 126
 
1 www 127
        $contacts = [];
5937 anderson 128
        if ($userIds) {
129
 
130
 
1 www 131
            $userMapper = UserMapper::getInstance($this->adapter);
4857 efrain 132
            $users = $userMapper->fetchAllByIds($userIds);
5937 anderson 133
 
134
            foreach ($users as $user) {
1 www 135
                $username = trim($user->first_name . ' ' . $user->last_name);
3086 efrain 136
                $status = $user->online ? 'LABEL_ONLINE' : 'LABEL_OFFLINE';
1 www 137
                $user_image = $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]);
5937 anderson 138
 
139
                array_push($contacts, ['id' => $user->uuid, 'status' => $status, 'name' => $username, 'image' => $user_image]);
1 www 140
            }
141
        }
5937 anderson 142
 
1 www 143
        $groups = [];
144
        $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
145
        $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
5937 anderson 146
 
1 www 147
        $results = $chatGroupUserMapper->fetchAllByUserId($currentUser->id);
5937 anderson 148
        if (is_array($results)) {
149
            foreach ($results as $r) {
150
 
1 www 151
                $chatOwner = $chatGroupUserMapper->fetchOwnerByGroupId($r->group_id);
5937 anderson 152
                $userOwner = $userMapper->fetchOne($chatOwner->user_id);
1 www 153
                $chatGroup = $chatGroupMapper->fetchOne($r->group_id);
5937 anderson 154
 
155
                array_push($groups, ['id' => $chatGroup->uuid, 'name' => $chatGroup->name, 'owner_id' => $userOwner->uuid]);
1 www 156
            }
157
        }
5050 efrain 158
 
5937 anderson 159
 
5050 efrain 160
        $this->layout()->setTemplate('layout/layout.phtml');
1 www 161
        $viewModel = new ViewModel();
162
        $viewModel->setTemplate('leaders-linked/chat/chat.phtml');
163
        $viewModel->setVariables([
5937 anderson 164
            'contacts' => $contacts,
165
            'groups' => $groups,
1 www 166
            'user_id' => $currentUser->id,
4113 efrain 167
            'is_chat' => true,
168
            'timezone' => $currentUser->timezone,
1 www 169
        ]);
5937 anderson 170
        return $viewModel;
1 www 171
    }
5937 anderson 172
 
1 www 173
    /**
174
     * Recuperamos los contactos y grupos
175
     * tiene que enviarse un petición GET a la siguiente url: /chat/heart-beat
176
     * retorna un json en caso de ser  positivo
177
     * [
178
     *  'success' : true,
179
     *  'data' : [
180
     *     [
181
     *       'url_leave'                                => 'url para abandonar el grupo en caso de no ser el propietario',
182
     *       'url_delete'                               => 'url para borrar el grupo si es el propietario',
183
     *       'url_add_user_to_group'                    => 'url para agregar un usuario al grupo si es el propietario',
184
     *       'url_get_contacts_availables_for_group'    => 'url para obtener los usuarios disponibles para agregarlos al grupo',
185
     *       'url_get_contact_group_list'               => 'url para obtener los usuarios del grupo si es el propietario',
186
     *       'url_clear'                                => 'url para limpiar los mensajes del grupo',
3121 efrain 187
     *       'url_close'                                => 'url para marcar como cerrado el chat',
188
     *       'url_open'                                 => 'url para marcar como abierto el chat',
1 www 189
     *       'url_send'                                 => 'url para enviar un mensaje',
190
     *       'url_upload'                               => 'url para subir un archivo, imagen o video',
191
     *       'url_get_all_messages'                     => 'url para para obtener los mensajes',
192
     *       'url_mark_seen'                            => 'url para marcar los mensajes como vistos'
193
     *       'url_mark_received'                        => 'url para marcar los mensajes como recibios'
4113 efrain 194
     *       'url_zoom'                                 => 'url para crear la conferencia de zoom'
1 www 195
     *       'id'                                       => 'id del grupo encriptado',
196
     *       'name'                                     => 'nombre del grupo',
197
     *       'type'                                     => 'group', //fixed
198
     *       'is_open'                                  => 'true/false',
199
     *       'unsee_messages'                           => 'true/false',
2241 efrain 200
     *       'unread_messages'                          => 'true/false',
201
     *       'count_not_seen_messages'  => 'cantidad de mensajes no vistos',
202
     *       'count_not_received_messages' => 'cantidad de mensajes no recibidos',
2242 efrain 203
     *       'last_message'                => 'tiempo desde el ultimo mensaje',
1 www 204
     *      ],
205
     *      [
206
     *        'url_clear'               => 'url para limpiar los mensajes del grupo',
3121 efrain 207
     *        'url_close'               => 'url para marcar como cerrado el chat',
208
     *        'url_open'                => 'url para marcar como abierto el chat',
1 www 209
     *        'url_send'                => 'url para enviar un mensaje',
210
     *        'url_upload'              => 'url para subir un archivo, imagen o video',
211
     *        'url_get_all_messages'    => 'url para para obtener los mensajes',
3121 efrain 212
     *        'url_mark_seen'           => 'url para marcar los mensajes como vistos'
213
     *        'url_mark_received'       => 'url para marcar los mensajes como recibios'
4113 efrain 214
     *        'url_zoom'                                 => 'url para crear la conferencia de zoom'
1 www 215
     *        'id'                      => 'id del usuario encriptado',
216
     *        'name'                    => 'nombre del usuario',
217
     *        'image'                   => 'imagen del usuario',
218
     *        'type'                    => 'user' //fixed,
219
     *        'profile'                 => 'url del profile',
220
     *        'online'                  => 'true/false',
221
     *        'is_open'                 => 'true/false',
222
     *        'unsee_messages'          => 'true/false'
2241 efrain 223
     *        'unread_messages'         => 'true/false',
224
     *        'count_not_seen_messages'  => 'cantidad de mensajes no vistos',
225
     *        'count_not_received_messages' => 'cantidad de mensajes no recibidos',
2242 efrain 226
     *        'last_message'                => 'tiempo desde el ultimo mensaje',
1 www 227
     *     ]
228
     * ]
229
     * En caso de ser negativo puede haber 2 formatos
230
     * [
231
     *  'success' : false,
232
     *  'data' : mensaje de error
233
     * ]
234
     * o
235
     * [
236
     *  'success' : false,
237
     *  'data' : [
238
     *      'fieldname' : [
239
     *          'mensaje de error'
240
     *      ]
241
     *  ]
242
     * ]
243
     * @return \Laminas\View\Model\JsonModel
244
     */
245
    public function heartBeatAction()
246
    {
4857 efrain 247
        $currentUserPlugin = $this->plugin('currentUserPlugin');
248
        $currentUser = $currentUserPlugin->getUser();
5937 anderson 249
 
4857 efrain 250
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
251
        $currentNetwork = $currentNetworkPlugin->getNetwork();
5937 anderson 252
 
253
 
1 www 254
        $request    = $this->getRequest();
5937 anderson 255
        if ($request->isGet()) {
1 www 256
 
257
            $userMapper = UserMapper::getInstance($this->adapter);
6388 efrain 258
            $now = $userMapper->getDatebaseNow();
259
 
1 www 260
            $userMapper->updateChatOnlineStatus($currentUser->id);
261
 
262
            $chats      = [];
5937 anderson 263
 
1 www 264
            $chatGroupMapper            = ChatGroupMapper::getInstance($this->adapter);
265
            $chatGroupUserMapper        = ChatGroupUserMapper::getInstance($this->adapter);
266
            $chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
5937 anderson 267
 
268
 
1 www 269
            $results = $chatGroupUserMapper->fetchAllByUserId($currentUser->id);
5937 anderson 270
 
1 www 271
            if (is_array($results)) {
5937 anderson 272
                foreach ($results as $r) {
273
 
274
                    $chatGroup      = $chatGroupMapper->fetchOne($r->group_id);
3099 efrain 275
                    $chatUserOwner  = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
276
                    $chatUser       = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
277
 
278
                    $is_open                        = $chatUser->open == ChatGroupUser::OPEN_YES;
279
                    $count_not_seen_messages        = $chatGroupUserMessageMapper->countNotSeenMessages($chatGroup->id, $currentUser->id);
280
                    $count_not_received_messages    = $chatGroupUserMessageMapper->countNotReceivedMessages($chatGroup->id, $currentUser->id);
2241 efrain 281
                    $lastMessage                    = $chatGroupUserMessageMapper->fetchLastMessage($chatGroup->id, $currentUser->id);
5937 anderson 282
 
283
                    if ($lastMessage) {
3138 efrain 284
                        $lastMessage = Functions::timeAgo($lastMessage->added_on, $now);
2241 efrain 285
                    } else {
286
                        $lastMessage = '';
287
                    }
5937 anderson 288
 
289
 
290
 
291
 
2219 efrain 292
                    $not_seen_messages     = $count_not_seen_messages > 0;
293
                    $not_received_messages = $count_not_received_messages > 0;
1 www 294
 
5937 anderson 295
                    if ($chatUserOwner->user_id == $currentUser->id) {
296
 
1 www 297
                        $chat = [
298
                            'url_leave'                             => '',
299
                            'url_delete'                            => $this->url()->fromRoute('chat/delete-group', ['group_id' => $chatGroup->uuid]),
300
                            'url_add_user_to_group'                 => $this->url()->fromRoute('chat/add-user-to-group', ['group_id' => $chatGroup->uuid]),
301
                            'url_get_contact_group_list'            => $this->url()->fromRoute('chat/get-contact-group-list', ['group_id' => $chatGroup->uuid]),
302
                            'url_get_contacts_availables_for_group' => $this->url()->fromRoute('chat/get-contacts-availables-for-group', ['group_id' => $chatGroup->uuid]),
303
                            'url_clear'                             => $this->url()->fromRoute('chat/clear', ['id' => $chatGroup->uuid]),
304
                            'url_close'                             => $this->url()->fromRoute('chat/close', ['id' => $chatGroup->uuid]),
3121 efrain 305
                            'url_open'                              => $this->url()->fromRoute('chat/open', ['id' => $chatGroup->uuid]),
1 www 306
                            'url_send'                              => $this->url()->fromRoute('chat/send', ['id' => $chatGroup->uuid]),
307
                            'url_upload'                            => $this->url()->fromRoute('chat/upload', ['id' => $chatGroup->uuid]),
308
                            'url_get_all_messages'                  => $this->url()->fromRoute('chat/get-all-messages', ['id' => $chatGroup->uuid]),
309
                            'url_mark_seen'                         => $this->url()->fromRoute('chat/mark-seen', ['id' => $chatGroup->uuid]),
310
                            'url_mark_received'                     => $this->url()->fromRoute('chat/mark-received', ['id' => $chatGroup->uuid]),
4131 efrain 311
                            'url_zoom'                              => $this->url()->fromRoute('chat/zoom', ['id' => $chatGroup->uuid, 'type' => 'chat']),
1 www 312
                            'id'                                    => $chatGroup->uuid,
313
                            'name'                                  => $chatGroup->name,
314
                            'type'                                  => 'group',
315
                            'is_open'                               => $is_open ? 1 : 0,
316
                            'not_seen_messages'                     => $not_seen_messages,
317
                            'not_received_messages'                 => $not_received_messages,
2219 efrain 318
                            'count_not_seen_messages'               => $count_not_seen_messages,
319
                            'count_not_received_messages'           => $count_not_received_messages,
5937 anderson 320
                            'last_message'                          => $lastMessage
321
 
1 www 322
                        ];
323
                    } else {
5937 anderson 324
 
1 www 325
                        $chat = [
326
                            'url_delete'                    => '',
327
                            'url_add_user_to_group'         => '',
328
                            'url_get_contact_group_list'    => $this->url()->fromRoute('chat/get-contact-group-list', ['group_id' => $chatGroup->uuid]),
329
                            'url_leave'                     => $this->url()->fromRoute('chat/leave-group', ['group_id' => $chatGroup->uuid]),
330
                            'url_clear'                     => $this->url()->fromRoute('chat/clear', ['id' => $chatGroup->uuid]),
331
                            'url_close'                     => $this->url()->fromRoute('chat/close', ['id' => $chatGroup->uuid]),
3121 efrain 332
                            'url_open'                      => $this->url()->fromRoute('chat/open', ['id' => $chatGroup->uuid]),
1 www 333
                            'url_send'                      => $this->url()->fromRoute('chat/send', ['id' => $chatGroup->uuid]),
334
                            'url_upload'                    => $this->url()->fromRoute('chat/upload', ['id' => $chatGroup->uuid]),
335
                            'url_get_all_messages'          => $this->url()->fromRoute('chat/get-all-messages', ['id' => $chatGroup->uuid]),
336
                            'url_mark_seen'                 => $this->url()->fromRoute('chat/mark-seen', ['id' => $chatGroup->uuid]),
337
                            'url_mark_received'             => $this->url()->fromRoute('chat/mark-received', ['id' => $chatGroup->uuid]),
4113 efrain 338
                            'zoom'                          => $this->url()->fromRoute('chat/zoom', ['id' => $chatGroup->uuid, 'type' => 'chat']),
4132 efrain 339
                            'url_zoom'                      => $this->url()->fromRoute('chat/zoom', ['id' => $chatGroup->uuid, 'type' => 'chat']),
1 www 340
                            'id'                            => $chatGroup->uuid,
341
                            'name'                          => $chatGroup->name,
342
                            'type'                          => 'group',
343
                            'is_open'                       => $is_open ? 1 : 0,
344
                            'not_seen_messages'             => $not_seen_messages,
345
                            'not_received_messages'         => $not_received_messages,
2219 efrain 346
                            'count_not_seen_messages'       => $count_not_seen_messages,
347
                            'count_not_received_messages'   => $count_not_received_messages,
5937 anderson 348
                            'last_message'                  => $lastMessage
1 www 349
                        ];
350
                    }
351
 
5937 anderson 352
                    array_push($chats, $chat);
1 www 353
                }
354
            }
5937 anderson 355
 
1 www 356
            $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
357
            $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
5937 anderson 358
 
6006 efrain 359
 
360
 
361
            if($currentNetwork->relationship_user_mode == Network::RELATIONSHIP_USER_MODE_USER_2_USER)  {
362
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
363
                $userConnectionIds = $connectionMapper->fetchAllConnectionsByUserReturnIds($currentUser->id);
364
            } else {
365
                $userConnectionIds = [];
366
            }
367
 
5937 anderson 368
 
4857 efrain 369
            $userIds = [];
5318 efrain 370
            $records = $chatUserMapper->fetchAllByUserId($currentUser->id);
5937 anderson 371
            foreach ($records as $record) {
6006 efrain 372
                if($currentNetwork->relationship_user_mode == Network::RELATIONSHIP_USER_MODE_USER_2_USER)  {
373
 
374
                    if ($record->user_id1 == $currentUser->id) {
375
                        $connection_user_id = $record->user_id2;
376
                    } else {
377
                        $connection_user_id = $record->user_id1;
378
                    }
379
 
380
                    if(in_array($connection_user_id, $userConnectionIds)) {
6012 efrain 381
 
6006 efrain 382
                        array_push($userIds, $connection_user_id);
383
                    }
384
 
5318 efrain 385
                } else {
6006 efrain 386
 
387
 
388
                    if ($record->user_id1 == $currentUser->id) {
389
                        array_push($userIds, $record->user_id2);
390
                    } else {
391
                        array_push($userIds, $record->user_id1);
392
                    }
5318 efrain 393
                }
394
            }
5937 anderson 395
 
5318 efrain 396
            /*
4857 efrain 397
            if($currentNetwork->relationship_user_mode == Network::RELATIONSHIP_USER_MODE_USER_2_USER)  {
398
 
399
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
400
                $userIds = $connectionMapper->fetchAllConnectionsByUserReturnIds($currentUser->id);
401
 
402
            } else {
403
 
404
                $records = $chatUserMapper->fetchAllByUserId($currentUser->id);
405
                foreach($records as $record)
406
                {
407
                    if($record->user_id1 == $currentUser->id) {
408
                        array_push($userIds, $record->user_id2);
409
                    } else {
410
                        array_push($userIds, $record->user_id1);
411
                    }
412
                }
413
 
414
            }
5318 efrain 415
            */
1 www 416
 
417
 
5937 anderson 418
 
4857 efrain 419
            if ($userIds) {
5937 anderson 420
 
1 www 421
                $userMapper = UserMapper::getInstance($this->adapter);
4857 efrain 422
                $users = $userMapper->fetchAllByIds($userIds);
1 www 423
 
5937 anderson 424
                foreach ($users as $user) {
1 www 425
                    $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
5937 anderson 426
                    if ($chatUser) {
2614 efrain 427
                        $count_not_received_messages = $chatMessageMapper->countNotReceivedMessagesByChatIdAndToId($chatUser->id, $currentUser->id);
428
                        $count_not_seen_messages = $chatMessageMapper->countNotSeenMessagesByChatIdAndToId($chatUser->id, $currentUser->id);
429
                        $lastMessage = $chatMessageMapper->fetchLastMessage($chatUser->id, $currentUser->id);
5937 anderson 430
 
431
                        if ($lastMessage) {
3138 efrain 432
                            $lastMessage = Functions::timeAgo($lastMessage->added_on, $now);
2242 efrain 433
                        } else {
434
                            $lastMessage = '';
435
                        }
5937 anderson 436
 
437
                        if ($currentUser->id == $chatUser->user_id1) {
3099 efrain 438
                            $is_open = $chatUser->user_open1 == ChatUser::OPEN_YES;
439
                        } else {
440
                            $is_open = $chatUser->user_open2 == ChatUser::OPEN_YES;
441
                        }
442
 
5937 anderson 443
 
2219 efrain 444
                        $not_received_messages = $count_not_received_messages > 0;
445
                        $not_seen_messages = $count_not_seen_messages > 0;
1 www 446
                    } else {
447
                        $is_open = false;
2614 efrain 448
                        $count_not_received_messages = 0;
449
                        $count_not_seen_messages =  0;
1 www 450
                        $not_seen_messages = false;
451
                        $not_received_messages = false;
2614 efrain 452
                        $lastMessage = '';
1 www 453
                    }
454
 
5937 anderson 455
 
1 www 456
                    $chat = [
457
                        'url_clear'                 => $this->url()->fromRoute('chat/clear', ['id' => $user->uuid]),
458
                        'url_close'                 => $this->url()->fromRoute('chat/close', ['id' => $user->uuid]),
3121 efrain 459
                        'url_open'                  => $this->url()->fromRoute('chat/open', ['id' => $user->uuid]),
1 www 460
                        'url_send'                  => $this->url()->fromRoute('chat/send', ['id' => $user->uuid]),
461
                        'url_upload'                => $this->url()->fromRoute('chat/upload', ['id' => $user->uuid]),
462
                        'url_mark_seen'             => $this->url()->fromRoute('chat/mark-seen', ['id' => $user->uuid]),
463
                        'url_mark_received'         => $this->url()->fromRoute('chat/mark-received', ['id' => $user->uuid]),
464
                        'url_get_all_messages'      => $this->url()->fromRoute('chat/get-all-messages', ['id' => $user->uuid]),
4141 efrain 465
                        'url_zoom'                  => $this->url()->fromRoute('chat/zoom', ['id' => $user->uuid, 'type' => 'chat']),
1 www 466
                        'id'                        => $user->uuid,
467
                        'name'                      => trim($user->first_name . ' ' . $user->last_name),
468
                        'image'                     => $this->url()->fromRoute('storage', ['code' => $user->uuid, 'type' => 'user', 'filename' => $user->image]),
5937 anderson 469
                        'profile'                   => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
1 www 470
                        'type'                      => 'user',
3086 efrain 471
                        'online'                    => $user->online ? 1 : 0,
1 www 472
                        'is_open'                   => $is_open ? 1 : 0,
473
                        'not_seen_messages'         => $not_seen_messages,
474
                        'not_received_messages'     => $not_received_messages,
2219 efrain 475
                        'count_not_seen_messages'       => $count_not_seen_messages,
476
                        'count_not_received_messages'   => $count_not_received_messages,
5937 anderson 477
                        'last_message'                  => $lastMessage
478
 
1 www 479
                    ];
5937 anderson 480
 
1 www 481
                    array_push($chats, $chat);
482
                }
483
            }
5937 anderson 484
 
1 www 485
            $userMapper->updateLastHeartBeat($currentUser->id);
486
 
487
            $response = [
488
                'success' => true,
489
                'data' => $chats
490
            ];
491
        } else {
492
            $response = [
493
                'success' => false,
494
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
495
            ];
496
        }
5937 anderson 497
 
1 www 498
        return new JsonModel($response);
499
    }
500
 
5937 anderson 501
 
502
 
1 www 503
    /**
504
     * Esta función crea un grupo y asigna al usuario actual como el owner del mismo,
505
     * tiene que enviarse un petición POST a la siguiente url: /chat/create-group
506
     * con el siguiente parámetro
507
     * name = un string con un máximo de 50 carácteres
508
     * retorna un json en caso de ser  positivo
509
     * [
510
     *  'success' : true,
511
     *  'data' : ID del grupo encriptado
512
     * ]
513
     * En caso de ser negativo puede haber 2 formatos
514
     * [
515
     *  'success' : false,
516
     *  'data' : mensaje de error
517
     * ]
518
     * o
519
     * [
520
     *  'success' : false,
521
     *  'data' : [
522
     *      'fieldname' : [
523
     *          'mensaje de error'
524
     *      ]
525
     *  ]
526
     * ]
527
     * @return \Laminas\View\Model\JsonModel
528
     */
529
    public function createGroupAction()
530
    {
531
        $request    = $this->getRequest();
5937 anderson 532
        if ($request->isPost()) {
1 www 533
            $form = new  CreateGroupForm();
534
            $form->setData($request->getPost()->toArray());
5937 anderson 535
 
536
            if ($form->isValid()) {
1 www 537
                $dataPost = (array) $form->getData();
538
                $name = $dataPost['name'];
5937 anderson 539
 
540
 
1 www 541
                $currentUserPlugin = $this->plugin('currentUserPlugin');
542
                $currentUser = $currentUserPlugin->getUser();
5937 anderson 543
 
1 www 544
                $chatGroup = new ChatGroup();
545
                $chatGroup->name = $name;
546
 
547
 
548
                $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
549
                $result = $chatGroupMapper->insert($chatGroup);
550
                if ($result) {
551
                    $chatGroup = $chatGroupMapper->fetchOne($chatGroup->id);
5937 anderson 552
 
553
 
554
 
1 www 555
                    $chatGroupUser = new ChatGroupUser();
556
                    $chatGroupUser->group_id = $chatGroup->id;
557
                    $chatGroupUser->user_id = $currentUser->id;
558
                    $chatGroupUser->owner = ChatGroupUser::OWNER_YES;
5937 anderson 559
 
1 www 560
                    $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
561
                    $result = $chatGroupUserMapper->insert($chatGroupUser);
5937 anderson 562
 
563
                    if ($result) {
564
 
3086 efrain 565
                        $userMapper = UserMapper::getInstance($this->adapter);
566
                        $userMapper->updateLastActivity($currentUser->id);
5937 anderson 567
 
1 www 568
                        $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
569
                        $dirpath = $fullpath_chat . $chatGroup->uuid;
5937 anderson 570
                        if (!file_exists($dirpath)) {
1 www 571
                            mkdir($dirpath, 0777, true);
572
                            chmod($dirpath, 0777);
573
                        }
5937 anderson 574
 
1 www 575
                        $response = [
576
                            'success' => true,
577
                            'data' => $chatGroup->uuid,
578
                        ];
579
                    } else {
580
                        $response = [
581
                            'success' => false,
582
                            'data' => $chatGroupUserMapper->getError(),
583
                        ];
584
                    }
585
                } else {
586
                    $response = [
587
                        'success' => false,
588
                        'data' => $chatGroupMapper->getError(),
589
                    ];
590
                }
591
            } else {
592
                $messages = [];
593
                $form_messages = (array) $form->getMessages();
5937 anderson 594
                foreach ($form_messages  as $fieldname => $field_messages) {
595
 
1 www 596
                    $messages[$fieldname] = array_values($field_messages);
597
                }
5937 anderson 598
 
1 www 599
                return new JsonModel([
600
                    'success'   => false,
601
                    'data'   => $messages
602
                ]);
603
            }
604
        } else {
605
            $response = [
606
                'success' => false,
607
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
608
            ];
609
        }
610
 
611
        return new JsonModel($response);
612
    }
613
 
614
    /**
615
     * Esta función crea un grupo y asigna al usuario al mismo, solo el owner puede hacerlo
616
     * Es una petición POST el url que contiene el ID encriptado del chat (/chat/add-user-to-group/:group_id)
617
     * Parámetros del route
618
     * :group_id = id del grupo encriptado
619
     * Parámetro post
620
     * uid = id encriptado del usuario
621
     * retorna un json en caso de ser  positivo
622
     * [
623
     *  'success' : true,
624
     *  'data' : [
625
     *     [
626
     *       'url_remove_from_group' => 'url para remover el usuario del grupo',
627
     *       'id'                    => 'id del usuario encriptado',
628
     *       'name'                  => 'nombre del usuario',
629
     *       'image'                 => 'imagen del usuario',
630
     *       'type'                  => 'user' //fixed,
631
     *       'online'                => $online,
632
     *     ]
633
     * ]
634
     * En caso de ser negativo puede haber 2 formatos
635
     * [
636
     *  'success' : false,
637
     *  'data' : mensaje de error
638
     * ]
639
     * o
640
     * [
641
     *  'success' : false,
642
     *  'data' : [
643
     *      'fieldname' : [
644
     *          'mensaje de error'
645
     *      ]
646
     *  ]
647
     * ]
648
     * @return \Laminas\View\Model\JsonModel
649
     */
650
    public function addUserToGroupAction()
651
    {
4857 efrain 652
        $currentUserPlugin = $this->plugin('currentUserPlugin');
653
        $currentUser = $currentUserPlugin->getUser();
5937 anderson 654
 
4857 efrain 655
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
656
        $currentNetwork = $currentNetworkPlugin->getNetwork();
5937 anderson 657
 
658
 
659
 
1 www 660
        $request    = $this->getRequest();
5937 anderson 661
        if ($request->isPost()) {
662
 
663
 
1 www 664
            $group_id   = $this->params()->fromRoute('group_id');
665
            $user_id    = $this->params()->fromPost('uid');
5937 anderson 666
 
667
            if (empty($group_id) || empty($user_id)) {
1 www 668
                return new JsonModel([
669
                    'success' => false,
670
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
671
                ]);
672
            }
5937 anderson 673
 
1 www 674
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
675
            $chatGroup = $chatGroupMapper->fetchOneByUuid($group_id);
5937 anderson 676
            if (!$chatGroup) {
1 www 677
                return new JsonModel([
678
                    'success' => false,
679
                    'data' => 'ERROR_CHAT_GROUP_NOT_FOUND'
680
                ]);
681
            }
5937 anderson 682
 
1 www 683
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
684
            $chatGroupOwner = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
5937 anderson 685
 
686
            if ($chatGroupOwner->user_id != $currentUser->id) {
1 www 687
                return new JsonModel([
688
                    'success' => false,
689
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_NOT_OWNER'
690
                ]);
691
            }
5937 anderson 692
 
1 www 693
            $userMapper = UserMapper::getInstance($this->adapter);
694
            $user = $userMapper->fetchOneByUuid($user_id);
5937 anderson 695
 
696
            if (!$user) {
1 www 697
                return new JsonModel([
698
                    'success' => false,
699
                    'data' => 'ERROR_USER_NOT_FOUND'
700
                ]);
701
            }
5937 anderson 702
 
703
            if ($chatGroupOwner->user_id == $user->id) {
1 www 704
                return new JsonModel([
705
                    'success' => false,
706
                    'data' => 'ERROR_CHAT_I_CAN_NOT_ADD_HIMSELF'
707
                ]);
708
            }
5937 anderson 709
 
710
 
711
            if ($currentNetwork->relationship_user_mode == Network::RELATIONSHIP_USER_MODE_USER_2_USER) {
712
 
713
 
4857 efrain 714
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
715
                $connection = $connectionMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
5937 anderson 716
                if (!$connection) {
4857 efrain 717
                    return new JsonModel([
718
                        'success' => false,
719
                        'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
720
                    ]);
721
                }
722
            } else {
5937 anderson 723
                if ($currentUser->network_id != $user->network_id) {
4857 efrain 724
                    return new JsonModel([
725
                        'success' => false,
726
                        'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
727
                    ]);
728
                }
1 www 729
            }
5937 anderson 730
 
1 www 731
            $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $user->id);
5937 anderson 732
            if ($chatGroupUser) {
1 www 733
                return new JsonModel([
734
                    'success' => false,
735
                    'data' => 'ERROR_THIS_USER_ALREADY_EXISTS_IN_THIS_GROUP'
736
                ]);
737
            }
738
 
5937 anderson 739
 
1 www 740
            $chatGroupUser = new ChatGroupUser();
741
            $chatGroupUser->group_id    = $chatGroup->id;
742
            $chatGroupUser->user_id     = $user->id;
743
            $chatGroupUser->owner       = ChatGroupUser::OWNER_NO;
5937 anderson 744
 
1 www 745
            $result = $chatGroupUserMapper->insert($chatGroupUser);
5937 anderson 746
            if (!$result) {
1 www 747
                return new JsonModel([
748
                    'success' => false,
749
                    'data' => $chatGroupUserMapper->getError()
750
                ]);
751
            }
5937 anderson 752
 
753
 
754
 
3086 efrain 755
            $userMapper->updateLastActivity($currentUser->id);
5937 anderson 756
 
1 www 757
            return new JsonModel([
758
                'success' => true,
759
                'data' => [
760
                    'url_remove_from_group' => $this->url()->fromRoute('chat/remove-user-from-group', ['group_id' => $chatGroup->uuid, 'user_id' => $user->uuid]),
761
                    'id'        => $user->uuid,
762
                    'name'      => trim($user->first_name . ' ' . $user->last_name),
763
                    'image'     => $this->url()->fromRoute('storage', ['code' => $user->uuid, 'type' => 'user', 'filename' => $user->image]),
764
                    'type'      => 'user',
3086 efrain 765
                    'online'    => $user->online ? 1 : 0,
1 www 766
                ]
5937 anderson 767
            ]);
1 www 768
        } else {
769
            return new JsonModel([
770
                'success' => false,
771
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
772
            ]);
773
        }
774
    }
775
 
776
    /**
777
     * Esta función remueve el usuario del grupo
778
     * Es una petición POST el url que contiene el ID encriptado del chat (/chat/remove-user-from-group/:group_id/:user_id)
779
     * y la cuál se recibe en la función heartBeat.
780
     * Parámetros del route
781
     * group_id= id encriptado del grupo
782
     * user_id = id encriptado del usuario
783
     * retorna un json en caso de ser  positivo
784
     * [
785
     *  'success' : true,
786
     * ]
787
     * En caso de ser negativo puede haber 2 formatos
788
     * [
789
     *  'success' : false,
790
     *  'data' : mensaje de error
791
     * ]
792
     * @return \Laminas\View\Model\JsonModel
793
     */
794
    public function removeUserFromGroupAction()
795
    {
796
        $request    = $this->getRequest();
5937 anderson 797
        if ($request->isPost()) {
798
 
1 www 799
            $currentUserPlugin = $this->plugin('currentUserPlugin');
800
            $currentUser = $currentUserPlugin->getUser();
5937 anderson 801
 
1 www 802
            $user_id = $this->params()->fromRoute('user_id');
803
            $group_id = $this->params()->fromRoute('group_id');
5937 anderson 804
 
805
            if (empty($group_id) || empty($user_id)) {
1 www 806
                return new JsonModel([
807
                    'success' => false,
808
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
809
                ]);
810
            }
5937 anderson 811
 
1 www 812
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
813
            $chatGroup = $chatGroupMapper->fetchOneByUuid($group_id);
5937 anderson 814
            if (!$chatGroup) {
1 www 815
                return new JsonModel([
816
                    'success' => false,
817
                    'data' => 'ERROR_CHAT_GROUP_NOT_FOUND'
818
                ]);
819
            }
5937 anderson 820
 
1 www 821
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
822
            $chatGroupOwner = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
5937 anderson 823
 
824
            if ($chatGroupOwner->user_id != $currentUser->id) {
1 www 825
                return new JsonModel([
826
                    'success' => false,
827
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_NOT_OWNER'
828
                ]);
829
            }
5937 anderson 830
 
1 www 831
            $userMapper = UserMapper::getInstance($this->adapter);
832
            $user = $userMapper->fetchOneByUuid($user_id);
5937 anderson 833
 
834
            if (!$user) {
1 www 835
                return new JsonModel([
836
                    'success' => false,
837
                    'data' => 'ERROR_USER_NOT_FOUND'
838
                ]);
839
            }
5937 anderson 840
 
841
            if ($chatGroupOwner->user_id == $user->id) {
1 www 842
                return new JsonModel([
843
                    'success' => false,
844
                    'data' => 'ERROR_CHAT_I_CAN_NOT_REMOVE_MYSELF'
845
                ]);
846
            }
847
 
5937 anderson 848
 
849
 
850
 
1 www 851
            $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $user->id);
5937 anderson 852
            if (!$chatGroupUser) {
1 www 853
                return new JsonModel([
854
                    'success' => false,
855
                    'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
856
                ]);
857
            }
858
 
5937 anderson 859
 
1 www 860
            $response = $chatGroupUserMapper->deleteByGroupIdAndUserId($chatGroup->id, $user->id);
5937 anderson 861
            if ($response) {
3086 efrain 862
                $userMapper->updateLastActivity($currentUser->id);
5937 anderson 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
        } else {
874
            return new JsonModel([
875
                'success' => false,
876
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
877
            ]);
878
        }
879
    }
880
 
5937 anderson 881
 
1 www 882
    /**
883
     * Abandonar un grupo
884
     * 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.
885
     * Parámetros del route
886
     * :group_id = id del grupo encriptado
887
     * En caso de una respuesta positiva
888
     * [
889
     *      'success' => true,
890
     * ]
891
     * En caso de un respuesta negativa
892
     * [
893
     *      'success' => false,
894
     *      'data' => (string) 'mensaje_de_error'
895
     * ]
896
     * @return \Laminas\View\Model\JsonModel
897
     */
898
    public function leaveGroupAction()
899
    {
900
        $request    = $this->getRequest();
5937 anderson 901
        if ($request->isPost()) {
1 www 902
            $currentUserPlugin = $this->plugin('currentUserPlugin');
903
            $currentUser = $currentUserPlugin->getUser();
5937 anderson 904
 
1 www 905
            $result = false;
906
            $group_id = $this->params()->fromRoute('group_id');
5937 anderson 907
 
908
 
909
            if (empty($group_id)) {
1 www 910
                return new JsonModel([
911
                    'success' => false,
912
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
913
                ]);
914
            }
5937 anderson 915
 
916
 
1 www 917
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
918
            $chatGroup = $chatGroupMapper->fetchOneByUuid($group_id);
5937 anderson 919
            if (!$chatGroup) {
1 www 920
                return new JsonModel([
921
                    'success' => false,
922
                    'data' => 'ERROR_GROUP_NOT_FOUND'
923
                ]);
924
            }
5937 anderson 925
 
1 www 926
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
927
            $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
5937 anderson 928
            if (!$chatGroupUser) {
1 www 929
                return new JsonModel([
930
                    'success' => false,
931
                    'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
932
                ]);
933
            }
5937 anderson 934
 
935
            if ($chatGroupUser->owner == ChatGroupUser::OWNER_YES) {
1 www 936
                return new JsonModel([
937
                    'success' => false,
938
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_OWNER'
939
                ]);
940
            }
5937 anderson 941
 
942
 
1 www 943
            $result = $chatGroupUserMapper->deleteByGroupIdAndUserId($chatGroupUser->group_id, $chatGroupUser->user_id);
5937 anderson 944
            if ($result) {
945
 
3086 efrain 946
                $userMapper = UserMapper::getInstance($this->adapter);
947
                $userMapper->updateLastActivity($currentUser->id);
5937 anderson 948
 
1 www 949
                return new JsonModel([
950
                    'success' => true
951
                ]);
952
            } else {
953
                return new JsonModel([
954
                    'success' => false,
955
                    'data' => $chatGroupMapper->getError()
956
                ]);
957
            }
958
        } else {
959
            return new JsonModel([
960
                'success' => false,
961
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
962
            ]);
963
        }
5937 anderson 964
    }
1 www 965
 
966
    /**
967
     *
968
     * @param ChatGroup $chatGroup
969
     * @param int $page
970
     * @return array
971
     */
972
    private function getAllMessagesForChatGroup($chatGroup, $page = 0)
973
    {
974
        $currentUserPlugin = $this->plugin('currentUserPlugin');
975
        $currentUser = $currentUserPlugin->getUser();
5937 anderson 976
 
1 www 977
        $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
978
        $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
5937 anderson 979
 
980
        if (!$chatGroupUser) {
1 www 981
            return [
982
                'success' => false,
983
                'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
984
            ];
985
        }
3121 efrain 986
 
5937 anderson 987
 
988
 
1 www 989
        $chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
990
        $paginator = $chatGroupMessageMapper->getPaginatorByGroupId($chatGroup->id, $page);
5937 anderson 991
 
1 www 992
        $pages = $paginator->count();
993
        $page  = $paginator->getCurrentPageNumber();
5937 anderson 994
 
1 www 995
        $items = [];
996
        $users = [];
997
        $userMapper = UserMapper::getInstance($this->adapter);
6388 efrain 998
        $now = $userMapper->getDatebaseNow();
5937 anderson 999
 
1000
        foreach ($paginator as $m) {
1001
 
1 www 1002
            if (isset($users[$m->sender_id])) {
1003
                $userdata_from = $users[$m->sender_id];
1004
            } else {
1005
                $userdata_from = $userMapper->fetchOne($m->sender_id);
5937 anderson 1006
                $users[$m->sender_id] = $userdata_from;
1 www 1007
            }
5937 anderson 1008
 
1 www 1009
            $pic_from = $this->url()->fromRoute('storage', [
1010
                'code' => $userdata_from->uuid,
1011
                'type' => 'user',
1012
                'filename' => $userdata_from->image
1013
            ]);
1014
            $u =  $userdata_from->id == $currentUser->id ? 1 : 2;
5937 anderson 1015
            if ($m->type == ChatGroupMessage::TYPE_TEXT) {
1 www 1016
                $content = $this->sanitize($m->content);
1017
            } else {
1018
                $content = $this->url()->fromRoute('storage', ['code' => $chatGroup->uuid, 'type' => 'chat', 'filename' => $m->content]);
1019
            }
5937 anderson 1020
 
1021
 
1022
 
3138 efrain 1023
            $msgtime = Functions::timeAgo($m->added_on, $now);
1 www 1024
            array_push($items, [
5937 anderson 1025
                'user_name' => trim($userdata_from->first_name . ' ' . $userdata_from->last_name),
1 www 1026
                'user_id' => $userdata_from->uuid,
1027
                'user_image' => $pic_from,
1028
                'u' => $u,
1029
                'mtype' => $m->type,
1030
                'm' => $content,
1031
                'time' => $msgtime,
1032
                'id' => $m->uuid
1033
            ]);
1034
        }
5937 anderson 1035
 
1 www 1036
        return [
1037
            'success' => true,
1038
            'data' => [
1039
                'page' => $page,
1040
                'pages' => $pages,
1041
                'items' => $items
1042
            ]
1043
        ];
1044
    }
5937 anderson 1045
 
1 www 1046
    /**
1047
     *
1048
     * @param ChatUser $chatUser
1049
     * @param int $page
1050
     * @return array
1051
     */
1052
    private function getAllMessagesForChatUser($chatUser, $page = 0)
1053
    {
1054
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1055
        $currentUser = $currentUserPlugin->getUser();
3099 efrain 1056
 
5937 anderson 1057
 
1 www 1058
        $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
1059
        $paginator = $chatMessageMapper->getAllMessagesPaginatorByChatId($chatUser->id, $page);
1060
        $pages = $paginator->count();
1061
        $page = $paginator->getCurrentPageNumber();
5937 anderson 1062
 
1 www 1063
        $items = [];
1064
        $users = [];
1065
        $userMapper = UserMapper::getInstance($this->adapter);
6388 efrain 1066
        $now = $userMapper->getDatebaseNow();
5937 anderson 1067
 
1068
 
1 www 1069
        $messages = $paginator->getCurrentItems();
1070
        foreach ($messages as $m) {
1071
            $from_id = (int) $m->from_id;
1072
            $to_id = (int) $m->to_id;
5937 anderson 1073
 
1 www 1074
            if (isset($users[$from_id])) {
1075
                $userdata_from = $users[$from_id];
1076
            } else {
1077
                $userdata_from = $userMapper->fetchOne($from_id);
1078
                $users[$from_id] = $userdata_from;
1079
            }
5937 anderson 1080
 
1 www 1081
            $pic_from = $this->url()->fromRoute('storage', [
1082
                'code' => $userdata_from->uuid,
1083
                'type' => 'user',
1084
                'filename' => $userdata_from->image
1085
            ]);
5937 anderson 1086
 
1 www 1087
            if (isset($users[$to_id])) {
1088
                $userdata_to = $users[$to_id];
1089
            } else {
1090
                $userdata_to = $userMapper->fetchOne($to_id);
5937 anderson 1091
                $users[$to_id] = $userdata_to;
1 www 1092
            }
5937 anderson 1093
 
1 www 1094
            $u = $m->from_id == $currentUser->id ? 1 : 2;
5937 anderson 1095
 
2129 efrain 1096
            $seen = 0;
1097
            if ($m->to_id == $currentUser->id) {
1098
                $seen = $m->seen == ChatMessage::SEEN_NO ? 1 : 0;
1099
            }
5937 anderson 1100
 
1101
 
1102
            if ($m->type == ChatMessage::TYPE_TEXT) {
1 www 1103
                $content = $this->sanitize($m->content);
1104
            } else {
1105
                $content = $this->url()->fromRoute('storage', ['code' => $chatUser->uuid, 'type' => 'chat', 'filename' => $m->content]);
1106
            }
5937 anderson 1107
 
3138 efrain 1108
            $msgtime = Functions::timeAgo($m->added_on, $now);
1 www 1109
            array_push($items, [
1110
                'user_name' => ($userdata_from->first_name . ' ' . $userdata_from->last_name),
1111
                'user_id' => $userdata_from->uuid,
1112
                'user_image' => $pic_from,
1113
                'u' => $u,
1114
                'mtype' => $m->type,
1115
                'm' => $content,
1116
                'time' => $msgtime,
1117
                'id' => $m->uuid,
2129 efrain 1118
                'seen' => $seen,
1 www 1119
            ]);
1120
        }
5937 anderson 1121
 
1122
 
1123
 
1124
 
1125
 
1 www 1126
        return [
1127
            'success' => true,
1128
            'data' => [
1129
                'page' => $page,
1130
                'pages' => $pages,
1131
                'items' => $items,
3086 efrain 1132
                'online' => $currentUser->online ? 1 : 0,
1 www 1133
            ]
1134
        ];
1135
    }
1136
 
1137
    /**
1138
     * Recupera los mensajes de un chat individual o grupal
1139
     * 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.
1140
     * En caso de una respuesta positiva
1141
     * [
1142
     *      'success' => true,
1143
     *      'data' => [
1144
     *          'page' => 'entero número de página actúal',
1145
     *          'pages' => 'entero número total de páginaS',
1146
     *              'items' => [
1147
     *              'user_name' => 'nombre del usuario que envia',
1148
     *              'user_id_encript' => 'id encriptado del usuario que envia',
1149
     *              'user_image' => 'ruta de la imagén del usuario que envia',
1150
     *              'u' => '1 = si el usuario que envia es el usuario actual , 2 si no lo es',
1151
     *              'mtype' => 'text | file',
1152
     *              'm' => 'texto del mensaje o url del archivo',
1153
     *              'time' => 'cadena que da el tiempo del mensaje ejemplo 1seg',
1154
     *          ],
1155
     *          'online' => 'true/false'
1156
     *      ]
1157
     * ]
1158
     * En caso de un respuesta negativa
1159
     * [
1160
     *      'success' => false,
1161
     *      'data' => (string) 'mensaje_de_error'
1162
     * ]
1163
     * @return \Laminas\View\Model\JsonModel
1164
     */
1165
    public function getAllMessagesAction()
1166
    {
4857 efrain 1167
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1168
        $currentUser = $currentUserPlugin->getUser();
5937 anderson 1169
 
4857 efrain 1170
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
1171
        $currentNetwork = $currentNetworkPlugin->getNetwork();
5937 anderson 1172
 
1173
 
1 www 1174
        $request    = $this->getRequest();
5937 anderson 1175
        if ($request->isGet()) {
4857 efrain 1176
 
5937 anderson 1177
 
1178
 
1 www 1179
            $id     = $this->params()->fromRoute('id');
1180
            $page   = filter_var($this->params()->fromQuery('page', 0), FILTER_SANITIZE_NUMBER_INT);
5937 anderson 1181
 
1182
            if (!$id) {
1 www 1183
                return new JsonModel([
1184
                    'success' => false,
1185
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1186
                ]);
1187
            }
5937 anderson 1188
 
1 www 1189
            /**** Mensajes de un chat grupal ****/
1190
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1191
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1192
            if ($chatGroup) {
1193
                $response = $this->getAllMessagesForChatGroup($chatGroup, $page);
1194
                return new JsonModel($response);
1195
            } else {
5937 anderson 1196
 
1 www 1197
                $userMapper = UserMapper::getInstance($this->adapter);
1198
                $user = $userMapper->fetchOneByUuid($id);
5937 anderson 1199
                if (!$user) {
1 www 1200
                    return new JsonModel([
1201
                        'success' => false,
1202
                        'data' => 'ERROR_USER_NOT_FOUND'
1203
                    ]);
1204
                }
5937 anderson 1205
 
1206
 
1207
                if ($currentNetwork->relationship_user_mode == Network::RELATIONSHIP_USER_MODE_USER_2_USER) {
4857 efrain 1208
                    $connectionMapper = ConnectionMapper::getInstance($this->adapter);
1209
                    $connection = $connectionMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
5937 anderson 1210
                    if (!$connection || $connection->status != Connection::STATUS_ACCEPTED) {
1211
 
4857 efrain 1212
                        return new JsonModel([
1213
                            'success' => false,
1214
                            'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
1215
                        ]);
1216
                    }
1217
                } else {
5937 anderson 1218
                    if ($currentNetwork->id != $user->network_id) {
1219
 
4857 efrain 1220
                        return new JsonModel([
1221
                            'success' => false,
1222
                            'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
1223
                        ]);
1224
                    }
1225
                }
5937 anderson 1226
 
1227
 
1 www 1228
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
1229
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
5937 anderson 1230
                if (!$chatUser) {
1 www 1231
                    $chatUser = new ChatUser();
1232
                    $chatUser->user_id1 = $currentUser->id;
1233
                    $chatUser->user_id2 = $user->id;
5937 anderson 1234
 
1 www 1235
                    $response = $chatUserMapper->insert($chatUser);
5937 anderson 1236
 
1237
 
1238
                    if (!$response) {
1 www 1239
                        return new JsonModel([
1240
                            'success' => false,
1241
                            'data' => $chatUserMapper->getError()
1242
                        ]);
1243
                    }
5937 anderson 1244
 
1 www 1245
                    $chatUser = $chatUserMapper->fetchOne($chatUser->id);
1246
                    $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
1247
                    $dirpath = $fullpath_chat . $chatUser->uuid;
5937 anderson 1248
                    if (!file_exists($dirpath)) {
1 www 1249
                        mkdir($dirpath, 0777, true);
1250
                        chmod($dirpath, 0777);
1251
                    }
1252
                }
5937 anderson 1253
 
1254
 
1255
 
1 www 1256
                $response = $this->getAllMessagesForChatUser($chatUser, $page);
1257
                return new JsonModel($response);
1258
            }
1259
        } else {
1260
            return new JsonModel([
1261
                'success' => false,
1262
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1263
            ]);
1264
        }
1265
    }
1266
 
3121 efrain 1267
 
5937 anderson 1268
 
1 www 1269
    /**
1270
     * Envia un mensaje a un chat individual o grupal
1271
     * 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.
1272
     * Parámetros del route
1273
     * :id = id del chat encriptado
1274
     * Como parámentro solo se espera un campo
1275
     * message: string
1276
     * En caso de una respuesta positiva
1277
     * [
1278
     *      'success' => true,
1279
     *      'user_name' => 'nombre del usuario que envia',
1280
     *      'user_id_encripted' => 'id encriptado del usuario que envia',
1281
     *      'user_image' => 'ruta de la imagén del usuario que envia',
1282
     *      'u' => '1 = si el usuario que envia es el usuario actual , 2 si no lo es',
1283
     *      'mtype' => 'text | file',
1284
     *      'm' => 'texto del mensaje o url del archivo',
1285
     *      'time' => 'cadena que da el tiempo del mensaje ejemplo 1seg',
5937 anderson 1286
     * ]
1 www 1287
     * En caso de un respuesta negativa
1288
     * [
1289
     *      'success' => false,
1290
     *      'data' => (string) 'mensaje_de_error'
1291
     * ]
1292
     * @return \Laminas\View\Model\JsonModel
1293
     */
1294
    public function sendAction()
1295
    {
4857 efrain 1296
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1297
        $currentUser = $currentUserPlugin->getUser();
5937 anderson 1298
 
4857 efrain 1299
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
1300
        $currentNetwork = $currentNetworkPlugin->getNetwork();
5937 anderson 1301
 
1302
 
1 www 1303
        $request    = $this->getRequest();
5937 anderson 1304
        if ($request->isPost()) {
1 www 1305
            $id         = $this->params()->fromRoute('id');
6749 efrain 1306
            $message    = Functions::sanitizeFilterString($this->params()->fromPost('message', ''));
5937 anderson 1307
 
1308
            if (!$id || empty($message)) {
1 www 1309
                return new JsonModel([
1310
                    'success' => false,
1311
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1312
                ]);
5937 anderson 1313
            }
4857 efrain 1314
 
5937 anderson 1315
 
1316
 
1 www 1317
            $userMapper = UserMapper::getInstance($this->adapter);
6388 efrain 1318
            $now = $userMapper->getDatebaseNow();
1319
 
1 www 1320
            $sender_result = $userMapper->fetchOne($currentUser->id);
1321
            $sender_name = trim($sender_result->first_name . ' ' . $sender_result->last_name);
1322
            $sender_pic = $this->url()->fromRoute('storage', [
1323
                'code' => $sender_result->uuid,
1324
                'type' => 'user',
1325
                'filename' => $sender_result->image
1326
            ]);
5937 anderson 1327
 
1 www 1328
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1329
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
5937 anderson 1330
            if ($chatGroup) {
1331
 
1 www 1332
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1333
                $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
5937 anderson 1334
 
1335
                if (!$chatGroupUser) {
1 www 1336
                    return new JsonModel([
1337
                        'success' => false,
1338
                        'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
1339
                    ]);
1340
                }
5937 anderson 1341
 
1 www 1342
                $chatGroupMessage = new ChatGroupMessage();
1343
                $chatGroupMessage->sender_id = $currentUser->id;
1344
                $chatGroupMessage->group_id = $chatGroup->id;
1345
                $chatGroupMessage->content = $message;
1346
                $chatGroupMessage->type = ChatGroupMessage::TYPE_TEXT;
5937 anderson 1347
 
1 www 1348
                $chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
1349
                $result = $chatGroupMessageMapper->insert($chatGroupMessage);
5937 anderson 1350
                if (!$result) {
1 www 1351
                    return new JsonModel([
1352
                        'success' => false,
1353
                        'data' => $chatGroupMessageMapper->getError()
1354
                    ]);
1355
                }
1356
                $chatGroupMessage = $chatGroupMessageMapper->fetchOne($chatGroupMessage->id);
1357
 
5937 anderson 1358
 
1 www 1359
                $chatGroupUserMessage = new ChatGroupUserMessage();
1360
                $chatGroupUserMessage->group_id = $chatGroupMessage->group_id;
1361
                $chatGroupUserMessage->message_id = $chatGroupMessage->id;
1362
                $chatGroupUserMessage->receiver_id = $currentUser->id;
1363
                $chatGroupUserMessage->recd = ChatGroupUserMessage::RECD_YES;
1364
                $chatGroupUserMessage->seen = ChatGroupUserMessage::SEEN_NO;
5937 anderson 1365
 
1 www 1366
                $chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
1367
                $result = $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
5937 anderson 1368
                if (!$result) {
1 www 1369
                    return new JsonModel([
1370
                        'success' => false,
1371
                        'data' => $chatGroupUserMessageMapper->getError()
1372
                    ]);
1373
                }
5937 anderson 1374
 
1375
 
1 www 1376
                $results = $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
5937 anderson 1377
                foreach ($results as $r) {
1 www 1378
                    if ($r->user_id != $currentUser->id) {
1379
                        $chatGroupUserMessage               = new ChatGroupUserMessage();
1380
                        $chatGroupUserMessage->group_id     = $chatGroupMessage->group_id;
1381
                        $chatGroupUserMessage->message_id   = $chatGroupMessage->id;
1382
                        $chatGroupUserMessage->receiver_id  = $r->user_id;
1383
                        $chatGroupUserMessage->recd         = ChatGroupUserMessage::RECD_NO;
1384
                        $chatGroupUserMessage->seen         = ChatGroupUserMessage::SEEN_NO;
5937 anderson 1385
 
1 www 1386
                        $result = $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
5937 anderson 1387
                        if (!$result) {
1 www 1388
                            return new JsonModel([
1389
                                'success' => false,
1390
                                'data' => $chatGroupUserMessageMapper->getError()
1391
                            ]);
1392
                        }
1393
                    }
1394
                }
5937 anderson 1395
 
1396
 
3138 efrain 1397
                $msgtime = Functions::timeAgo($now, $now);
1 www 1398
                return new JsonModel([
1399
                    'success' => true,
1400
                    'data' => [
1401
                        'user_name'         => $sender_name,
1402
                        'user_id_encripted' => $sender_result->uuid,
1403
                        'user_image'        => $sender_pic,
1404
                        'u'                 => 1,
1405
                        'mtype'             => 'text',
1406
                        'm'                 => $message,
1407
                        'time'              => $msgtime,
1408
                        'id'                => $chatGroupMessage->uuid,
1409
                    ]
1410
                ]);
1411
            } else {
1412
                $userMapper = UserMapper::getInstance($this->adapter);
6388 efrain 1413
                $now = $userMapper->getDatebaseNow();
1414
 
1 www 1415
                $user = $userMapper->fetchOneByUuid($id);
5937 anderson 1416
                if (!$user) {
1 www 1417
                    return new JsonModel([
1418
                        'success' => false,
1419
                        'data' => 'ERROR_USER_NOT_FOUND'
1420
                    ]);
1421
                }
5937 anderson 1422
 
1423
                if ($currentNetwork->relationship_user_mode == Network::RELATIONSHIP_USER_MODE_USER_2_USER) {
1424
 
1425
 
4857 efrain 1426
                    $connectionMapper = ConnectionMapper::getInstance($this->adapter);
1427
                    $connection = $connectionMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
5937 anderson 1428
                    if (!$connection || $connection->status != Connection::STATUS_ACCEPTED) {
1429
 
4857 efrain 1430
                        return new JsonModel([
1431
                            'success' => false,
1432
                            'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
1433
                        ]);
1434
                    }
1435
                } else {
5937 anderson 1436
                    if ($currentUser->network_id != $user->network_id) {
4857 efrain 1437
                        return new JsonModel([
1438
                            'success' => false,
1439
                            'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
1440
                        ]);
1441
                    }
1 www 1442
                }
1443
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
1444
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
5937 anderson 1445
                if (!$chatUser) {
1 www 1446
                    $chatUser = new ChatUser();
1447
                    $chatUser->user_id1 = $currentUser->id;
1448
                    $chatUser->user_id2 = $user->id;
5937 anderson 1449
 
1 www 1450
                    $response = $chatUserMapper->insert($chatUser);
5937 anderson 1451
                    if (!$response) {
1 www 1452
                        return new JsonModel([
1453
                            'success' => false,
1454
                            'data' => $chatUserMapper->getError()
1455
                        ]);
1456
                    }
5937 anderson 1457
 
1 www 1458
                    $chatUser = $chatUserMapper->fetchOne($chatUser->id);
1459
                    $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
1460
                    $dirpath = $fullpath_chat . $chatUser->uuid;
5937 anderson 1461
                    if (!file_exists($dirpath)) {
1 www 1462
                        mkdir($dirpath, 0777, true);
1463
                        chmod($dirpath, 0777);
1464
                    }
1465
                }
5937 anderson 1466
 
1467
 
1468
 
1 www 1469
                $chatMessage = new ChatMessage();
1470
                $chatMessage->chat_id   = $chatUser->id;
1471
                $chatMessage->from_id   = $currentUser->id;
1472
                $chatMessage->to_id     = $user->id;
1473
                $chatMessage->content   = $message;
1474
                $chatMessage->type      = ChatMessage::TYPE_TEXT;
1475
                $chatMessage->recd      = ChatMessage::RECD_NO;
1476
                $chatMessage->seen      = ChatMessage::SEEN_NO;
5937 anderson 1477
 
1 www 1478
                $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
1479
                $result = $chatMessageMapper->insert($chatMessage);
5937 anderson 1480
                if (!$result) {
1 www 1481
                    return new JsonModel([
1482
                        'success' => false,
1483
                        'data' => $chatMessageMapper->getError()
1484
                    ]);
1485
                }
5937 anderson 1486
 
1 www 1487
                $chatMessage = $chatMessageMapper->fetchOne($chatMessage->id);
5937 anderson 1488
 
1489
 
3138 efrain 1490
                $msgtime = Functions::timeAgo($now, $now);
1 www 1491
                return new JsonModel([
1492
                    'success' => true,
1493
                    'data' => [
1494
                        'user_name'     => $sender_name,
1495
                        'user_id'       => $sender_result->uuid,
1496
                        'user_image'    => $sender_pic,
1497
                        'u'             => 1,
1498
                        'mtype'         => ChatMessage::TYPE_TEXT,
1499
                        'm'             => $message,
1500
                        'time'          => $msgtime,
1501
                        'id'            => $chatMessage->uuid,
1502
                    ]
5937 anderson 1503
                ]);
1 www 1504
            }
3121 efrain 1505
 
5937 anderson 1506
 
1507
 
1508
 
3086 efrain 1509
            $userMapper->updateLastActivity($currentUser->id);
5937 anderson 1510
 
1 www 1511
            return new JsonModel($response);
1512
        } else {
1513
            return new JsonModel([
1514
                'success' => false,
1515
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1516
            ]);
1517
        }
5937 anderson 1518
    }
1 www 1519
 
5937 anderson 1520
 
1521
 
1 www 1522
    /**
1523
     * Esta función recuperar los contactos disponibles para agregarlos a un grupo
1524
     * 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.
1525
     * con el siguiente parámetro
1526
     * uid = id encriptado del usuario
1527
     * retorna un json en caso de ser  positivo
1528
     * [
1529
     *  'success' : true,
1530
     *  'data' : [
1531
     *     [
1532
     *       'id'                    => 'id del usuario encriptado',
1533
     *       'name'                  => 'nombre del usuario',
1534
     *       'image'                 => 'imagen del usuario',
1535
     *       'type'                  => 'user' //fixed,
1536
     *       'online'                => $online,
1537
     *     ]
1538
     * ]
1539
     * En caso de ser negativo puede haber 2 formatos
1540
     * [
1541
     *  'success' : false,
1542
     *  'data' : mensaje de error
1543
     * ]
1544
     * @return \Laminas\View\Model\JsonModel
1545
     */
1546
    public function contactAvailableGroupListAction()
1547
    {
4857 efrain 1548
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1549
        $currentUser = $currentUserPlugin->getUser();
5937 anderson 1550
 
4857 efrain 1551
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
1552
        $currentNetwork = $currentNetworkPlugin->getNetwork();
5937 anderson 1553
 
1554
 
1 www 1555
        $request    = $this->getRequest();
5937 anderson 1556
        if ($request->isGet()) {
4857 efrain 1557
 
5937 anderson 1558
 
1 www 1559
            $id = $this->params()->fromRoute('group_id');
5937 anderson 1560
            if (!$id) {
1 www 1561
                return new JsonModel([
1562
                    'success' => false,
1563
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1564
                ]);
5937 anderson 1565
            }
1566
 
1 www 1567
            $userMapper = UserMapper::getInstance($this->adapter);
1568
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1569
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
5937 anderson 1570
 
1571
            if (!$chatGroup) {
1 www 1572
                return new JsonModel([
1573
                    'success' => false,
1574
                    'data' => 'ERROR_GROUP_NOT_FOUND'
1575
                ]);
1576
            }
5937 anderson 1577
 
1 www 1578
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1579
            $chatGroupOwner = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
5937 anderson 1580
 
1581
            if ($chatGroupOwner->user_id != $currentUser->id) {
1 www 1582
                return new JsonModel([
1583
                    'success' => false,
1584
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_NOT_OWNER'
1585
                ]);
1586
            }
5937 anderson 1587
 
1588
 
1589
 
1 www 1590
            $contact_ids = [];
1591
            $contacts = $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
5937 anderson 1592
            foreach ($contacts as $contact) {
1 www 1593
                array_push($contact_ids, $contact->user_id);
1594
            }
5937 anderson 1595
 
4857 efrain 1596
            $user_ids = [];
5937 anderson 1597
            if ($currentNetwork->relationship_user_mode == Network::RELATIONSHIP_USER_MODE_USER_2_USER) {
1598
 
1599
 
1600
 
4857 efrain 1601
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
1602
                $user_ids = $connectionMapper->fetchAllConnectionsByUserReturnIds($currentUser->id);
1603
            } else {
5937 anderson 1604
                if ($currentNetwork->default == Network::DEFAULT_YES) {
4857 efrain 1605
                    $user_ids = $userMapper->fetchAllIdsByDefaultNetworkId($currentNetwork->id, $currentUser->id);
1606
                } else {
1607
                    $user_ids = $userMapper->fetchAllIdsByNonDefaultNetworkId($currentNetwork->id, $currentUser->id);
1608
                }
1609
            }
5937 anderson 1610
 
1611
            $user_ids = array_filter($user_ids, function ($var) use ($contact_ids) {
4857 efrain 1612
                return !in_array($var, $contact_ids);
1 www 1613
            });
5937 anderson 1614
 
1615
 
1 www 1616
            $items = [];
5937 anderson 1617
            foreach ($user_ids as $user_id) {
4857 efrain 1618
                $user = $userMapper->fetchOne($user_id);
5937 anderson 1619
                if (!$user) {
1 www 1620
                    continue;
1621
                }
5937 anderson 1622
 
1 www 1623
                $name   = trim($user->first_name . ' ' . $user->last_name);
1624
                $image  = $this->url()->fromRoute('storage', [
1625
                    'code' => $user->uuid,
1626
                    'type' => 'user',
1627
                    'filename' => $user->image
1628
                ]);
1629
 
5937 anderson 1630
 
1 www 1631
                array_push($items, [
1632
                    'id'        => $user->uuid,
1633
                    'name'      => $name,
1634
                    'image'     => $image,
3086 efrain 1635
                    'online'    => $user->online ? 1 : 0,
1 www 1636
                ]);
5937 anderson 1637
            }
1638
 
1639
            usort($items, function ($a, $b) {
4857 efrain 1640
                return $a['name'] <=> $b['name'];
5937 anderson 1641
            });
3086 efrain 1642
 
5937 anderson 1643
 
1644
 
3086 efrain 1645
            $userMapper->updateLastActivity($currentUser->id);
5937 anderson 1646
 
1 www 1647
            return new JsonModel([
1648
                'success' => true,
1649
                'data' => $items,
1650
            ]);
1651
        } else {
1652
            return new JsonModel([
1653
                'success' => false,
1654
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1655
            ]);
1656
        }
1657
    }
1658
 
1659
    /**
1660
     * Esta función recuperar los contactos de un grupo
1661
     * 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.
1662
     * con el siguiente parámetro
1663
     * uid = id encriptado del usuario
1664
     * retorna un json en caso de ser  positivo
1665
     * [
1666
     *  'success' : true,
1667
     *  'data' : [
1668
     *     [
1669
     *       'url_remove_from_group' => 'url para remover el usuario del grupo',
1670
     *       'id'                    => 'id del usuario encriptado',
1671
     *       'name'                  => 'nombre del usuario',
1672
     *       'image'                 => 'imagen del usuario',
1673
     *       'type'                  => 'user' //fixed,
1674
     *       'online'                => $online,
1675
     *     ]
1676
     * ]
1677
     * En caso de ser negativo puede haber 2 formatos
1678
     * [
1679
     *  'success' : false,
1680
     *  'data' : mensaje de error
1681
     * ]
1682
     * o
1683
     * [
1684
     *  'success' : false,
1685
     *  'data' : [
1686
     *      'fieldname' : [
1687
     *          'mensaje de error'
1688
     *      ]
1689
     *  ]
1690
     * ]
1691
     * @return \Laminas\View\Model\JsonModel
1692
     */
1693
 
1694
    public function contactGroupListAction()
1695
    {
5937 anderson 1696
 
1 www 1697
        $request    = $this->getRequest();
5937 anderson 1698
        if ($request->isGet()) {
1 www 1699
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1700
            $currentUser = $currentUserPlugin->getUser();
5937 anderson 1701
 
1 www 1702
            $id = $this->params()->fromRoute('group_id');
5937 anderson 1703
            if (!$id) {
1 www 1704
                return new JsonModel([
1705
                    'success' => false,
1706
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1707
                ]);
5937 anderson 1708
            }
1709
 
1 www 1710
            $userMapper = UserMapper::getInstance($this->adapter);
1711
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1712
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
5937 anderson 1713
 
1714
            if (!$chatGroup) {
1 www 1715
                return new JsonModel([
1716
                    'success' => false,
1717
                    'data' => 'ERROR_GROUP_NOT_FOUND'
1718
                ]);
1719
            }
5937 anderson 1720
 
1 www 1721
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
5937 anderson 1722
 
1 www 1723
            $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
5937 anderson 1724
 
1725
            if (!$chatGroupUser) {
1 www 1726
                return new JsonModel([
1727
                    'success' => false,
1728
                    'data' => 'ERROR_CHAT_GROUP_USER_NOT_FOUND'
1729
                ]);
1730
            }
1731
 
1732
            $items = [];
1733
            $chatGroupUsers = $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
5937 anderson 1734
            foreach ($chatGroupUsers as $chatGroupUser) {
1 www 1735
                $user = $userMapper->fetchOne((int) $chatGroupUser->user_id);
5937 anderson 1736
                if (!$user) {
1 www 1737
                    continue;
1738
                }
5937 anderson 1739
 
1 www 1740
                $name   = trim($user->first_name . ' ' . $user->last_name);
1741
                $image  = $this->url()->fromRoute('storage', [
1742
                    'code' => $user->uuid,
1743
                    'type' => 'user',
1744
                    'filename' => $user->image
1745
                ]);
5937 anderson 1746
 
1747
 
1748
                if ($chatGroupUser->owner == ChatGroupUser::OWNER_YES) {
1 www 1749
                    $url_remove_from_group = '';
1750
                } else {
5937 anderson 1751
                    $url_remove_from_group = $this->url()->fromRoute('chat/remove-user-from-group', ['group_id' => $chatGroup->uuid, 'user_id' => $user->uuid]);
1 www 1752
                }
5937 anderson 1753
 
1754
 
1 www 1755
                array_push($items, [
1756
                    'url_remove_from_group' => $url_remove_from_group,
1757
                    'id'                    => $user->uuid,
1758
                    'name'                  => $name,
1759
                    'image'                 => $image,
3086 efrain 1760
                    'online'                => $user->online ? 1 : 0,
1 www 1761
                ]);
1762
            }
3086 efrain 1763
 
1764
            $userMapper->updateLastActivity($currentUser->id);
5937 anderson 1765
 
1 www 1766
            return new JsonModel([
5937 anderson 1767
                'success' => true,
1 www 1768
                'data' => $items,
1769
            ]);
1770
        } else {
1771
            return new JsonModel([
1772
                'success' => false,
1773
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1774
            ]);
1775
        }
1776
    }
5937 anderson 1777
 
1 www 1778
    /**
1779
     * Elimina un grupo de chat, solo el owner puede realizarla
1780
     * 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.
1781
     * Parámetros del route
1782
     * :group_id = id del grupo encriptado
1783
     * En caso de una respuesta positiva
1784
     * [
1785
     *      'success' => true,
1786
     *      'data'=> (int) registros_borrados
1787
     * ]
1788
     * En caso de un respuesta negativa
1789
     * [
1790
     *      'success' => false,
1791
     *      'data' => (string) 'mensaje_de_error'
1792
     * ]
1793
     * @return \Laminas\View\Model\JsonModel
1794
     */
1795
    public function deleteGroupAction()
1796
    {
5937 anderson 1797
 
1 www 1798
        $request    = $this->getRequest();
5937 anderson 1799
        if ($request->isPost()) {
1 www 1800
 
1801
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1802
            $currentUser = $currentUserPlugin->getUser();
5937 anderson 1803
 
6749 efrain 1804
            $id = Functions::sanitizeFilterString($this->params()->fromRoute('group_id'));
5937 anderson 1805
            if (!$id) {
1 www 1806
                return new JsonModel([
1807
                    'success' => false,
1808
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1809
                ]);
5937 anderson 1810
            }
1 www 1811
 
5937 anderson 1812
 
1813
 
1 www 1814
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1815
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
5937 anderson 1816
 
1817
            if (!$chatGroup) {
1 www 1818
                return new JsonModel([
1819
                    'success' => false,
1820
                    'data' => 'ERROR_GROUP_NOT_FOUND'
1821
                ]);
1822
            }
5937 anderson 1823
 
1 www 1824
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1825
            $chatGroupOwner = $chatGroupUserMapper->fetchOwnerByGroupId($chatGroup->id);
5937 anderson 1826
 
1827
            if ($chatGroupOwner->user_id != $currentUser->id) {
1 www 1828
                return new JsonModel([
1829
                    'success' => false,
1830
                    'data' => 'ERROR_CHAT_GROUP_YOU_ARE_NOT_OWNER'
1831
                ]);
1832
            }
1833
 
1834
 
1835
            $chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
1836
            $result = $chatGroupUserMessageMapper->deleteAllByGroupId($chatGroup->id);
5937 anderson 1837
            if (!$result) {
1 www 1838
                return new JsonModel([
1839
                    'success' => false,
1840
                    'data' => $chatGroupUserMessageMapper->getError()
1841
                ]);
1842
            }
5937 anderson 1843
 
1 www 1844
            $chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
1845
            $result = $chatGroupMessageMapper->deleteAllByGroupId($chatGroup->id);
5937 anderson 1846
            if (!$result) {
1 www 1847
                return new JsonModel([
1848
                    'success' => false,
1849
                    'data' => $chatGroupMessageMapper->getError()
1850
                ]);
1851
            }
5937 anderson 1852
 
1 www 1853
            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1854
            $result = $chatGroupUserMapper->deleteAllByGroupId($chatGroup->id);
5937 anderson 1855
            if (!$result) {
1 www 1856
                return new JsonModel([
1857
                    'success' => false,
1858
                    'data' => $chatGroupUserMapper->getError()
1859
                ]);
1860
            }
5937 anderson 1861
 
1 www 1862
            $chatGroupMapper->deleteByGroupId($chatGroup->id);
5937 anderson 1863
            if (!$result) {
1 www 1864
                return new JsonModel([
1865
                    'success' => false,
1866
                    'data' => $chatGroupMapper->getError()
1867
                ]);
1868
            }
5937 anderson 1869
 
1870
 
1 www 1871
            $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
1872
            $dirpath = $fullpath_chat . $chatGroup->uuid;
5937 anderson 1873
 
1 www 1874
            Functions::rmDirRecursive($dirpath);
5937 anderson 1875
 
1876
 
3086 efrain 1877
            $userMapper = UserMapper::getInstance($this->adapter);
1878
            $userMapper->updateLastActivity($currentUser->id);
5937 anderson 1879
 
1 www 1880
            return new JsonModel([
1881
                'success' => true
1882
            ]);
1883
        } else {
1884
            return new JsonModel([
1885
                'success' => false,
1886
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1887
            ]);
1888
        }
1889
    }
1890
 
1891
    /**
1892
     * Cerrar el chat, consiste en borrar de la variable de sessión para que el mismo no se presente la siguiente vez abierto ,
1893
     * al menos que tenga mensajes sin leer
1894
     * 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.
1895
     * Parámetros del route
1896
     * :id = id del chat encriptado
1897
     * En caso de una respuesta positiva
1898
     * [
1899
     *  'success' => true
1900
     * ]
1901
     * En caso de un respuesta negativa
1902
     * [
1903
     *  'success' => false,
1904
     *  'data'  => mensaje_de_error
1905
     * ]
1906
     * @return \Laminas\View\Model\JsonModel
1907
     */
1908
    public function closeAction()
1909
    {
1910
        $request    = $this->getRequest();
5937 anderson 1911
        if ($request->isPost()) {
1 www 1912
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1913
            $currentUser = $currentUserPlugin->getUser();
5937 anderson 1914
 
6749 efrain 1915
            $id = Functions::sanitizeFilterString($this->params()->fromRoute('id'));
5937 anderson 1916
 
1 www 1917
            if (!$id) {
1918
                return new JsonModel([
1919
                    'success' => false,
1920
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
1921
                ]);
1922
            }
5937 anderson 1923
 
1924
 
1 www 1925
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
1926
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
1927
            if ($chatGroup) {
3121 efrain 1928
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
1929
                $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
5937 anderson 1930
 
1931
                if (!$chatGroupUser) {
3121 efrain 1932
                    return new JsonModel([
1933
                        'success' => false,
1934
                        'data' =>  'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
1935
                    ]);
1936
                }
5937 anderson 1937
 
3099 efrain 1938
                $chatGroupUserMapper->markIsClose($chatGroup->id, $currentUser->id);
1 www 1939
            } else {
5937 anderson 1940
 
1 www 1941
                $userMapper = UserMapper::getInstance($this->adapter);
1942
                $user = $userMapper->fetchOneByUuid($id);
5937 anderson 1943
                if (!$user) {
1 www 1944
                    return new JsonModel([
1945
                        'success' => false,
1946
                        'data' => 'ERROR_USER_NOT_FOUND'
1947
                    ]);
1948
                }
5937 anderson 1949
 
1950
 
1 www 1951
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
1952
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
5937 anderson 1953
                if ($chatUser) {
1954
 
1955
                    if ($currentUser->id == $chatUser->user_id1) {
3113 efrain 1956
                        $chatUserMapper->markIsClose1($chatUser->id);
1957
                    } else {
3112 efrain 1958
                        $chatUserMapper->markIsClose2($chatUser->id);
3099 efrain 1959
                    }
1 www 1960
                }
1961
            }
3086 efrain 1962
 
5937 anderson 1963
 
3086 efrain 1964
            $userMapper->updateLastActivity($currentUser->id);
5937 anderson 1965
 
1 www 1966
            return new JsonModel([
1967
                'success' => true
1968
            ]);
1969
        } else {
1970
            return new JsonModel([
1971
                'success' => false,
1972
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1973
            ]);
1974
        }
1975
    }
1976
 
1977
    /**
1978
     * Clear como su nombre lo indica es borrar los mensajes entre el usuario actual y otro usuario con quien sostiene el chat
1979
     * 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.
1980
     * Parámetros del route
1981
     * :id = id del usuario encriptado
1982
     * En caso de una respuesta positiva
1983
     * [
1984
     *      'success' => true,
1985
     *      'data'=> (int) registros_borrados
1986
     * ]
1987
     * En caso de un respuesta negativa
1988
     * [
1989
     *      'success' => false,
1990
     *      'data' => (string) 'mensaje_de_error'
1991
     * ]
1992
     * @return \Laminas\View\Model\JsonModel
1993
     */
1994
    public function clearAction()
1995
    {
1996
        $request    = $this->getRequest();
5937 anderson 1997
        if ($request->isPost()) {
1 www 1998
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1999
            $currentUser = $currentUserPlugin->getUser();
5937 anderson 2000
 
6749 efrain 2001
            $id = Functions::sanitizeFilterString($this->params()->fromRoute('id'));
5937 anderson 2002
 
1 www 2003
            if (!$id) {
2004
                return new JsonModel([
2005
                    'success' => false,
2006
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2007
                ]);
2008
            }
5937 anderson 2009
 
2010
 
1 www 2011
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2012
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
2013
            if ($chatGroup) {
3099 efrain 2014
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
3121 efrain 2015
                $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
5937 anderson 2016
 
2017
                if (!$chatGroupUser) {
3121 efrain 2018
                    return new JsonModel([
2019
                        'success' => false,
2020
                        'data' =>  'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
2021
                    ]);
2022
                }
5937 anderson 2023
 
3099 efrain 2024
                $chatGroupUserMapper->markIsClose($chatGroup->id, $currentUser->id);
1 www 2025
            } else {
5937 anderson 2026
 
1 www 2027
                $userMapper = UserMapper::getInstance($this->adapter);
2028
                $user = $userMapper->fetchOneByUuid($id);
5937 anderson 2029
                if (!$user) {
1 www 2030
                    return new JsonModel([
2031
                        'success' => false,
2032
                        'data' => 'ERROR_USER_NOT_FOUND'
2033
                    ]);
2034
                }
5937 anderson 2035
 
2036
 
1 www 2037
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2038
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
5937 anderson 2039
                if ($chatUser) {
2040
                    if ($currentUser->id == $chatUser->user_id1) {
3113 efrain 2041
                        $chatUserMapper->markIsClose1($chatUser->id);
2042
                    } else {
3112 efrain 2043
                        $chatUserMapper->markIsClose2($chatUser->id);
3099 efrain 2044
                    }
1 www 2045
                }
2046
            }
3086 efrain 2047
 
3099 efrain 2048
 
3086 efrain 2049
            $userMapper->updateLastActivity($currentUser->id);
5937 anderson 2050
 
1 www 2051
            return new JsonModel([
2052
                'success' => true
2053
            ]);
2054
        } else {
2055
            return new JsonModel([
2056
                'success' => false,
2057
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2058
            ]);
2059
        }
2060
    }
5937 anderson 2061
 
3121 efrain 2062
    /**
2063
     * Marca como abierto el caht
2064
     * 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.
2065
     * Parámetros del route
2066
     * :id = id del usuario encriptado
2067
     * En caso de una respuesta positiva
2068
     * [
2069
     *      'success' => true,
2070
     *      'data'=> (int) registros_borrados
2071
     * ]
2072
     * En caso de un respuesta negativa
2073
     * [
2074
     *      'success' => false,
2075
     *      'data' => (string) 'mensaje_de_error'
2076
     * ]
2077
     * @return \Laminas\View\Model\JsonModel
2078
     */
5343 efrain 2079
    public function openOrCreateAction()
2080
    {
2081
        $request    = $this->getRequest();
5937 anderson 2082
        if ($request->isPost()) {
5343 efrain 2083
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2084
            $currentUser = $currentUserPlugin->getUser();
5937 anderson 2085
 
5343 efrain 2086
            $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
2087
            $currentNetwork = $currentNetworkPlugin->getNetwork();
5937 anderson 2088
 
2089
 
6749 efrain 2090
            $id = Functions::sanitizeFilterString($this->params()->fromRoute('id'));
5937 anderson 2091
 
5343 efrain 2092
            if (!$id) {
2093
                return new JsonModel([
2094
                    'success' => false,
2095
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2096
                ]);
2097
            }
5937 anderson 2098
 
5343 efrain 2099
            $userMapper = UserMapper::getInstance($this->adapter);
6388 efrain 2100
            $now = $userMapper->getDatebaseNow();
2101
 
5343 efrain 2102
            $user = $userMapper->fetchOneByUuid($id);
5937 anderson 2103
 
2104
            if (!$user) {
5343 efrain 2105
                return new JsonModel([
2106
                    'success' => false,
2107
                    'data' => 'ERROR_USER_NOT_FOUND'
2108
                ]);
2109
            }
5937 anderson 2110
 
2111
            if ($user->email_verified == User::EMAIL_VERIFIED_NO || $user->status != User::STATUS_ACTIVE) {
5343 efrain 2112
                return new JsonModel([
2113
                    'success' => false,
2114
                    'data' => 'ERROR_USER_IS_INACTIVE'
2115
                ]);
2116
            }
5937 anderson 2117
 
2118
            if ($user->network_id != $currentUser->network_id) {
5343 efrain 2119
                return new JsonModel([
2120
                    'success' => false,
2121
                    'data' => 'ERROR_USER_IS_INACTIVE'
2122
                ]);
2123
            }
5937 anderson 2124
 
2125
            if ($currentNetwork->relationship_user_mode == Network::RELATIONSHIP_USER_MODE_USER_2_USER) {
2126
 
5343 efrain 2127
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
2128
                $connection = $connectionMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
5937 anderson 2129
 
2130
                if (!$connection) {
5343 efrain 2131
                    return new JsonModel([
2132
                        'success' => false,
2133
                        'data' =>  'ERROR_CONNECTION_NOT_ACTIVE'
2134
                    ]);
2135
                }
5937 anderson 2136
            }
2137
 
5343 efrain 2138
            $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2139
            $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
5937 anderson 2140
            if ($chatUser) {
2141
                if ($currentUser->id == $chatUser->user_id1) {
5343 efrain 2142
                    $chatUserMapper->markIsOpen1($chatUser->id);
2143
                } else {
2144
                    $chatUserMapper->markIsOpen2($chatUser->id);
2145
                }
2146
            } else {
2147
                $chatUser = new ChatUser();
2148
                $chatUser->user_id1 = $currentUser->id;
2149
                $chatUser->user_id2 = $user->id;
2150
                $chatUser->user_open1 = ChatUser::OPEN_YES;
2151
                $chatUser->user_open2 = ChatUser::OPEN_NO;
5937 anderson 2152
 
2153
 
2154
                if (!$chatUserMapper->insert($chatUser)) {
5343 efrain 2155
                    return new JsonModel([
2156
                        'success' => false,
2157
                        'data' =>  $chatUserMapper->getError()
2158
                    ]);
2159
                }
2160
            }
5937 anderson 2161
 
2162
 
5343 efrain 2163
            $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
2164
            $count_not_received_messages = $chatMessageMapper->countNotReceivedMessagesByChatIdAndToId($chatUser->id, $currentUser->id);
2165
            $count_not_seen_messages = $chatMessageMapper->countNotSeenMessagesByChatIdAndToId($chatUser->id, $currentUser->id);
2166
            $lastMessage = $chatMessageMapper->fetchLastMessage($chatUser->id, $currentUser->id);
5937 anderson 2167
 
2168
            if ($lastMessage) {
5343 efrain 2169
                $lastMessage = Functions::timeAgo($lastMessage->added_on, $now);
2170
            } else {
2171
                $lastMessage = '';
2172
            }
5937 anderson 2173
 
2174
            if ($currentUser->id == $chatUser->user_id1) {
5343 efrain 2175
                $is_open = $chatUser->user_open1 == ChatUser::OPEN_YES;
2176
            } else {
2177
                $is_open = $chatUser->user_open2 == ChatUser::OPEN_YES;
2178
            }
5937 anderson 2179
 
2180
 
5343 efrain 2181
            $not_received_messages = $count_not_received_messages > 0;
2182
            $not_seen_messages = $count_not_seen_messages > 0;
5937 anderson 2183
 
2184
            $data = [
5343 efrain 2185
                'url_clear'                 => $this->url()->fromRoute('chat/clear', ['id' => $user->uuid]),
2186
                'url_close'                 => $this->url()->fromRoute('chat/close', ['id' => $user->uuid]),
2187
                'url_open'                  => $this->url()->fromRoute('chat/open', ['id' => $user->uuid]),
2188
                'url_send'                  => $this->url()->fromRoute('chat/send', ['id' => $user->uuid]),
2189
                'url_upload'                => $this->url()->fromRoute('chat/upload', ['id' => $user->uuid]),
2190
                'url_mark_seen'             => $this->url()->fromRoute('chat/mark-seen', ['id' => $user->uuid]),
2191
                'url_mark_received'         => $this->url()->fromRoute('chat/mark-received', ['id' => $user->uuid]),
2192
                'url_get_all_messages'      => $this->url()->fromRoute('chat/get-all-messages', ['id' => $user->uuid]),
2193
                'url_zoom'                  => $this->url()->fromRoute('chat/zoom', ['id' => $user->uuid, 'type' => 'chat']),
2194
                'id'                        => $user->uuid,
2195
                'name'                      => trim($user->first_name . ' ' . $user->last_name),
2196
                'image'                     => $this->url()->fromRoute('storage', ['code' => $user->uuid, 'type' => 'user', 'filename' => $user->image]),
5937 anderson 2197
                'profile'                   => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
5343 efrain 2198
                'type'                      => 'user',
2199
                'online'                    => $user->online ? 1 : 0,
2200
                'is_open'                   => $is_open ? 1 : 0,
2201
                'not_seen_messages'         => $not_seen_messages,
2202
                'not_received_messages'     => $not_received_messages,
2203
                'count_not_seen_messages'       => $count_not_seen_messages,
2204
                'count_not_received_messages'   => $count_not_received_messages,
5937 anderson 2205
                'last_message'                  => $lastMessage
2206
            ];
2207
 
2208
 
2209
 
5343 efrain 2210
            $userMapper->updateLastActivity($currentUser->id);
5937 anderson 2211
 
5343 efrain 2212
            return new JsonModel([
5937 anderson 2213
                'success' => true,
5343 efrain 2214
                'data' => $data,
2215
            ]);
2216
        } else {
2217
            return new JsonModel([
2218
                'success' => false,
2219
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2220
            ]);
2221
        }
2222
    }
5937 anderson 2223
 
2224
 
5343 efrain 2225
    /**
2226
     * Marca como abierto el caht
2227
     * 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.
2228
     * Parámetros del route
2229
     * :id = id del usuario encriptado
2230
     * En caso de una respuesta positiva
2231
     * [
2232
     *      'success' => true,
2233
     *      'data'=> (int) registros_borrados
2234
     * ]
2235
     * En caso de un respuesta negativa
2236
     * [
2237
     *      'success' => false,
2238
     *      'data' => (string) 'mensaje_de_error'
2239
     * ]
2240
     * @return \Laminas\View\Model\JsonModel
2241
     */
3121 efrain 2242
    public function openAction()
2243
    {
2244
        $request    = $this->getRequest();
5937 anderson 2245
        if ($request->isPost()) {
3121 efrain 2246
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2247
            $currentUser = $currentUserPlugin->getUser();
5937 anderson 2248
 
6749 efrain 2249
            $id = Functions::sanitizeFilterString($this->params()->fromRoute('id'));
5937 anderson 2250
 
3121 efrain 2251
            if (!$id) {
2252
                return new JsonModel([
2253
                    'success' => false,
2254
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2255
                ]);
2256
            }
5937 anderson 2257
 
2258
 
3121 efrain 2259
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2260
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
2261
            if ($chatGroup) {
2262
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2263
                $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
5937 anderson 2264
 
2265
                if (!$chatGroupUser) {
3121 efrain 2266
                    return new JsonModel([
2267
                        'success' => false,
2268
                        'data' =>  'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
2269
                    ]);
2270
                }
5937 anderson 2271
 
3121 efrain 2272
                $chatGroupUserMapper->markIsOpen($chatGroup->id, $currentUser->id);
2273
            } else {
5937 anderson 2274
 
3121 efrain 2275
                $userMapper = UserMapper::getInstance($this->adapter);
2276
                $user = $userMapper->fetchOneByUuid($id);
5937 anderson 2277
                if (!$user) {
3121 efrain 2278
                    return new JsonModel([
2279
                        'success' => false,
2280
                        'data' => 'ERROR_USER_NOT_FOUND'
2281
                    ]);
2282
                }
5937 anderson 2283
 
2284
 
3121 efrain 2285
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2286
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
5937 anderson 2287
                if ($chatUser) {
2288
                    if ($currentUser->id == $chatUser->user_id1) {
3121 efrain 2289
                        $chatUserMapper->markIsOpen1($chatUser->id);
2290
                    } else {
2291
                        $chatUserMapper->markIsOpen2($chatUser->id);
2292
                    }
2293
                }
2294
            }
5937 anderson 2295
 
2296
 
3121 efrain 2297
            $userMapper->updateLastActivity($currentUser->id);
5937 anderson 2298
 
3121 efrain 2299
            return new JsonModel([
2300
                'success' => true
2301
            ]);
2302
        } else {
2303
            return new JsonModel([
2304
                'success' => false,
2305
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2306
            ]);
2307
        }
2308
    }
5937 anderson 2309
 
1 www 2310
    public function uploadAction()
2311
    {
2312
        $request    = $this->getRequest();
5937 anderson 2313
        if ($request->isPost()) {
1 www 2314
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2315
            $currentUser = $currentUserPlugin->getUser();
5937 anderson 2316
 
6749 efrain 2317
            $id = Functions::sanitizeFilterString($this->params()->fromRoute('id'));
1 www 2318
            if (!$id) {
2319
                return new JsonModel([
2320
                    'success' => false,
2321
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2322
                ]);
2323
            }
5937 anderson 2324
 
1 www 2325
            $files = $this->getRequest()->getFiles()->toArray();
5937 anderson 2326
            if (!isset($files['file']) || !empty($files['file']['error'])) {
1 www 2327
                return new JsonModel([
2328
                    'success' => false,
2329
                    'data' => 'ERROR_FILE_NOT_UPLOAD'
2330
                ]);
2331
            }
5937 anderson 2332
 
1 www 2333
            $tmp_filename   = $files['file']['tmp_name'];
5937 anderson 2334
            if (!$this->validMimeType($tmp_filename)) {
1 www 2335
                return new JsonModel([
2336
                    'success' => false,
2337
                    'data' => 'ERROR_FILE_UPLODED_IS_NOT_VALID'
2338
                ]);
2339
            }
2340
 
5937 anderson 2341
 
1 www 2342
            $extensions     = explode('.', $files['file']['name']);
2343
            $extension      = strtolower(trim($extensions[count($extensions) - 1]));
2344
            $filename       = uniqid() . '.' . $extension;
2345
 
5937 anderson 2346
 
1 www 2347
            $mime_type = mime_content_type($tmp_filename);
5937 anderson 2348
            if ($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {
1 www 2349
                $file_type = 'image';
5937 anderson 2350
            } else if ($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {
1 www 2351
                $file_type = 'video';
5937 anderson 2352
            } else if ($mime_type == 'application/pdf') {
1 www 2353
                $file_type = 'document';
2354
            }
5937 anderson 2355
 
2356
 
1 www 2357
            $userMapper = UserMapper::getInstance($this->adapter);
6388 efrain 2358
            $now = $userMapper->getDatebaseNow();
2359
 
1 www 2360
            $sender_result = $userMapper->fetchOne($currentUser->id);
2361
            $sender_from = trim($sender_result->first_name . ' ' . $sender_result->last_name);
2362
            $sender_pic = $this->url()->fromRoute('storage', [
2363
                'code' => $sender_result->uuid,
2364
                'type' => 'user',
2365
                'filename' => $sender_result->image
2366
            ]);
5937 anderson 2367
 
1 www 2368
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2369
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
5937 anderson 2370
            if ($chatGroup) {
2371
 
1 www 2372
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2373
                $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
5937 anderson 2374
 
2375
                if (!$chatGroupUser) {
1 www 2376
                    return new JsonModel([
2377
                        'success' => false,
2378
                        'data' => 'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
2379
                    ]);
2380
                }
2381
 
5937 anderson 2382
 
1 www 2383
                $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
2384
                $dirpath = $fullpath_chat . $chatGroup->uuid;
5937 anderson 2385
                if (!file_exists($dirpath)) {
1 www 2386
                    mkdir($dirpath, 0777, true);
2387
                    chmod($dirpath, 0777);
2388
                }
5937 anderson 2389
 
1 www 2390
                $full_filename = $dirpath . DIRECTORY_SEPARATOR . $filename;
5937 anderson 2391
                if (!move_uploaded_file($tmp_filename, $full_filename)) {
1 www 2392
                    return new JsonModel([
2393
                        'success' => false,
2394
                        'data' => 'ERROR_FILE_UPLOADED_NOT_MOVE'
2395
                    ]);
2396
                }
5937 anderson 2397
 
1 www 2398
                $chatGroupMessage = new ChatGroupMessage();
2399
                $chatGroupMessage->sender_id    = $currentUser->id;
2400
                $chatGroupMessage->group_id     = $chatGroup->id;
2401
                $chatGroupMessage->content      = $filename;
2402
                $chatGroupMessage->type         = $file_type;
5937 anderson 2403
 
1 www 2404
                $chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
2405
                $result = $chatGroupMessageMapper->insert($chatGroupMessage);
5937 anderson 2406
                if (!$result) {
1 www 2407
                    return new JsonModel([
2408
                        'success' => false,
2409
                        'data' => $chatGroupMessageMapper->getError()
2410
                    ]);
2411
                }
5937 anderson 2412
 
1 www 2413
                $chatGroupMessage = $chatGroupMessageMapper->fetchOne($chatGroupMessage->id);
5937 anderson 2414
 
2415
 
1 www 2416
                $chatGroupUserMessage = new ChatGroupUserMessage();
2417
                $chatGroupUserMessage->group_id = $chatGroupMessage->group_id;
2418
                $chatGroupUserMessage->message_id = $chatGroupMessage->id;
2419
                $chatGroupUserMessage->receiver_id = $currentUser->id;
2420
                $chatGroupUserMessage->recd = ChatGroupUserMessage::RECD_YES;
2421
                $chatGroupUserMessage->seen = ChatGroupUserMessage::SEEN_YES;
5937 anderson 2422
 
2423
 
1 www 2424
                $chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
2425
                $result = $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
5937 anderson 2426
                if (!$result) {
1 www 2427
                    return new JsonModel([
2428
                        'success' => false,
2429
                        'data' => $chatGroupUserMessageMapper->getError()
2430
                    ]);
2431
                }
5937 anderson 2432
 
2433
 
2434
 
1 www 2435
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
5937 anderson 2436
 
1 www 2437
                $results = $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
5937 anderson 2438
                foreach ($results as $r) {
1 www 2439
                    if ($r->user_id != $currentUser->id) {
2440
                        $chatGroupUserMessage = new ChatGroupUserMessage();
2441
                        $chatGroupUserMessage->group_id = $chatGroupMessage->group_id;
2442
                        $chatGroupUserMessage->message_id = $chatGroupMessage->id;
5937 anderson 2443
                        $chatGroupUserMessage->receiver_id = $r->user_id;
1 www 2444
                        $chatGroupUserMessage->recd = ChatGroupUserMessage::RECD_NO;
2445
                        $chatGroupUserMessage->seen = ChatGroupUserMessage::SEEN_NO;
5937 anderson 2446
 
1 www 2447
                        $result = $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
5937 anderson 2448
                        if (!$result) {
1 www 2449
                            return new JsonModel([
2450
                                'success' => false,
2451
                                'data' => $chatGroupUserMessageMapper->getError()
2452
                            ]);
2453
                        }
2454
                    }
2455
                }
5937 anderson 2456
 
2457
 
3086 efrain 2458
                $userMapper->updateLastActivity($currentUser->id);
5937 anderson 2459
 
2460
 
3138 efrain 2461
                $msgtime = Functions::timeAgo($now, $now);
1 www 2462
                return new JsonModel([
2463
                    'success' => true,
2464
                    'data' => [
2465
                        'user_name'     => $sender_from,
2466
                        'user_id'       => $currentUser->uuid,
2467
                        'user_image'    => $sender_pic,
2468
                        'u'             => 1,
2469
                        'mtype'         => $file_type,
2470
                        'm'             => $this->url()->fromRoute('storage', ['code' => $chatGroup->uuid, 'type' => 'chat', 'filename' => $filename]),
2471
                        'time'          => $msgtime,
2472
                        'id'            => $chatGroupMessage->uuid
2473
                    ]
2474
                ]);
5937 anderson 2475
            } else {
1 www 2476
 
2477
                $user = $userMapper->fetchOneByUuid($id);
5937 anderson 2478
                if (!$user) {
1 www 2479
                    return new JsonModel([
2480
                        'success' => false,
2481
                        'data' => 'ERROR_USER_NOT_FOUND'
2482
                    ]);
2483
                }
5937 anderson 2484
 
1 www 2485
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2486
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
5937 anderson 2487
                if (!$chatUser) {
1 www 2488
                    return new JsonModel([
2489
                        'success' => false,
2490
                        'data' => 'ERROR_CHAT_NOT_FOUND'
2491
                    ]);
2492
                }
5937 anderson 2493
 
1 www 2494
                $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
2495
                $dirpath = $fullpath_chat . $chatUser->uuid;
5937 anderson 2496
 
2497
                if (!file_exists($dirpath)) {
1 www 2498
                    mkdir($dirpath, 0777, true);
2499
                    chmod($dirpath, 0777);
2500
                }
5937 anderson 2501
 
1 www 2502
                $full_filename = $dirpath . DIRECTORY_SEPARATOR . $filename;
5937 anderson 2503
                if (!move_uploaded_file($tmp_filename, $full_filename)) {
1 www 2504
                    return new JsonModel([
2505
                        'success' => false,
2506
                        'data' => 'ERROR_FILE_UPLOADED_NOT_MOVE'
2507
                    ]);
2508
                }
2509
 
2510
                $chatMessage = new ChatMessage();
2511
                $chatMessage->chat_id = $chatUser->id;
2512
                $chatMessage->from_id = $currentUser->id;
2513
                $chatMessage->to_id = $user->id;
2514
                $chatMessage->content = $filename;
2515
                $chatMessage->type = $file_type;
2516
                $chatMessage->recd = ChatMessage::RECD_NO;
2517
                $chatMessage->seen = ChatMessage::SEEN_NO;
5937 anderson 2518
 
2519
 
1 www 2520
                $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
2521
                $result = $chatMessageMapper->insert($chatMessage);
5937 anderson 2522
                if (!$result) {
1 www 2523
                    return new JsonModel([
2524
                        'success' => false,
2525
                        'data' =>  $chatMessageMapper->getError()
2526
                    ]);
2527
                }
5937 anderson 2528
 
1 www 2529
                $chatMessage = $chatMessageMapper->fetchOne($chatMessage->id);
5937 anderson 2530
 
3086 efrain 2531
                $userMapper->updateLastActivity($currentUser->id);
5937 anderson 2532
 
3138 efrain 2533
                $msgtime = Functions::timeAgo($chatMessage->added_on, $now);
1 www 2534
                return new JsonModel([
2535
                    'success' => true,
2536
                    'data' => [
2537
                        'user_name' => $sender_from,
2538
                        'user_id' => $currentUser->uuid,
2539
                        'user_image' => $sender_pic,
2540
                        'u' => 1,
2541
                        'mtype' => $file_type,
2542
                        'm' => $this->url()->fromRoute('storage', ['code' => $currentUser->uuid, 'type' => 'chat', 'filename' => $filename]),
2543
                        'time' => $msgtime,
2544
                        'id' => $chatMessage->uuid
2545
                    ]
2546
                ]);
2547
            }
2548
        } else {
2549
            return new JsonModel([
2550
                'success' => false,
2551
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2552
            ]);
2553
        }
2554
    }
2555
 
2556
    public function markSeenAction()
2557
    {
2558
        $request = $this->getRequest();
5937 anderson 2559
        if ($request->isPost()) {
1 www 2560
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2561
            $currentUser = $currentUserPlugin->getUser();
5937 anderson 2562
 
1 www 2563
            $id = $this->params()->fromRoute('id');
2564
            if (!$id) {
2565
                return new JsonModel([
2566
                    'success' => false,
2567
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2568
                ]);
2569
            }
5937 anderson 2570
 
1 www 2571
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2572
            $chatGroup =  $chatGroupMapper->fetchOneByUuid($id);
5937 anderson 2573
 
2574
            if ($chatGroup) {
2575
 
1 www 2576
                $charGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2577
                $chatGroupUser = $charGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
5937 anderson 2578
 
2579
                if (!$chatGroupUser) {
1 www 2580
                    return new JsonModel([
2581
                        'success' => false,
2582
                        'data' =>  'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
2583
                    ]);
2584
                }
5937 anderson 2585
 
1 www 2586
                $charGroupUserMessage = ChatGroupUserMessageMapper::getInstance($this->adapter);
2587
                $result = $charGroupUserMessage->markAsSeenByGroupIdAndUserId($chatGroup->id, $currentUser->id);
5937 anderson 2588
                if ($result) {
1 www 2589
                    return new JsonModel([
2590
                        'success' => true,
2591
                    ]);
2592
                } else {
2593
                    return new JsonModel([
2594
                        'success' => false,
2595
                        'data' =>  $charGroupUserMessage->getError()
2596
                    ]);
2597
                }
2598
            } else {
2599
                $userMapper = UserMapper::getInstance($this->adapter);
2600
                $user = $userMapper->fetchOneByUuid($id);
5937 anderson 2601
 
2602
                if (!$user) {
1 www 2603
                    return new JsonModel([
2604
                        'success' => false,
2605
                        'data' => 'ERROR_USER_NOT_FOUND'
2606
                    ]);
2607
                }
5937 anderson 2608
 
1 www 2609
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2610
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
5937 anderson 2611
                if (!$chatUser) {
1 www 2612
                    return new JsonModel([
2613
                        'success' => false,
2614
                        'data' => 'ERROR_CHAT_NOT_FOUND'
2615
                    ]);
2616
                }
5937 anderson 2617
 
1 www 2618
                $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
2619
                $result = $chatMessageMapper->markAsSeenByChatIdAndToId($chatUser->id, $currentUser->id);
5937 anderson 2620
                if ($result) {
1 www 2621
                    return new JsonModel([
2622
                        'success' => true,
2623
                    ]);
2624
                } else {
2625
                    return new JsonModel([
2626
                        'success' => false,
2627
                        'data' =>  $charGroupUserMessage->getError()
2628
                    ]);
2629
                }
2630
            }
2631
        } else {
2632
            $response = [
2633
                'success' => false,
2634
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2635
            ];
2636
        }
2637
 
2638
        return new JsonModel($response);
2639
    }
5937 anderson 2640
 
2641
 
1 www 2642
    public function markReceivedAction()
2643
    {
2644
        $request = $this->getRequest();
5937 anderson 2645
        if ($request->isPost()) {
1 www 2646
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2647
            $currentUser = $currentUserPlugin->getUser();
5937 anderson 2648
 
1 www 2649
            $id = $this->params()->fromRoute('id');
2650
            if (!$id) {
2651
                return new JsonModel([
2652
                    'success' => false,
2653
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2654
                ]);
2655
            }
5937 anderson 2656
 
1 www 2657
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
2658
            $chatGroup =  $chatGroupMapper->fetchOneByUuid($id);
5937 anderson 2659
 
2660
            if ($chatGroup) {
2661
 
1 www 2662
                $charGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2663
                $chatGroupUser = $charGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
5937 anderson 2664
 
2665
                if (!$chatGroupUser) {
1 www 2666
                    return new JsonModel([
2667
                        'success' => false,
2668
                        'data' =>  'ERROR_CHAT_GROUP_YOU_NOT_MEMBER'
2669
                    ]);
2670
                }
5937 anderson 2671
 
1 www 2672
                $charGroupUserMessage = ChatGroupUserMessageMapper::getInstance($this->adapter);
2673
                $result = $charGroupUserMessage->markAsReceivedByGroupIdAndUserId($chatGroup->id, $currentUser->id);
5937 anderson 2674
                if ($result) {
1 www 2675
                    return new JsonModel([
2676
                        'success' => true,
2677
                    ]);
2678
                } else {
2679
                    return new JsonModel([
2680
                        'success' => false,
2681
                        'data' =>  $charGroupUserMessage->getError()
2682
                    ]);
2683
                }
2684
            } else {
2685
                $userMapper = UserMapper::getInstance($this->adapter);
2686
                $user = $userMapper->fetchOneByUuid($id);
5937 anderson 2687
 
2688
                if (!$user) {
1 www 2689
                    return new JsonModel([
2690
                        'success' => false,
2691
                        'data' => 'ERROR_USER_NOT_FOUND'
2692
                    ]);
2693
                }
5937 anderson 2694
 
1 www 2695
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2696
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
5937 anderson 2697
                if (!$chatUser) {
1 www 2698
                    return new JsonModel([
2699
                        'success' => false,
2700
                        'data' => 'ERROR_CHAT_NOT_FOUND'
2701
                    ]);
2702
                }
5937 anderson 2703
 
1 www 2704
                $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
2705
                $result = $chatMessageMapper->markAsReceivedByChatIdAndToId($chatUser->id, $currentUser->id);
5937 anderson 2706
                if ($result) {
1 www 2707
                    return new JsonModel([
2708
                        'success' => true,
2709
                    ]);
2710
                } else {
2711
                    return new JsonModel([
2712
                        'success' => false,
2713
                        'data' =>  $charGroupUserMessage->getError()
2714
                    ]);
2715
                }
2716
            }
2717
        } else {
2718
            $response = [
2719
                'success' => false,
2720
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2721
            ];
2722
        }
5937 anderson 2723
 
1 www 2724
        return new JsonModel($response);
2725
    }
5937 anderson 2726
 
4857 efrain 2727
    public function usersAction()
2728
    {
5938 anderson 2729
        $currentUserPlugin = $this->plugin('currentUserPlugin');
2730
        $currentUser = $currentUserPlugin->getUser();
5343 efrain 2731
 
5938 anderson 2732
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
2733
        $currentNetwork = $currentNetworkPlugin->getNetwork();
5937 anderson 2734
 
5938 anderson 2735
        $request = $this->getRequest();
5941 anderson 2736
        if ($request->isGet()) {
5937 anderson 2737
 
5941 anderson 2738
            $items = [];
5937 anderson 2739
 
5941 anderson 2740
            $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
5937 anderson 2741
 
2742
 
6749 efrain 2743
            $search = Functions::sanitizeFilterString($this->params()->fromQuery('search', ''));
5941 anderson 2744
            if (strlen($search) >= 3) {
2745
                $user_ids = [];
5937 anderson 2746
 
5941 anderson 2747
                $userMapper = UserMapper::getInstance($this->adapter);
5937 anderson 2748
 
2749
 
5941 anderson 2750
                if ($currentNetwork->relationship_user_mode == Network::RELATIONSHIP_USER_MODE_USER_2_USER) {
5937 anderson 2751
 
5941 anderson 2752
                    $connectionMapper = ConnectionMapper::getInstance($this->adapter);
2753
                    $user_ids = $connectionMapper->fetchAllConnectionsByUserReturnIds($currentUser->id);
5938 anderson 2754
                } else {
5941 anderson 2755
                    if ($currentNetwork->default == Network::DEFAULT_YES) {
2756
                        $user_ids = $userMapper->fetchAllIdsByDefaultNetworkId($currentNetwork->id, $currentUser->id);
2757
                    } else {
2758
                        $user_ids = $userMapper->fetchAllIdsByNonDefaultNetworkId($currentNetwork->id, $currentUser->id);
2759
                    }
5938 anderson 2760
                }
5937 anderson 2761
 
2762
 
2763
 
5941 anderson 2764
                $items = [];
6012 efrain 2765
                $records = $userMapper->fetchAllByIdsAndSearch($user_ids, $search, $currentUser->id);
5937 anderson 2766
 
5941 anderson 2767
                foreach ($records as $record) {
2768
                    $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $record->id);
2769
                    if ($chatUser) {
2770
                        $link_send = $this->url()->fromRoute('chat/send', ['id' => $record->uuid]);
2771
                    } else {
2772
                        $link_send = '';
2773
                    }
5937 anderson 2774
 
5942 anderson 2775
                    $link_open_or_create = $this->url()->fromRoute('chat/open-or-create', ['id' => $record->uuid]);
5937 anderson 2776
 
2777
 
2778
 
5942 anderson 2779
 
5941 anderson 2780
                    array_push($items, [
2781
                        'name'  => trim($record->first_name .  '  ' . $record->last_name) . ' (' . $record->email . ')',
2782
                        'image' => $this->url()->fromRoute('storage', ['code' => $record->uuid, 'type' => 'user', 'filename' => $record->image]),
2783
                        'link_send' => $link_send,
2784
                        'link_open_or_create' => $link_open_or_create,
2785
                    ]);
2786
                }
2787
            }
5937 anderson 2788
 
5941 anderson 2789
            $response = [
2790
                'success' => true,
2791
                'data' => $items
2792
            ];
2793
        } else {
2794
            $response = [
2795
                'success' => false,
2796
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
2797
            ];
5938 anderson 2798
        }
5937 anderson 2799
 
5938 anderson 2800
        return new JsonModel($response);
4857 efrain 2801
    }
5937 anderson 2802
 
2803
 
4131 efrain 2804
    public function zoomAction()
2805
    {
2806
        $request = $this->getRequest();
5937 anderson 2807
        if ($request->isPost()) {
4131 efrain 2808
            $currentUserPlugin = $this->plugin('currentUserPlugin');
2809
            $currentUser = $currentUserPlugin->getUser();
5937 anderson 2810
 
4131 efrain 2811
            $id = $this->params()->fromRoute('id');
5937 anderson 2812
 
4131 efrain 2813
            if (!$id) {
2814
                return new JsonModel([
2815
                    'success' => false,
2816
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2817
                ]);
2818
            }
5937 anderson 2819
 
4131 efrain 2820
            $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2821
            $chatGroupMapper = ChatGroupMapper::getInstance($this->adapter);
5937 anderson 2822
 
4141 efrain 2823
            $chatUser = null;
2824
            $chatGroup = $chatGroupMapper->fetchOneByUuid($id);
5937 anderson 2825
 
2826
            if ($chatGroup) {
4141 efrain 2827
                $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
2828
                $chatGroupUser = $chatGroupUserMapper->fetchOneByGroupIdAndUserId($chatGroup->id, $currentUser->id);
5937 anderson 2829
 
2830
                if (!$chatGroupUser) {
4131 efrain 2831
                    $data = [
2832
                        'success' => false,
2833
                        'data' =>  'ERROR_ZOOM_CHAT_UNAUTHORIZE'
2834
                    ];
5937 anderson 2835
 
2836
 
4131 efrain 2837
                    return new JsonModel($data);
2838
                }
2839
            } else {
5937 anderson 2840
 
4141 efrain 2841
                $userMapper = UserMapper::getInstance($this->adapter);
2842
                $user = $userMapper->fetchOneByUuid($id);
5937 anderson 2843
                if (!$user) {
4141 efrain 2844
                    return new JsonModel([
2845
                        'success' => false,
2846
                        'data' => 'ERROR_USER_NOT_FOUND'
2847
                    ]);
2848
                }
5937 anderson 2849
 
2850
 
4141 efrain 2851
                $connectionMapper = ConnectionMapper::getInstance($this->adapter);
2852
                $connection = $connectionMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
5937 anderson 2853
                if (!$connection || $connection->status != Connection::STATUS_ACCEPTED) {
2854
 
4141 efrain 2855
                    return new JsonModel([
2856
                        'success' => false,
2857
                        'data' => 'ERROR_THIS_USER_IS_NOT_A_CONNECTION'
2858
                    ]);
2859
                }
2860
                $chatUserMapper = ChatUserMapper::getInstance($this->adapter);
2861
                $chatUser = $chatUserMapper->fetchOneByUserId1AndUserId2($currentUser->id, $user->id);
5937 anderson 2862
                if (!$chatUser) {
4141 efrain 2863
                    $chatUser = new ChatUser();
2864
                    $chatUser->user_id1 = $currentUser->id;
2865
                    $chatUser->user_id2 = $user->id;
5937 anderson 2866
 
4141 efrain 2867
                    $response = $chatUserMapper->insert($chatUser);
5937 anderson 2868
                    if (!$response) {
4141 efrain 2869
                        return new JsonModel([
4131 efrain 2870
                            'success' => false,
4141 efrain 2871
                            'data' => $chatUserMapper->getError()
2872
                        ]);
4131 efrain 2873
                    }
5937 anderson 2874
 
4141 efrain 2875
                    $chatUser = $chatUserMapper->fetchOne($chatUser->id);
2876
                    $fullpath_chat = $this->config['leaderslinked.fullpath.chat'];
2877
                    $dirpath = $fullpath_chat . $chatUser->uuid;
5937 anderson 2878
                    if (!file_exists($dirpath)) {
4141 efrain 2879
                        mkdir($dirpath, 0777, true);
2880
                        chmod($dirpath, 0777);
2881
                    }
4131 efrain 2882
                }
2883
            }
5937 anderson 2884
 
2885
 
2886
 
2887
 
2888
 
2889
            if (!$chatUser && !$chatGroup) {
4131 efrain 2890
                $data = [
2891
                    'success' => false,
2892
                    'data' => 'ERROR_ZOOM_CHAT_NOT_FOUND'
2893
                ];
5937 anderson 2894
 
2895
 
4131 efrain 2896
                return new JsonModel($data);
2897
            }
5937 anderson 2898
 
4131 efrain 2899
            $dataPost = $request->getPost()->toArray();
2900
            $form = new ZoomAddForm();
2901
            $form->setData($dataPost);
5937 anderson 2902
            if ($form->isValid()) {
2903
 
4131 efrain 2904
                $dataPost = (array) $form->getData();
1 www 2905
 
5937 anderson 2906
 
2907
                $dtStart = \DateTime::createFromFormat('Y-m-d H:i:s', $dataPost['date'] . ' ' . $dataPost['time']);
2908
                if (!$dtStart) {
4131 efrain 2909
                    return new JsonModel([
2910
                        'success' => false,
2911
                        'data' => 'ERROR_PARAMETERS_ARE_INVALID'
2912
                    ]);
2913
                }
5937 anderson 2914
 
2915
 
2916
 
2917
                $dtEnd = \DateTime::createFromFormat('Y-m-d H:i:s', $dataPost['date'] . ' ' . $dataPost['time']);
4131 efrain 2918
                $dtEnd->add(new \DateInterval('PT' . $dataPost['duration'] . 'M'));
5937 anderson 2919
 
4131 efrain 2920
                $start_time = $dtStart->format('Y-m-d\TH:i:s');
6866 efrain 2921
                $zoom = new Zoom($this->adapter, $this->config, $this->cache);
5837 efrain 2922
 
2923
                $response =  $zoom->getOAuthAccessToken();
5937 anderson 2924
                if ($response['success']) {
5837 efrain 2925
                    $access_token = $response['data'];
2926
                    $result = $zoom->addMeeting($access_token, $dataPost['title'], $dataPost['description'], $dataPost['type'], $start_time, $dataPost['duration'], $dataPost['timezone'], $dataPost['password']);
2927
                } else {
2928
                    return new JsonModel([
2929
                        'success' => false,
2930
                        'data' => 'ERROR_ZOOM_CREATING_NEW_MEETING'
2931
                    ]);
2932
                }
1 www 2933
 
4131 efrain 2934
 
5937 anderson 2935
 
2936
 
2937
 
2938
 
2939
 
2940
 
2941
                if ($result['success']) {
2942
 
2943
 
4131 efrain 2944
                    $zoomMeetingMapper = ZoomMeetingMapper::getInstance($this->adapter);
2945
                    $zoomMeeting = $zoomMeetingMapper->fetchOne($result['data']['id']);
5937 anderson 2946
 
2947
                    if (!$zoomMeeting) {
2948
 
2949
 
5277 efrain 2950
                        $zoomMeeting = new ZoomMeeting();
2951
                        $zoomMeeting->id = $result['data']['id'];
2952
                        $zoomMeeting->topic = $dataPost['title'];
5937 anderson 2953
                        $zoomMeeting->agenda = $dataPost['description'];
5277 efrain 2954
                        $zoomMeeting->duration = $dataPost['duration'];
2955
                        $zoomMeeting->join_url = $result['data']['join_url'];
2956
                        $zoomMeeting->start_time = $dtStart->format('Y-m-d H:i:s');
2957
                        $zoomMeeting->end_time = $dtEnd->format('Y-m-d H:i:s');
2958
                        $zoomMeeting->timezone = $dataPost['timezone'];
2959
                        $zoomMeeting->type = $dataPost['type'];
5937 anderson 2960
                        $zoomMeeting->uuid = $result['data']['uuid'];
5277 efrain 2961
                        $zoomMeeting->password = $dataPost['password'];
5937 anderson 2962
 
2963
 
2964
                        if (!$zoomMeetingMapper->insert($zoomMeeting)) {
5277 efrain 2965
                            return new JsonModel([
2966
                                'success' => false,
2967
                                'data' => $zoomMeetingMapper->getError()
2968
                            ]);
2969
                        }
2970
                    }
5937 anderson 2971
 
2972
 
2973
 
2974
 
2975
 
2976
                    $chatMessageContent = "LABEL_ZOOM_MEETING \r\n" .
2977
                        " LABEL_ZOOM_MEETING_START_DATE : " . $dtStart->format('Y-m-d') . "\r\n" .
4141 efrain 2978
                        " LABEL_ZOOM_MEETING_START_TIME : " . $dtStart->format('H:i a') . "\r\n" .
2979
                        " LABEL_ZOOM_MEETING_TIMEZONE : " . $zoomMeeting->timezone . "\r\n" .
5937 anderson 2980
                        " LABEL_ZOOM_MEETING_TITLE :  " . $zoomMeeting->topic  . "\r\n" .
2981
                        " LABEL_ZOOM_MEETING_URL : " . $zoomMeeting->join_url . "\r\n" .
2982
                        " LABEL_ZOOM_MEETING_PASSWORD : " . $zoomMeeting->password . "\r\n";
2983
 
2984
 
5277 efrain 2985
                    $zoomMeetingUserMapper = ZoomMeetingUserMapper::getInstance($this->adapter);
2986
                    $zoomMeetingUser = $zoomMeetingUserMapper->fetchOneByZoomMeetingIdAndUserId($zoomMeeting->id, $currentUser->id);
5937 anderson 2987
 
2988
                    if (!$zoomMeetingUser) {
2989
 
5277 efrain 2990
                        $zoomMeetingUser = new ZoomMeetingUser();
2991
                        $zoomMeetingUser->zoom_meeting_id = $zoomMeeting->id;
2992
                        $zoomMeetingUser->user_id = $currentUser->id;
2993
                        $zoomMeetingUser->type = ZoomMeetingUser::TYPE_CREATOR;
2994
                        $zoomMeetingUserMapper->insert($zoomMeetingUser);
2995
                    }
5937 anderson 2996
 
2997
 
2998
 
2999
 
3000
 
3001
 
3002
                    if ($chatUser) {
3003
 
3004
                        if ($chatUser->user_id1 == $currentUser->id) {
3005
 
5277 efrain 3006
                            $zoomMeetingUser = $zoomMeetingUserMapper->fetchOneByZoomMeetingIdAndUserId($zoomMeeting->id, $chatUser->user_id2);
5937 anderson 3007
                            if (!$zoomMeetingUser) {
5277 efrain 3008
                                $zoomMeetingUser = new ZoomMeetingUser();
3009
                                $zoomMeetingUser->zoom_meeting_id = $zoomMeeting->id;
3010
                                $zoomMeetingUser->user_id = $chatUser->user_id2;
3011
                                $zoomMeetingUser->type = ZoomMeetingUser::TYPE_CREATOR;
3012
                                $zoomMeetingUserMapper->insert($zoomMeetingUser);
3013
                            }
4131 efrain 3014
                        } else {
5277 efrain 3015
                            $zoomMeetingUser = $zoomMeetingUserMapper->fetchOneByZoomMeetingIdAndUserId($zoomMeeting->id, $chatUser->user_id1);
5937 anderson 3016
                            if (!$zoomMeetingUser) {
5277 efrain 3017
                                $zoomMeetingUser = new ZoomMeetingUser();
3018
                                $zoomMeetingUser->zoom_meeting_id = $zoomMeeting->id;
3019
                                $zoomMeetingUser->user_id = $chatUser->user_id1;
3020
                                $zoomMeetingUser->type = ZoomMeetingUser::TYPE_CREATOR;
3021
                                $zoomMeetingUserMapper->insert($zoomMeetingUser);
3022
                            }
4131 efrain 3023
                        }
5937 anderson 3024
 
4131 efrain 3025
                        $chatMessage = new ChatMessage();
3026
                        $chatMessage->recd = ChatMessage::RECD_NO;
3027
                        $chatMessage->seen = ChatMessage::SEEN_NO;
3028
                        $chatMessage->type = ChatMessage::TYPE_TEXT;
3029
                        $chatMessage->content = $chatMessageContent;
3030
                        $chatMessage->from_id = $currentUser->id;
3031
                        $chatMessage->to_id = $chatUser->user_id1 == $currentUser->id ? $chatUser->user_id2 : $chatUser->user_id1;
3032
                        $chatMessage->chat_id = $chatUser->id;
5937 anderson 3033
 
3034
 
4131 efrain 3035
                        $chatMessageMapper = ChatMessageMapper::getInstance($this->adapter);
3036
                        $chatMessageMapper->insert($chatMessage);
5937 anderson 3037
 
3038
 
4141 efrain 3039
                        $chatUserMapper->markIsOpen1($chatUser->id);
3040
                        $chatUserMapper->markIsOpen2($chatUser->id);
5937 anderson 3041
                    } else if ($chatGroup) {
3042
 
4131 efrain 3043
                        $chatGroupMessage = new ChatGroupMessage();
3044
                        $chatGroupMessage->group_id = $chatGroup->id;
3045
                        $chatGroupMessage->content = $chatMessageContent;
3046
                        $chatGroupMessage->sender_id = $currentUser->id;
3047
                        $chatGroupMessage->type = ChatGroupMessage::TYPE_TEXT;
3048
                        $chatGroupMessageMapper = ChatGroupMessageMapper::getInstance($this->adapter);
5937 anderson 3049
                        if ($chatGroupMessageMapper->insert($chatGroupMessage)) {
3050
 
4131 efrain 3051
                            $chatGroupUserMapper = ChatGroupUserMapper::getInstance($this->adapter);
3052
                            $groupUsers =   $chatGroupUserMapper->fetchAllByGroupId($chatGroup->id);
5937 anderson 3053
 
3054
 
4131 efrain 3055
                            $chatGroupUserMessageMapper = ChatGroupUserMessageMapper::getInstance($this->adapter);
5937 anderson 3056
                            foreach ($groupUsers as $groupUser) {
3057
 
3058
                                if ($groupUser->user_id != $currentUser->id) {
5277 efrain 3059
                                    $zoomMeetingUser = $zoomMeetingUserMapper->fetchOneByZoomMeetingIdAndUserId($zoomMeeting->id, $groupUser->user_id);
5937 anderson 3060
 
3061
                                    if (!$zoomMeetingUser) {
5277 efrain 3062
                                        $zoomMeetingUser = new ZoomMeetingUser();
3063
                                        $zoomMeetingUser->zoom_meeting_id = $zoomMeeting->id;
3064
                                        $zoomMeetingUser->user_id = $groupUser->user_id;
3065
                                        $zoomMeetingUser->type = ZoomMeetingUser::TYPE_CREATOR;
3066
                                        $zoomMeetingUserMapper->insert($zoomMeetingUser);
3067
                                    }
4141 efrain 3068
                                }
5937 anderson 3069
 
3070
 
4131 efrain 3071
                                $chatGroupUserMessage = new ChatGroupUserMessage();
3072
                                $chatGroupUserMessage->group_id = $chatGroup->id;
3073
                                $chatGroupUserMessage->message_id = $chatGroupMessage->id;
3074
                                $chatGroupUserMessage->receiver_id = $groupUser->user_id;
3075
                                $chatGroupUserMessage->recd = ChatGroupUserMessage::RECD_NO;
3076
                                $chatGroupUserMessage->seen = ChatGroupUserMessage::SEEN_NO;
3077
                                $chatGroupUserMessageMapper->insert($chatGroupUserMessage);
5937 anderson 3078
 
4131 efrain 3079
                                $chatGroupUserMapper->markIsOpen($groupUser->group_id, $groupUser->user_id);
3080
                            }
3081
                        }
3082
                    }
5937 anderson 3083
 
4131 efrain 3084
                    return new JsonModel([
3085
                        'success' => true,
3086
                        'data' => 'LABEL_ZOOM_NEW_MEETING_SUCCESSFULLY'
3087
                    ]);
3088
                } else {
3089
                    return new JsonModel([
3090
                        'success' => false,
3091
                        'data' => 'ERROR_ZOOM_CREATING_NEW_MEETING'
3092
                    ]);
3093
                }
3094
            } else {
5937 anderson 3095
 
3096
 
3097
 
4131 efrain 3098
                $messages = [];
3099
                $form_messages = (array) $form->getMessages();
5937 anderson 3100
                foreach ($form_messages  as $fieldname => $field_messages) {
3101
 
4131 efrain 3102
                    $messages[$fieldname] = array_values($field_messages);
3103
                }
5937 anderson 3104
 
4131 efrain 3105
                return new JsonModel([
3106
                    'success'   => false,
3107
                    'data'   => $messages
3108
                ]);
3109
 
5937 anderson 3110
 
4131 efrain 3111
                return new JsonModel($response);
3112
            }
3113
        } else {
3114
            $response = [
3115
                'success' => false,
3116
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
3117
            ];
3118
        }
5937 anderson 3119
 
3120
        return new JsonModel($response);
4131 efrain 3121
    }
3122
 
3123
 
5937 anderson 3124
 
1 www 3125
    /**
3126
     *
3127
     * @param string $file
3128
     * @return boolean
3129
     */
3130
    private function validMimeType($file)
3131
    {
3132
        /*
3133
         * image/jpeg jpeg jpg jpe
3134
         * image/gif gif
3135
         * image/png png
3136
         * video/mp4
3137
         * audio/mpeg mpga mp2 mp2a mp3 m2a m3a
3138
         * video/x-flv flv
3139
         * application/msword doc dot
3140
         * application/vnd.openxmlformats-officedocument.wordprocessingml.document docx
3141
         * application/vnd.ms-excel xls xlm xla xlc xlt xlw
3142
         * application/vnd.openxmlformats-officedocument.spreadsheetml.sheet xlsx
3143
         * application/vnd.ms-powerpoint ppt pps pot
3144
         * application/vnd.openxmlformats-officedocument.presentationml.presentation pptx
3145
         * application/pdf pdf
3146
         */
3147
        $mime = mime_content_type($file);
3148
        $valid = false;
3149
        $types = [
3150
            'image/jpeg',
3151
            'image/gif',
3152
            'image/png',
3153
            'video/mp4',
3154
            'audio/mpeg',
3155
            'video/x-flv',
3156
            'application/msword',
3157
            'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
3158
            'application/vnd.ms-excel',
3159
            'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
3160
            'application/vnd.ms-powerpoint',
3161
            'application/vnd.openxmlformats-officedocument.presentationml.presentation',
3162
            'application/pdf'
3163
        ];
3164
        foreach ($types as $t) {
3165
            if (strpos($mime, $t) !== false) {
3166
                $valid = true;
3167
                break;
3168
            }
3169
        }
3170
        return $valid;
3171
    }
3172
 
3173
    /**
3174
     *
3175
     * @param string $text
3176
     * @return string
3177
     */
3178
    private function sanitize($text)
3179
    {
3180
        $text = htmlspecialchars($text, ENT_QUOTES);
3181
        $text = str_replace("\n\r", "\n", $text);
3182
        $text = str_replace("\r\n", "\n", $text);
3183
        $text = str_replace("\n", "<br>", $text);
3184
        return $text;
3185
    }
3186
 
3187
    /**
3188
     *
3189
     * @param string $timestamp
3086 efrain 3190
     * @param string $now
1 www 3191
     * @return string
3192
     */
3086 efrain 3193
    private function timeAgo($timestamp, $now = '')
1 www 3194
    {
5937 anderson 3195
 
3196
        if ($now) {
3197
            $datetime1 = \DateTime::createFromFormat('Y-m-d H:i:s', $now);
3086 efrain 3198
        } else {
3199
            $now = date('Y-m-d H:i:s');
3200
            $datetime1 = date_create($now);
3201
        }
1 www 3202
        $datetime2 = date_create($timestamp);
3086 efrain 3203
 
1 www 3204
        $diff = date_diff($datetime1, $datetime2);
3205
        $timemsg = '';
3206
        if ($diff->y > 0) {
2536 stevensc 3207
            $timemsg = $diff->y . ' año' . ($diff->y > 1 ? "s" : '');
1 www 3208
        } else if ($diff->m > 0) {
2536 stevensc 3209
            $timemsg = $diff->m . ' mes' . ($diff->m > 1 ? "es" : '');
1 www 3210
        } else if ($diff->d > 0) {
3211
            $timemsg = $diff->d . ' dia' . ($diff->d > 1 ? "s" : '');
3212
        } else if ($diff->h > 0) {
3213
            $timemsg = $diff->h . ' hora' . ($diff->h > 1 ? "s" : '');
3214
        } else if ($diff->i > 0) {
3215
            $timemsg = $diff->i . ' minuto' . ($diff->i > 1 ? "s" : '');
3216
        } else if ($diff->s > 0) {
3217
            $timemsg = $diff->s . ' segundo' . ($diff->s > 1 ? "s" : '');
3218
        }
3219
        if (!$timemsg) {
3220
            $timemsg = "Ahora";
3221
        } else {
3222
            $timemsg = $timemsg . '';
3223
        }
3224
        return $timemsg;
3225
    }
3226
 
3227
    /**
3228
     *
3229
     * @param string $timestamp
3086 efrain 3230
     * @param string $now
1 www 3231
     * @return boolean
3232
     */
3086 efrain 3233
    private function isInactiveConnection($timestamp, $now = '')
1 www 3234
    {
5937 anderson 3235
        if ($now) {
3086 efrain 3236
            $datetime1 = \DateTime::createFromFormat('Y-m-d H:i:s', $now);
3237
        } else {
3238
            $now = date('Y-m-d H:i:s');
3239
            $datetime1 = date_create($now);
3240
        }
5937 anderson 3241
 
3242
 
1 www 3243
        if (empty($timestamp)) {
3244
            return true;
3245
        }
3246
 
5937 anderson 3247
 
1 www 3248
        $datetime2 = date_create($timestamp);
3249
        $diff = date_diff($datetime1, $datetime2);
3250
 
3251
        if ($diff->y > 0 || $diff->m > 0 || $diff->d > 0 || $diff->h > 0 || $diff->i > 0) {
3252
            return true;
3253
        }
3254
 
3255
        return ($diff->s) > 15 ? true : false;
3256
    }
3257
}