Proyectos de Subversion LeadersLinked - Backend

Rev

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