Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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