Proyectos de Subversion LeadersLinked - Services

Rev

| Ultima modificación | Ver Log |

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