Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

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