Proyectos de Subversion LeadersLinked - Backend

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
13529 nelberth 1
<?php
2
/**
3
 *
4
 * Controlador: Mis Perfiles
5
 *
6
 */
7
declare(strict_types=1);
8
 
9
namespace LeadersLinked\Controller;
10
 
11
use Laminas\Db\Adapter\AdapterInterface;
12
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
13
use Laminas\Mvc\Controller\AbstractActionController;
14
use Laminas\Log\LoggerInterface;
15
use Laminas\View\Model\ViewModel;
16
 
17
use LeadersLinked\Library\Functions;
18
use LeadersLinked\Mapper\UserMapper;
19
 
20
use LeadersLinked\Model\User;
21
 
22
use LeadersLinked\Mapper\UserBlockedMapper;
23
 
24
use LeadersLinked\Mapper\CompanyMapper;
25
use LeadersLinked\Mapper\CompanyUserMapper;
26
use LeadersLinked\Mapper\ConversationMapper;
27
use LeadersLinked\Mapper\MessageMapper;
28
use LeadersLinked\Model\Conversation;
29
use LeadersLinked\Model\UserType;
30
use LeadersLinked\Library\Image;
31
use Laminas\View\Model\JsonModel;
32
use LeadersLinked\Form\CommunicationInMailSendForm;
33
use LeadersLinked\Model\Message;
34
use LeadersLinked\Model\VideoConvert;
35
use LeadersLinked\Mapper\VideoConvertMapper;
36
 
37
 
38
 
39
class InMailController extends AbstractActionController
40
{
41
    /**
42
     *
43
     * @var AdapterInterface
44
     */
45
    private $adapter;
46
 
47
 
48
    /**
49
     *
50
     * @var AbstractAdapter
51
     */
52
    private $cache;
53
 
54
    /**
55
     *
56
     * @var  LoggerInterface
57
     */
58
    private $logger;
59
 
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;
80
 
81
    }
82
 
83
    /**
84
     *
85
     * Generación del listado de conversationes
86
     *
87
     * [
88
     *  success: true,
89
     *  data:[
90
     *    [
91
     *       uuid: uuid con quien se tiene la conversación,
92
     *       name: nombre de con quien se tiene la conversacion,
93
     *       image: imagen de con quien se tiene la conversación,
94
     *       profile: url del profile con quien se tiene la conversación,
95
     *       last_message: fecha del ultimo mensaje,
96
     *       count_unread: cantidad de mensajes sin leer,
97
     *       messages_link: url para recuperar los mensajes,
98
     *       send_link: url para enviar el mensaje,
99
     *       selected: 0 = no seleccionado, 1 = seleccionado
100
     *     ]
101
     *  ]
102
     *
103
     *
104
     * @return \Laminas\View\Model\JsonModel
105
     */
106
    public function indexAction()
107
    {
108
        $request = $this->getRequest();
109
        if($request->isGet()) {
13568 nelberth 110
 
13561 nelberth 111
            $formAdd = new CommunicationInMailSendForm();
112
            $this->layout()->setTemplate('layout/layout-backend');
113
            $viewModel = new ViewModel();
114
            $viewModel->setTemplate('leaders-linked/in-mail/index.phtml');
115
            $viewModel->setVariables([
116
                'formAdd'    =>  $formAdd,
117
            ]);
118
            return $viewModel ;
13529 nelberth 119
 
13555 nelberth 120
        } else {
121
            return new JsonModel([
122
                'success' => false,
123
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
124
            ]);
125
        }
126
    }
127
 
128
 
129
    public function viewAction()
130
    {
131
        $request = $this->getRequest();
132
        if($request->isGet()) {
133
            $currentUserPlugin = $this->plugin('currentUserPlugin');
134
            $currentUser = $currentUserPlugin->getUser();
13562 nelberth 135
            $currentCompany = $currentUserPlugin->getCompany();
13555 nelberth 136
            $id = $this->params()->fromRoute('id');
137
 
138
            $headers  = $request->getHeaders();
139
 
140
            $isJson = false;
141
            if($headers->has('Accept')) {
142
                $accept = $headers->get('Accept');
143
 
144
                $prioritized = $accept->getPrioritized();
145
 
146
                foreach($prioritized as $key => $value) {
147
                    $raw = trim($value->getRaw());
148
 
149
                    if(!$isJson) {
150
                        $isJson = strpos($raw, 'json');
151
                    }
152
 
153
                }
154
            }
155
 
13529 nelberth 156
            if($isJson) {
13588 nelberth 157
 
13529 nelberth 158
 
159
                $userMapper = UserMapper::getInstance($this->adapter);
160
                $conversationMapper = ConversationMapper::getInstance($this->adapter);
161
                $messageMapper = MessageMapper::getInstance($this->adapter);
162
                $conversations = [];
13597 nelberth 163
 
164
                $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
165
                $ownerCompanyUser = $companyUserMapper->fetchOwnerByCompanyId($currentCompany->id);
166
                $owner = $userMapper->fetchOne($ownerCompanyUser->user_id);
13593 nelberth 167
                $selected_user_id = 0;
13591 nelberth 168
 
13529 nelberth 169
                $id = $this->params()->fromRoute('id');
13597 nelberth 170
 
13529 nelberth 171
                if($id) {
172
 
173
                    $companyMapper = CompanyMapper::getInstance($this->adapter);
174
                    $company = $companyMapper->fetchOneByUuid($id);
175
                    if($company) {
176
 
177
                        $companyUser = $companyUserMapper->fetchOwnerByCompanyId($company->id);
178
 
179
                        $user  = $userMapper->fetchOne($companyUser->user_id);
180
 
181
 
182
                        $selected_user_id = $user->user_id;
13597 nelberth 183
                        $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($owner->id, $user->id);
13529 nelberth 184
 
185
 
186
                        $timeElapsedString = '';
187
                        if($conversation) {
13597 nelberth 188
                            $unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($conversation->id, $owner->id);
189
                            $lastMessage = $messageMapper->fetchLastUnreadMessagesByConversationIdAndReceiverId($conversation->id, $owner->id);
13529 nelberth 190
 
191
                            if($lastMessage) {
192
                                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $lastMessage);
193
                                if($dt) {
194
                                    $timeElapsedString = Functions::timeElapsedString( $dt->getTimestamp() );
195
                                }
196
                            }
197
                        } else {
198
                            $unread = 0;
199
 
200
                        }
201
 
202
                        array_push($conversations, [
203
                            'uuid' => $company->uuid,
204
                            'name' => $company->name,
205
                            'image' => $this->url()->fromRoute('storage', ['type' => 'company', 'code' => $company->uuid, 'filename' => $company->image]),
206
                            //'profile' => $this->url()->fromRoute('company/view', ['id' => $company->uuid ] ),
207
                            'last_message' => $timeElapsedString,
208
                            'count_unread' => intval($unread),
13596 nelberth 209
                            'messages_link' => $this->url()->fromRoute('inmail/view/message', ['id' => $user->uuid]),
210
                            //'send_link' => $this->url()->fromRoute('inmail/view/message/send', ['id' => $user->uuid]),
13529 nelberth 211
                            'selected' => 1,
212
                        ]);
213
                    } else {
214
                        $user = $userMapper->fetchOneByUuid($id);
215
                        if($user) {
216
 
217
                            $timeElapsedString = '';
218
 
219
                            $selected_user_id = $user->id;
13597 nelberth 220
                            $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($owner->id, $user->id);
13529 nelberth 221
                            if($conversation) {
13597 nelberth 222
                                $unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($conversation->id, $owner->id);
223
                                $lastMessage = $messageMapper->fetchLastUnreadMessagesByConversationIdAndReceiverId($conversation->id, $owner->id);
13529 nelberth 224
                                if($lastMessage) {
225
                                    $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $lastMessage);
226
                                    if($dt) {
227
                                        $timeElapsedString = Functions::timeElapsedString( $dt->getTimestamp() );
228
                                    }
229
                                }
230
 
231
 
232
                            } else {
233
                                $unread = 0;
234
                            }
235
 
236
 
237
                            array_push($conversations, [
238
                                'uuid' => $user->uuid,
239
                                'name' => trim($user->first_name . ' ' . $user->last_name),
240
                                'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]),
241
                                //'profile' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
242
                                'last_message' => $timeElapsedString,
243
                                'count_unread' => intval($unread),
13596 nelberth 244
                                'messages_link' => $this->url()->fromRoute('inmail/view/message', ['id' => $user->uuid]),
245
                                //'send_link' => $this->url()->fromRoute('inmail/view/message/send', ['id' => $user->uuid]),
13529 nelberth 246
                                'selected' => 1,
247
                            ]);
248
                        }
249
                    }
250
                }
251
 
13592 nelberth 252
 
13597 nelberth 253
                $records = $conversationMapper->fetchAllByUserId($owner->id);
13529 nelberth 254
                foreach($records as $record)
255
                {
256
                    if($selected_user_id) {
13597 nelberth 257
                        if($record->sender_id == $owner->id && $record->receiver_id == $selected_user_id) {
13529 nelberth 258
                            continue;
259
                        }
13597 nelberth 260
                        if($record->receiver_id == $owner->id && $record->sender_id == $selected_user_id) {
13529 nelberth 261
                            continue;
262
                        }
263
 
264
                    }
13587 nelberth 265
 
13597 nelberth 266
                    if($record->sender_id == $owner->id) {
13529 nelberth 267
                        $user = $userMapper->fetchOne($record->receiver_id);
268
                    }
13597 nelberth 269
                    if($record->receiver_id == $owner->id) {
13529 nelberth 270
                        $user = $userMapper->fetchOne($record->sender_id);
271
                    }
13594 nelberth 272
 
13529 nelberth 273
                    $timeElapsedString = '';
13597 nelberth 274
                    $unread = $messageMapper->fetchCountUnreadMessagesByConversationIdAndReceiverId($record->id, $owner->id);
275
                    $lastMessage = $messageMapper->fetchLastMessagesByConversationIdAndReceiverId($record->id, $owner->id);
13529 nelberth 276
 
277
 
278
                    if($lastMessage) {
279
                        $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $lastMessage);
280
                        if($dt) {
281
                            $timeElapsedString =  Functions::timeElapsedString( $dt->getTimestamp() );
282
                        }
13596 nelberth 283
                    }
13529 nelberth 284
 
285
                    array_push($conversations, [
286
                        'uuid' => $user->uuid,
287
                        'name' => trim($user->first_name . ' ' . $user->last_name),
13613 nelberth 288
                        'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]),
13529 nelberth 289
                        //'profile' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
290
                        'last_message' => $timeElapsedString,
291
                        'count_unread' => intval($unread),
13596 nelberth 292
                        'messages_link' => $this->url()->fromRoute('inmail/view/message', ['id' => $user->uuid]),
13529 nelberth 293
                        'selected' => 0,
294
                    ]);
295
                }
296
 
297
 
298
                usort($conversations, function($a, $b) {
299
                    if ($a['selected'] == $b['selected']) {
300
                        if($a['last_message'] == $b['last_message']) {
301
                            return 0;
302
                        } else {
303
                            return $a['last_message'] < $b['last_message'] ? -1 : 1;
304
                        }
305
                    } else {
306
                        return $a['selected'] < $b['selected'] ? -1 : 1;
307
                    }
308
                });
309
 
310
 
311
                return new JsonModel([
312
                    'success' => true,
313
                    'data' => $conversations
314
                ]);
315
 
13587 nelberth 316
            }  else {
13529 nelberth 317
 
13555 nelberth 318
                return new JsonModel([
319
                    'success' => false,
320
                    'data' => 'ERROR_METHOD_NOT_ALLOWED'
13529 nelberth 321
                ]);
322
            }
323
        } else {
324
            return new JsonModel([
325
                'success' => false,
326
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
327
            ]);
328
        }
329
    }
13555 nelberth 330
 
13529 nelberth 331
 
332
    /**
333
     * Esta función remueve el usuario del grupo
334
     * Es una petición GET el url recuperado en /inmail
13596 nelberth 335
     * [ruta del servidor]/inmail/view/[uuid]/view/message
13529 nelberth 336
     * retorna un json en caso de ser  positivo
337
     * [
338
     *   success: true,
339
     *      data: [
340
     *          [
341
     *              sender_name: nombre de quien que envia el mensaje,
342
     *              sender_image: imagen de quien que recibe el mensaje,
343
     *              sender_profile: url de profile de quien que envia el mensaje,
344
     *              receiver_name: nombre de quien que recibe el mensaje,
345
     *              receiver_image: url de la imagen de quien  que recibe el mensaje,
346
     *              receiver_profile: url del profile de quien recibe el mensaje,
347
     *              side: left/righ de que lado de la pantalla se mostrara,
348
     *              message: texto del mensaje,
349
     *              type: text|image|video|document,
350
     *              filename: url del archivo enviado,
351
     *              date: cadena que describe hace cuanto se recibio el mensaje
352
     *          ]
353
     *      ]
354
     *   ]
355
     * En caso de ser negativo puede haber 2 formatos
356
     * [
357
     *  'success' : false,
358
     *  'data' : mensaje de error
359
     * ]
360
     * @return \Laminas\View\Model\JsonModel
361
     */
362
    public function messageAction()
363
    {
364
 
365
        $request = $this->getRequest();
366
        if($request->isGet()) {
367
 
368
            $page = intval($this->params()->fromQuery('page', 0), 10);
369
 
370
            $currentUserPlugin = $this->plugin('currentUserPlugin');
371
            $currentUser = $currentUserPlugin->getUser();
13610 nelberth 372
            $currentCompany = $currentUserPlugin->getCompany();
13611 nelberth 373
 
13529 nelberth 374
            $userMapper = UserMapper::getInstance($this->adapter);
375
            $conversationMapper = ConversationMapper::getInstance($this->adapter);
376
 
377
            $messageMapper = MessageMapper::getInstance($this->adapter);
378
 
379
            $id = $this->params()->fromRoute('id');
380
            if(!$id) {
381
                return new JsonModel([
382
                    'success' => false,
383
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
384
                ]);
385
            }
386
 
387
            $user = $userMapper->fetchOneByUuid($id);
388
            if(!$user) {
389
                return new JsonModel([
390
                    'success' => false,
391
                    'data' => 'ERROR_REQUEST_IS_INVALID'
392
                ]);
393
            }
394
 
13609 nelberth 395
            $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
396
            $ownerCompanyUser = $companyUserMapper->fetchOwnerByCompanyId($currentCompany->id);
397
 
398
 
399
            $owner = $userMapper->fetchOne($ownerCompanyUser->user_id);
400
 
401
 
13529 nelberth 402
            $conversationMapper = ConversationMapper::getInstance($this->adapter);
13597 nelberth 403
            $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($owner->id, $user->id);
13529 nelberth 404
 
405
 
406
            $messages = [];
407
            if($conversation) {
408
                $records = $messageMapper->getAllMessagesPaginatorByConversationId($conversation->id, $page);
409
                foreach($records as $record) {
410
                    $timeElapsedString = '';
411
 
412
                    $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);
413
                    if($dt) {
414
                        $timeElapsedString = Functions::timeElapsedString( $dt->getTimestamp() );
415
                    }
416
 
417
 
13597 nelberth 418
                    if($record->sender_id == $owner->id) {
13529 nelberth 419
                        array_push($messages, [
13597 nelberth 420
                            'sender_name' => trim($owner->first_name . ' ' . $owner->last_name),
13616 nelberth 421
                            'sender_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $owner->image, 'code' => $owner->uuid]),
13529 nelberth 422
 
13597 nelberth 423
                            //'sender_profile' => $this->url()->fromRoute('profile/view', ['id' => $owner->uuid]),
13529 nelberth 424
                            'receiver_name' => trim($user->first_name . ' ' . $user->last_name),
425
                            'receiver_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $user->image, 'code' => $user->uuid]),
426
                            //'receiver_profile' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
427
 
428
                            'side' => 'left',
429
                            'message' => $record->message,
430
                            'type' => $record->type,
431
                            'filename'=> $record->filename!=null?$this->url()->fromRoute('storage', ['type' => 'message', 'filename' => $record->filename, 'code' => $record->uuid]):'',
432
 
433
                            //'filename' => $record->filename,
434
                            'date' => $timeElapsedString
435
                        ]);
436
                    } else {
437
                        array_push($messages, [
438
                            'sender_name' => trim($user->first_name . ' ' . $user->last_name),
439
                            'sender_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $user->image, 'code' => $user->uuid]),
440
 
441
                            //'sender_profile' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
13597 nelberth 442
                            'receiver_name' => trim($owner->first_name . ' ' . $owner->last_name),
13614 nelberth 443
                            'receiver_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $owner->image, 'code' => $owner->uuid]),
13597 nelberth 444
                            //'receiver_profile' => $this->url()->fromRoute('profile/view', ['id' => $owner->uuid]),
13529 nelberth 445
 
446
                            'side' => 'right',
447
                            'message' => $record->message,
448
                            'type' => $record->type,
449
                            'filename'=> $record->filename!=null?$this->url()->fromRoute('storage', ['type' => 'message', 'filename' => $record->filename, 'code' => $record->uuid]):'',
450
 
451
                            'date' => $timeElapsedString
452
                        ]);
453
 
454
                        $messageMapper->markAsRead($record->id);
455
                    }
456
                }
457
                return new JsonModel([
458
                    'success' => true,
459
                    'data' => $messages,
460
                    'receiver'=>[
461
                        'name' => trim($user->first_name . ' ' . $user->last_name),
462
                        'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $user->image, 'code' => $user->uuid]),
463
                    ],
13596 nelberth 464
                    'send_link' => $this->url()->fromRoute('inmail/view/message/send', ['id' => $user->uuid]),
13529 nelberth 465
                    'pagination' => $records->getPages()
466
                ]);
467
            }else{
468
                return new JsonModel([
469
                    'success' => true,
470
                    'data' => $messages,
471
                    'receiver'=>[
472
                        'name' => trim($user->first_name . ' ' . $user->last_name),
473
                        'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $user->image, 'code' => $user->uuid]),
474
                    ],
13596 nelberth 475
                    'send_link' => $this->url()->fromRoute('inmail/view/message/send', ['id' => $user->uuid]),
13529 nelberth 476
                    'pagination' => 0
477
                ]);
478
            }
479
 
480
 
481
            return new JsonModel([
482
                'success' => false,
483
                'data' => $messages
484
            ]);
485
 
486
 
487
 
488
 
489
        } else {
490
            return new JsonModel([
491
                'success' => false,
492
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
493
            ]);
494
        }
495
    }
496
 
497
    /**
498
     * Esta función envia un mensaje
499
     * Es una petición POST el url recuperado en /inmail
13596 nelberth 500
     * [ruta del servidor]/inmail/view/[uidd del usuario]/view/message/send
13529 nelberth 501
     * Lo párametros son
502
     * message: text plain requerido
503
     * file: no requerido puede jpg, png, jpeg, mp3, mp4, webm o pdf
504
     * o
13596 nelberth 505
     * [ruta del servidor]/inmail/view/[uidd del usuario]/view/message/send/encoding/base64 para el caso de react-native
13529 nelberth 506
     * Los párametros son
507
     * message: text plain requerido
508
     * fileBase64Name: nombre del archivo  que se envia en base64 solo requerido si se envia un archivo
509
     * fileBase64Content: contenido en base 64 del archivo
510
     *
511
     * retorna un json en caso de ser  positivo
512
     * [
513
     *   success: true,
514
     *      data:{
515
     *          sender_name: nombre de quien que envia el mensaje,
516
     *          sender_image: imagen de quien que recibe el mensaje,
517
     *          sender_profile: url de profile de quien que envia el mensaje,
518
     *          receiver_name: nombre de quien que recibe el mensaje,
519
     *          receiver_image: url de la imagen de quien  que recibe el mensaje,
520
     *          receiver_profile: url del profile de quien recibe el mensaje,
521
     *          side: left/righ de que lado de la pantalla se mostrara,
522
     *          message: texto del mensaje,
523
     *          type: text|image|video|document,
524
     *          filename: url del archivo enviado,
525
     *          date: cadena que describe hace cuanto se recibio el mensaje
526
     *      ]
527
     *   ]
528
     * En caso de ser negativo puede haber 2 formatos
529
     * [
530
     *  'success' : false,
531
     *  'data' : mensaje de error
532
     * ]
533
     * @return \Laminas\View\Model\JsonModel
534
     */
535
    public function sendMessageAction()
536
    {
537
        $request = $this->getRequest();
538
        if($request->isPost()) {
539
 
540
 
541
            $currentUserPlugin = $this->plugin('currentUserPlugin');
542
            $currentUser = $currentUserPlugin->getUser();
13610 nelberth 543
            $currentCompany = $currentUserPlugin->getCompany();
544
 
13529 nelberth 545
            $userMapper = UserMapper::getInstance($this->adapter);
546
 
547
            $id = $this->params()->fromRoute('id');
548
            if(!$id) {
549
                return new JsonModel([
550
                    'success' => false,
551
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
552
                ]);
553
            }
554
 
555
 
556
            $user = $userMapper->fetchOneByUuid($id);
557
            if(!$user) {
558
                return new JsonModel([
559
                    'success' => false,
560
                    'data' => 'ERROR_REQUEST_IS_INVALID'
561
                ]);
562
            }
563
 
564
 
565
            $data = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
566
 
567
            $form = new CommunicationInMailSendForm();
568
            $form->setData($data);
569
 
570
            if($form->isValid()) {
13611 nelberth 571
 
572
 
573
                $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
574
                $ownerCompanyUser = $companyUserMapper->fetchOwnerByCompanyId($currentCompany->id);
575
 
576
 
577
                $owner = $userMapper->fetchOne($ownerCompanyUser->user_id);
13529 nelberth 578
 
579
                $conversationMapper = ConversationMapper::getInstance($this->adapter);
13597 nelberth 580
                $conversation = $conversationMapper->fetchOneByUserId1AndUserId2($owner->id, $user->id);
13529 nelberth 581
 
582
                if($conversation) {
583
                    $conversation->receiver_status = Conversation::STATUS_NORMAL;
584
                    $conversation->sender_status = Conversation::STATUS_NORMAL;
585
 
586
                    if(!$conversationMapper->update($conversation)) {
587
                        return new JsonModel([
588
                            'success'  => false,
589
                            'data' => $conversationMapper->getError()
590
                        ]);
591
                    }
592
 
593
                } else {
594
                    $conversation = new Conversation();
13597 nelberth 595
                    $conversation->sender_id = $owner->id;
13529 nelberth 596
                    $conversation->sender_status = Conversation::STATUS_NORMAL;
597
                    $conversation->receiver_id = $user->id;
598
                    $conversation->receiver_status = Conversation::STATUS_NORMAL;
599
 
600
                    if(!$conversationMapper->insert($conversation)) {
601
                        return new JsonModel([
602
                            'success'  => false,
603
                            'data' => $conversationMapper->getError()
604
                        ]);
605
                    }
606
 
607
                }
608
                $files = $this->getRequest()->getFiles()->toArray();
609
                $type = Message::TYPE_TEXT;
610
 
611
 
612
 
613
                $encoding = $this->params()->fromRoute('encoding');
614
                if($encoding == 'base64') {
615
 
616
 
617
                    $fileBase64Name = $this->params()->fromPost('file_base64_name');
618
                    $fileBase64Content = $this->params()->fromPost('file_base64_content');
619
 
620
 
621
                    if($fileBase64Name && $fileBase64Content) {
622
 
623
                        try {
624
 
625
                            $fileBase64Content = base64_decode($fileBase64Content);
626
                            if($fileBase64Content) {
627
 
628
                                $message_filename      = $this->normalizeString($fileBase64Name);
629
                                $message_tmp_filename = 'data' . DIRECTORY_SEPARATOR . 'tmp';
630
                                if(!file_exists($message_tmp_filename)) {
631
                                    mkdir($message_tmp_filename, 0755, true);
632
                                }
633
 
634
                                $message_tmp_filename = 'data' . DIRECTORY_SEPARATOR . 'tmp' . DIRECTORY_SEPARATOR . $message_filename;
635
                                file_put_contents($message_tmp_filename, $fileBase64Content);
636
 
637
 
638
 
639
                                $mime_type = mime_content_type($message_tmp_filename);
640
                                //echo '$mime_type = '. $mime_type; exit;
641
 
642
 
643
                                if($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {
644
                                    $type = Message::TYPE_IMAGE;
645
                                } else if($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {
646
                                    $type = Message::FILE_TYPE_VIDEO;
647
                                } else if($mime_type == 'application/pdf') {
648
                                    $type = Message::FILE_TYPE_DOCUMENT;
649
                                }
650
 
651
                            }
652
                        } catch(\Exception $e) {
653
 
654
                        }
655
                    }
656
 
657
                } else {
658
 
659
                    if(isset($files['file']) && empty($files['file']['error'])) {
660
                        $message_tmp_filename  = $files['file']['tmp_name'];
661
                        $message_filename      = $this->normalizeString($files['file']['name']);
662
 
663
                        $mime_type = mime_content_type($message_tmp_filename);
664
 
665
 
666
                        if($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {
667
                            $type = Message::TYPE_IMAGE;
668
                        } else if($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {
669
                            $type = Message::TYPE_VIDEO;
670
                        } else if($mime_type == 'application/pdf') {
671
                            $type = Message::TYPE_DOCUMENT;
672
                        }
673
                    }
674
                }
675
 
676
 
677
 
678
                $message = new Message();
679
                $message->conversation_id = $conversation->id;
680
                $message->read = Message::NO;
681
                $message->message = $form->get('message')->getValue();
682
                $message->receiver_id = $user->id;
683
                $message->receiver_status = Message::STATUS_NORMAL;
13597 nelberth 684
                $message->sender_id = $owner->id;
13529 nelberth 685
                $message->sender_status = Message::STATUS_NORMAL;
686
                $message->type = $type;
687
 
688
 
689
 
690
                $messageMapper = MessageMapper::getInstance($this->adapter);
691
                if($messageMapper->insert($message)) {
692
 
693
                    $message = $messageMapper->fetchOne($message->id);
694
 
695
 
696
                    if( $type == Message::TYPE_DOCUMENT) {
697
                        try {
698
                            $target_path = $this->config['leaderslinked.fullpath.message'] . $message->uuid;
699
                            if(!file_exists($target_path)) {
700
                                mkdir($target_path, 0755);
701
                            }
702
 
703
                            $full_filename = $target_path  . DIRECTORY_SEPARATOR .$message_filename;
704
 
705
                            if($encoding == 'base64') {
706
                                $resultMoveOrRename = rename($message_tmp_filename , $full_filename);
707
                            } else {
708
                                $resultMoveOrRename = move_uploaded_file($message_tmp_filename , $full_filename);
709
                            }
710
 
711
                            if($resultMoveOrRename) {
712
 
713
                                $message->type = $type;
714
                                $message->filename = basename($message_filename);
715
                                $messageMapper->update($message);
716
                            } else {
717
                                error_log('no se pudo mover o renombrar el documento : ' . $message_tmp_filename . ' al directorio : ' . $full_filename );
718
                            }
719
                        } catch(\Throwable $e) {
720
                            error_log($e->getTraceAsString());
721
                        }
722
                    }
723
                    if( $type == Message::TYPE_IMAGE) {
724
                        try {
725
                            $target_path = $this->config['leaderslinked.fullpath.message'] . $message->uuid;
726
                            if(!file_exists($target_path)) {
727
                                mkdir($target_path, 0755);
728
                            }
729
 
730
                            list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.message_image_size']);
731
 
732
                            $message_filename = substr($message_filename, 0, strrpos($message_filename, '.'))  . '.png';
733
                            $crop_to_dimensions = false;
734
                            if(Image::uploadImage($message_tmp_filename, $target_path, $message_filename, $target_width, $target_height, $crop_to_dimensions )) {
735
                                $message->type = $type;
736
                                $message->filename = basename($message_filename);
737
                                $messageMapper->update($message);
738
                            }
739
                        } catch(\Throwable $e) {
740
                            error_log($e->getTraceAsString());
741
                        }
742
                    }
743
                    if( $type == Message::TYPE_VIDEO) {
744
                        try {
745
                            $target_path = $this->config['leaderslinked.fullpath.message'] . $message->uuid;
746
                            if(!file_exists($target_path)) {
747
                                mkdir($target_path, 0755);
748
                            }
749
 
750
                            $full_filename = $target_path  . DIRECTORY_SEPARATOR . $message_filename;
751
 
752
                            if($encoding == 'base64') {
753
                                $resultMoveOrRename = rename($message_tmp_filename , $full_filename);
754
                            } else {
755
                                $resultMoveOrRename = move_uploaded_file($message_tmp_filename , $full_filename);
756
                            }
757
 
758
                            if($resultMoveOrRename) {
759
 
760
                                $size = $this->config['leaderslinked.image_sizes.message_image_size'];
761
                                $getFromSecound = 2;
762
 
763
                                //extracción del cover
764
                                $generateFileName = substr($message_filename, 0, strrpos($message_filename, '.'));
765
                                $generateFile =  $target_path  . DIRECTORY_SEPARATOR . $generateFileName .  '.png';
766
                                $cmd            = "/usr/bin/ffmpeg -i $full_filename -an -ss $getFromSecound -s $size $generateFile";
767
                                exec($cmd);
768
 
769
 
770
                                $message->type = $type;
771
                                $message->filename = basename($message_filename);
772
                                $message->image_preview = basename($generateFile);
773
                                $messageMapper->update($message);
774
 
775
                                $videoConvert = new VideoConvert();
776
                                $videoConvert->filename = $full_filename;
777
                                $videoConvert->type = VideoConvert::TYPE_FEED;
778
 
779
                                $videoConvertMapper = VideoConvertMapper::getInstance($this->adapter);
780
                                $videoConvertMapper->insert($videoConvert);
781
                            } else {
782
                                error_log('no se pudo mover o renombrar el documento : ' . $message_tmp_filename . ' al directorio : ' . $full_filename );
783
                            }
784
                        } catch(\Throwable $e) {
785
                            error_log($e->getTraceAsString());
786
                        }
787
                    }
788
 
789
                    $message = $messageMapper->fetchOne($message->id);
790
 
791
                    if($message->filename) {
792
 
793
 
794
                        $filename = $this->url()->fromRoute('storage', ['type' => 'message', 'filename' => $message->filename, 'code' => $message->uuid]);
795
 
796
                    } else {
797
                        $filename = '';
798
                    }
799
 
800
                    $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $message->added_on);
801
 
802
 
803
                    return new JsonModel([
804
                        'success'   => true,
805
                        'data'   => [
13597 nelberth 806
                            'sender_name' => trim($owner->first_name . ' ' . $owner->last_name),
807
                            'sender_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $owner->image, 'code' => $owner->uuid]),
808
                            //'sender_profile' => $this->url()->fromRoute('profile/view', ['id' => $owner->uuid]),
13529 nelberth 809
                            'receiver_name' => trim($user->first_name . ' ' . $user->last_name),
810
                            'receiver_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $user->image, 'code' => $user->uuid]),
811
                            //'receiver_profile' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
812
                            'side' => 'left',
813
                            'message' => $message->message,
814
                            'type' => $message->type,
815
                            'filename' =>$filename,
816
                            'date' => Functions::timeElapsedString($dt->getTimestamp())
817
                        ]
818
                    ]);
819
 
820
 
821
 
822
                } else {
823
                    return new JsonModel([
824
                        'success'   => false,
825
                        'data'   => $messageMapper->getError()
826
                    ]);
827
                }
828
 
829
 
830
 
831
 
832
 
833
            } else {
834
 
835
 
836
                $messages = [];
837
                $form_messages = (array) $form->getMessages();
838
                foreach($form_messages  as $fieldname => $field_messages)
839
                {
840
                    $messages[$fieldname] = array_values($field_messages);
841
                }
842
 
843
                return new JsonModel([
844
                    'success'   => false,
845
                    'data'   => $messages
846
                ]);
847
            }
848
 
849
 
850
 
851
        } else {
852
            return new JsonModel([
853
                'success' => false,
854
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
855
            ]);
856
        }
857
 
858
    }
859
 
860
    public function searchPeopleAction()
861
    {
862
        $request = $this->getRequest();
13540 nelberth 863
 
13529 nelberth 864
        if($request->isGet()) {
865
 
866
 
13601 nelberth 867
 
868
            $currentUserPlugin = $this->plugin('currentUserPlugin');
869
            $currentUser = $currentUserPlugin->getUser();
870
            $currentCompany = $currentUserPlugin->getCompany();
13608 nelberth 871
 
13605 nelberth 872
            $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
13606 nelberth 873
            $ownerCompanyUser = $companyUserMapper->fetchOwnerByCompanyId($currentCompany->id);
13607 nelberth 874
 
13608 nelberth 875
            $userMapper = UserMapper::getInstance($this->adapter);
876
            $owner = $userMapper->fetchOne($ownerCompanyUser->user_id);
877
 
13607 nelberth 878
 
13529 nelberth 879
            $search = trim(filter_var( $this->params()->fromQuery('search'), FILTER_SANITIZE_STRING)) ;
880
            if(strlen($search) >= 3) {
881
 
882
 
883
                $userMapper = UserMapper::getInstance($this->adapter);
884
                $records  = $userMapper->fetchAllSuggest($search);
885
 
886
                $users = [];
887
                foreach($records as $record)
888
                {
13597 nelberth 889
                    if($owner->id == $record->id) {
13529 nelberth 890
                        continue;
891
                    }
892
 
893
 
894
                    array_push($users, [
13557 nelberth 895
                        'user_link' => $this->url()->fromRoute('inmail/view', ['id' => $record->uuid]),
13529 nelberth 896
                        'name' => trim($record->first_name . ' ' . $record->last_name),
897
                        'email' => $record->email,
898
                        'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'filename' => $record->image, 'code' => $record->uuid]),
899
                    ]);
900
                }
901
 
902
                return new JsonModel([
903
                    'success' => true,
904
                    'data' => $users
905
                ]);
906
 
907
 
908
 
909
 
910
            } else {
911
                return new JsonModel([
912
                    'success' => true,
913
                    'data' => [
914
 
915
                    ]
916
                ]);
917
            }
918
 
919
 
920
 
921
 
922
        } else {
923
            return new JsonModel([
924
                'success' => false,
925
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
926
            ]);
927
        }
928
    }
929
 
930
    private function normalizeString ($str = '')
931
    {
932
        $basename  = substr($str, 0, strrpos($str, '.'));
933
        $basename  = str_replace('.', '-', $basename);
934
 
935
        $extension  = substr($str, strrpos($str, '.'));
936
 
937
        $str = $basename . $extension;
938
 
939
        $str = strip_tags($str);
940
        $str = preg_replace('/[\r\n\t ]+/', ' ', $str);
941
        $str = preg_replace('/[\"\*\/\:\<\>\?\'\|\,]+/', ' ', $str);
942
        $str = strtolower($str);
943
        $str = html_entity_decode( $str, ENT_QUOTES, "utf-8" );
944
        $str = htmlentities($str, ENT_QUOTES, "utf-8");
945
        $str = preg_replace("/(&)([a-z])([a-z]+;)/i", '$2', $str);
946
        $str = str_replace(' ', '-', $str);
947
        $str = rawurlencode($str);
948
        $str = str_replace('%', '-', $str);
949
        return trim(strtolower($str));
950
    }
951
 
952
}