Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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