Proyectos de Subversion LeadersLinked - Services

Rev

| Ultima modificación | Ver Log |

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