Proyectos de Subversion LeadersLinked - Services

Rev

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