Proyectos de Subversion LeadersLinked - Backend

Rev

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

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