Proyectos de Subversion LeadersLinked - Services

Rev

Rev 60 | Ir a la última revisión | | Ultima modificación | Ver Log |

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