Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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