Proyectos de Subversion LeadersLinked - Backend

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
10273 eleazar 1
<?php
11317 eleazar 2
declare(strict_types=1);
10273 eleazar 3
 
11317 eleazar 4
namespace LeadersLinked\Controller;
10273 eleazar 5
 
11985 eleazar 6
 
11317 eleazar 7
use Laminas\Db\Adapter\AdapterInterface;
8
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
9
use Laminas\Mvc\Controller\AbstractActionController;
11985 eleazar 10
use Laminas\Log\LoggerInterface;
11
use Laminas\View\Model\ViewModel;
12
use Laminas\View\Model\JsonModel;
13
 
14
use LeadersLinked\Mapper\CompanyMapper;
15
use LeadersLinked\Mapper\CompanyUserMapper;
16
use LeadersLinked\Form\CreateFeedForm;
11798 eleazar 17
use LeadersLinked\Form\CommentForm;
18
use LeadersLinked\Form\CommentAnswerForm;
19
use LeadersLinked\Model\Comment;
20
use LeadersLinked\Mapper\CommentMapper;
21
use LeadersLinked\Mapper\FeedMapper;
22
use LeadersLinked\Mapper\GroupMapper;
11985 eleazar 23
use LeadersLinked\Model\Feed;
24
use LeadersLinked\Mapper\QueryMapper;
11317 eleazar 25
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
11795 eleazar 26
use LeadersLinked\Library\Image;
27
use LeadersLinked\Model\VideoConvert;
28
use LeadersLinked\Mapper\VideoConvertMapper;
29
use LeadersLinked\Mapper\LikeMapper;
30
use Laminas\Paginator\Adapter\DbSelect;
31
use Laminas\Paginator\Paginator;
32
use LeadersLinked\Mapper\UserMapper;
33
use LeadersLinked\Library\Functions;
34
use LeadersLinked\Model\Company;
35
use LeadersLinked\Model\UserType;
11985 eleazar 36
use Laminas\Authentication\AuthenticationService;
37
use Laminas\Authentication\Result as AuthResult;
38
use Laminas\Mvc\I18n\Translator;
39
use LeadersLinked\Mapper\MyTrainerQuestionsMapper;
40
use LeadersLinked\Mapper\FeedTopicMapper;
12376 eleazar 41
use LeadersLinked\Mapper\TopicMapper;
11985 eleazar 42
use LeadersLinked\Form\MyTrainerQuestionForm;
43
use LeadersLinked\Model\MyTrainerQuestions;
10601 eleazar 44
 
11709 eleazar 45
use LeadersLinked\Model\FeedTopic;
11317 eleazar 46
use LeadersLinked\Form\TopicForm;
14740 efrain 47
use LeadersLinked\Mapper\UtilMapper;
10601 eleazar 48
 
11317 eleazar 49
class MyTrainerAnswerController extends AbstractActionController
50
{
51
    /**
52
     *
53
     * @var AdapterInterface
54
     */
55
    private $adapter;
56
 
57
 
58
    /**
59
     *
60
     * @var AbstractAdapter
61
     */
62
    private $cache;
63
 
64
    /**
65
     *
66
     * @var  LoggerInterface
67
     */
68
    private $logger;
69
 
70
    /**
71
     *
72
     * @var array
73
     */
74
    private $config;
75
 
76
 
77
 
78
    /**
79
     *
80
     * @param AdapterInterface $adapter
81
     * @param AbstractAdapter $cache
82
     * @param LoggerInterface $logger
83
     * @param array $config
84
     */
85
    public function __construct($adapter, $cache , $logger, $config)
86
    {
87
        $this->adapter      = $adapter;
88
        $this->cache        = $cache;
89
        $this->logger       = $logger;
90
        $this->config       = $config;
91
 
92
 
10273 eleazar 93
    }
10601 eleazar 94
 
11873 eleazar 95
    public function indexAction()
96
    {
97
        $currentUserPlugin = $this->plugin('currentUserPlugin');
98
        $currentUser = $currentUserPlugin->getUser();
99
        $currentCompany = $currentUserPlugin->getCompany();
11882 eleazar 100
        $id =  $this->params()->fromRoute('id');
12603 eleazar 101
 
11982 eleazar 102
        $feedMapper = FeedMapper::getInstance($this->adapter);
103
        $title  = $feedMapper->fetchOneByUuid($id);
12621 eleazar 104
 
11837 eleazar 105
        $request = $this->getRequest();
11873 eleazar 106
        if($request->isGet()) {
107
            $headers  = $request->getHeaders();
108
 
109
            $isJson = false;
110
            if($headers->has('Accept')) {
111
                $accept = $headers->get('Accept');
112
 
113
                $prioritized = $accept->getPrioritized();
114
 
115
                foreach($prioritized as $key => $value) {
116
                    $raw = trim($value->getRaw());
117
 
118
                    if(!$isJson) {
119
                        $isJson = strpos($raw, 'json');
120
                    }
12707 eleazar 121
 
11873 eleazar 122
                }
123
            }
12471 eleazar 124
 
125
            $form = new CreateFeedForm($this->adapter);
12794 eleazar 126
 
127
            $tagsMapper = TopicMapper::getInstance($this->adapter);
12470 eleazar 128
            $topicsMapper = FeedTopicMapper::getInstance($this->adapter);
12590 eleazar 129
            $feedTopic = $topicsMapper->fetchOneByFeedId($title->id);
12816 eleazar 130
            $answer = $feedMapper->fetchAllByMytAnswer($title->related_feed);
12707 eleazar 131
            $topicRelationships = $topicsMapper->fetchAllByTopicId($feedTopic->topic_id);
12794 eleazar 132
            $tags = $topicsMapper->fetchAllByFeedId($title->id);
12707 eleazar 133
                foreach ($topicRelationships as $rel) {
134
 
12708 eleazar 135
                    if ($question = $feedMapper->fetchOne($rel->feed_id)) {
12707 eleazar 136
                        $questions [] = $question;
137
                    }
12580 eleazar 138
                }
12794 eleazar 139
 
140
                foreach($tags as $tel){
12796 eleazar 141
                    $badge = $tagsMapper->fetchOne($tel->topic_id);
12794 eleazar 142
                    $badges [] = $badge;
143
                }
12798 eleazar 144
 
12819 eleazar 145
 
11873 eleazar 146
            $this->layout()->setTemplate('layout/layout-backend');
147
            $viewModel = new ViewModel();
11877 eleazar 148
            $viewModel->setTemplate('leaders-linked/my-trainer-answer/index.phtml');
11873 eleazar 149
            $viewModel->setVariables([
11878 eleazar 150
                'form'      => $form,
11882 eleazar 151
                'id'        => $id,
11982 eleazar 152
                'title_title' => $title->title,
153
                'title_description' => $title->description,
12520 eleazar 154
                'questions' => $questions,
12798 eleazar 155
                'badges' => $badges,
12811 eleazar 156
                'date' => $title->added_on,
12819 eleazar 157
                'answer' => $answer,
12501 eleazar 158
 
11873 eleazar 159
            ]);
160
            return $viewModel ;
12707 eleazar 161
 
162
 
11873 eleazar 163
        } else {
164
            return new JsonModel([
165
                'success' => false,
166
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
167
            ]);
168
        }
169
    }
11944 eleazar 170
 
11971 eleazar 171
    public function timelineAction(){
11944 eleazar 172
         $currentUserPlugin = $this->plugin('currentUserPlugin');
173
         $currentUser = $currentUserPlugin->getUser();
174
         $currentCompany = $currentUserPlugin->getCompany();
11945 eleazar 175
         $request = $this->getRequest();
11944 eleazar 176
         if($request->isGet()) {
177
 
11952 eleazar 178
            $feed_uuid =  $this->params()->fromRoute('id');
179
                     if(!isset($feed_uuid)){
180
                    $data = [
181
                        'success'   => false,
182
                        'data'   => 'ERROR_INVALID_PARAMETER'
183
                    ];
11944 eleazar 184
 
11952 eleazar 185
                    return new JsonModel($data);
186
            }
187
 
188
            $items = [];
189
            $feedMapper = FeedMapper::getInstance($this->adapter);
11953 eleazar 190
            $feed  = $feedMapper->fetchOneByUuid($feed_uuid);
11954 eleazar 191
            $feeds = $feedMapper->fetchAllByMytAnswer($feed->related_feed);
11957 eleazar 192
 
193
            if (!$feeds) {
11952 eleazar 194
                $data = [
195
                    'success' => false,
196
                    'data' => 'ERROR_RECORD_NOT_FOUND'
197
                ];
198
                      return new JsonModel($data);
199
            }
200
 
11955 eleazar 201
            $items = [];
14740 efrain 202
 
203
            $utilMapper = UtilMapper::getInstance($this->adapter);
204
            $now = $utilMapper->getDatebaseNow();
11955 eleazar 205
 
206
 
207
            foreach($feeds as $solution)
208
            {
14740 efrain 209
                $items = $this->renderFeed($solution->id, $now);
11955 eleazar 210
            }
11962 eleazar 211
 
11952 eleazar 212
               $response = [
213
                    'success' => true,
214
                    'data' => [
11959 eleazar 215
                        'items' =>$items,
11952 eleazar 216
                        'feed_title'=>$feed->title,
217
                        'topic_title'=>$feed->description
218
                    ]
219
                ];
220
                      return new JsonModel($response);
221
        }
11944 eleazar 222
    }
11873 eleazar 223
 
11971 eleazar 224
    public function feedAction() {
11967 eleazar 225
 
226
        $currentUserPlugin = $this->plugin('currentUserPlugin');
227
        $currentUser = $currentUserPlugin->getUser();
228
        $currentCompany = $currentUserPlugin->getCompany();
229
 
230
 
231
 
232
 
11837 eleazar 233
 
11967 eleazar 234
        $request = $this->getRequest();
235
        if($request->isGet()) {
236
 
237
 
11972 eleazar 238
            $page = (int) $this->params()->fromQuery('page');
11967 eleazar 239
            $myt_id =  $this->params()->fromRoute('id');
240
 
241
 
242
            $feedMapper = FeedMapper::getInstance($this->adapter);
243
            $myt  = $feedMapper->fetchOneByUuid($myt_id);
244
            $queryMapper = QueryMapper::getInstance($this->adapter);
245
            $select = $queryMapper->getSql()->select(FeedMapper::_TABLE);
11973 eleazar 246
            $select->columns(['id']);
11967 eleazar 247
            $select->where->equalTo('status', Feed::STATUS_PUBLISHED);
248
            $select->where->equalTo('company_id',$currentCompany->id);
249
            $select->where->equalTo('related_feed', $myt->id);
250
            $select->where->and->equalTo('type', Feed::TYPE_MYT_ANSWER);
251
            $select->order('added_on desc');
252
 
253
 
254
            $dbSelect = new DbSelect($select, $this->adapter);
255
            $paginator = new Paginator($dbSelect);
256
            $paginator->setCurrentPageNumber($page ? $page : 1);
257
            $paginator->setItemCountPerPage(10);
258
 
259
            $items = [];
260
            $feeds = $paginator->getCurrentItems();
11980 eleazar 261
 
14740 efrain 262
 
263
            $utilMapper = UtilMapper::getInstance($this->adapter);
264
            $now = $utilMapper->getDatebaseNow();
265
 
11967 eleazar 266
            foreach($feeds as $feed)
267
            {
14740 efrain 268
                $items[] = $this->renderFeed($feed->id, $now);
11967 eleazar 269
            }
270
 
271
            $response = [
272
                'success' => true,
273
                'data' => [
274
                    'total' => [
275
                        'count' => $paginator->getTotalItemCount(),
276
                        'pages' => $paginator->getPages()->pageCount,
277
                    ],
278
                    'current' => [
279
                        'items'    => $items,
280
                        'page'     => $paginator->getCurrentPageNumber(),
281
                        'count'    => $paginator->getCurrentItemCount(),
282
                    ]
283
                ]
284
            ];
285
 
286
            return new JsonModel($response);
287
        }
288
 
289
        $response = [
290
            'success' => false,
291
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
292
        ];
293
 
294
 
295
        return new JsonModel($response);
296
    }
297
 
11336 eleazar 298
    public function addAction() {
299
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
300
        $currentCompany     = $currentUserPlugin->getCompany();
301
        $currentUser        = $currentUserPlugin->getUser();
302
 
11787 eleazar 303
        $id =  $this->params()->fromRoute('id');
11343 eleazar 304
        $questionsMapper = FeedMapper::getInstance($this->adapter);
11787 eleazar 305
        $question = $questionsMapper->fetchOneByUuid($id);
11336 eleazar 306
        $request    = $this->getRequest();
307
        try{
308
        if($request->isPost()) {
309
            $form = new  CreateFeedForm($this->adapter);
11710 eleazar 310
 
311
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
11336 eleazar 312
            $categoriesId = $dataPost['category_id'] ?? [];
313
            $dataPost['category_id'] = null;
314
            $form->setData($dataPost);
315
 
316
            if($form->isValid()) {
317
 
318
                $dataPost = (array) $form->getData();
319
                $hydrator = new ObjectPropertyHydrator();
320
                $feed = new Feed();
321
                $hydrator->hydrate($dataPost, $feed);
322
 
323
                $feed->user_id = $currentUser->id;
324
                $feed->company_id = $currentCompany->id;
325
                $feed->user_id          = $currentUser->id;
11343 eleazar 326
                $feed->type             = Feed::TYPE_MYT_ANSWER;
11336 eleazar 327
                $feed->posted_or_shared = Feed::POSTED;
328
                $feed->shared_with      = Feed::SHARE_WITH_PUBLIC;
11343 eleazar 329
                $feed->related_feed = $question->id;
11336 eleazar 330
 
11710 eleazar 331
                $feed->total_comments   = 0;
332
                $feed->total_shared     = 0;
333
 
334
 
335
                $files = $this->getRequest()->getFiles()->toArray();
336
                $file_type = '';
337
                if(isset($files['file']) && empty($files['file']['error'])) {
338
                    $feed_tmp_filename  = $files['file']['tmp_name'];
339
                    $feed_filename      = $this->normalizeString($files['file']['name']);
340
 
341
                    $mime_type = mime_content_type($feed_tmp_filename);
342
                    if($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {
343
                        $file_type = Feed::FILE_TYPE_IMAGE;
344
                    } else if($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {
345
                        $file_type = Feed::FILE_TYPE_VIDEO;
346
                    } else if($mime_type == 'application/pdf') {
347
                        $file_type = Feed::FILE_TYPE_DOCUMENT;
348
                    }
349
                }
350
 
11336 eleazar 351
                $feedMapper = FeedMapper::getInstance($this->adapter);
352
 
353
                if($feedMapper->insert($feed)) {
11343 eleazar 354
                    $feed = $feedMapper->fetchOne($feed->id);
355
                    $category = new FeedTopic();
356
                    $feedMapper->update($feed);
11705 eleazar 357
 
11336 eleazar 358
 
11705 eleazar 359
                        $feed = $feedMapper->fetchOne($feed->id);
360
 
361
                        if( $file_type == Feed::FILE_TYPE_DOCUMENT) {
362
                            try {
363
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
364
                                if(!file_exists($target_path)) {
365
                                    mkdir($target_path, 0755);
366
                                }
367
 
368
                                $full_filename = $target_path  . DIRECTORY_SEPARATOR .$feed_filename;
369
                                $result = move_uploaded_file($feed_tmp_filename , $full_filename);
370
                                if($result) {
371
 
372
                                    $feed->file_type = $file_type;
373
                                    $feed->file_name = basename($feed_filename);
374
                                    $feedMapper->update($feed);
375
                                } else {
376
                                    error_log('no se pudo mover o renombrar el documento : ' . $feed_tmp_filename . ' al directorio : ' . $full_filename );
377
                                }
378
                            } catch(\Throwable $e) {
379
                                error_log($e->getTraceAsString());
380
                            }
381
                        }
382
                        if( $file_type == Feed::FILE_TYPE_IMAGE) {
383
                            try {
384
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
385
                                if(!file_exists($target_path)) {
386
                                    mkdir($target_path, 0755);
387
                                }
388
 
389
                                list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.feed_image_size']);
390
 
391
                                $feed_filename = substr($feed_filename, 0, strrpos($feed_filename, '.'))  . '.png';
392
                                $crop_to_dimensions = false;
393
                                if(Image::uploadImage($feed_tmp_filename, $target_path, $feed_filename, $target_width, $target_height, $crop_to_dimensions )) {
394
                                    $feed->file_type = $file_type;
395
                                    $feed->file_name = basename($feed_filename);
396
                                    $feedMapper->update($feed);
397
                                }
398
                            } catch(\Throwable $e) {
399
                                error_log($e->getTraceAsString());
400
                            }
401
                        }
402
                        if( $file_type == Feed::FILE_TYPE_VIDEO) {
403
                            try {
404
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
405
                                if(!file_exists($target_path)) {
406
                                    mkdir($target_path, 0755);
407
                                }
408
 
409
                                $full_filename = $target_path  . DIRECTORY_SEPARATOR . $feed_filename;
410
 
411
                                $result = move_uploaded_file($feed_tmp_filename , $full_filename);
412
                                if($result) {
413
 
414
                                    $size = $this->config['leaderslinked.image_sizes.feed_image_size'];
415
                                    $getFromSecound = 2;
416
 
417
                                    //extracción del cover
418
                                    $generateFileName = substr($feed_filename, 0, strrpos($feed_filename, '.'));
419
                                    $generateFile =  $target_path  . DIRECTORY_SEPARATOR . $generateFileName .  '.png';
420
                                    $cmd            = "/usr/bin/ffmpeg -i $full_filename -an -ss $getFromSecound -s $size $generateFile";
421
                                    exec($cmd);
422
 
423
 
424
                                    $feed->file_type = $file_type;
425
                                    $feed->file_name = basename($feed_filename);
426
                                    $feed->file_image_preview = basename($generateFile);
427
                                    $feedMapper->update($feed);
428
 
429
                                    $videoConvert = new VideoConvert();
430
                                    $videoConvert->filename = $full_filename;
431
                                    $videoConvert->type = VideoConvert::TYPE_FEED;
432
 
433
                                    $videoConvertMapper = VideoConvertMapper::getInstance($this->adapter);
434
                                    $videoConvertMapper->insert($videoConvert);
435
                                } else {
436
                                    error_log('no se pudo mover o renombrar el documento : ' . $feed_tmp_filename . ' al directorio : ' . $full_filename );
437
                                }
438
                            } catch(\Throwable $e) {
439
                                error_log($e->getTraceAsString());
440
                            }
441
                        }
11714 eleazar 442
 
443
 
444
                        $response = [
445
                            'success'   => true,
446
                            'data'   => 'success'
447
                        ];
11336 eleazar 448
                } else {
11705 eleazar 449
                    $messages = [];
450
                    $form_messages = (array) $form->getMessages();
451
                    foreach($form_messages  as $fieldname => $field_messages)
452
                    {
453
                        $messages[$fieldname] = array_values($field_messages);
454
                    }
455
 
11336 eleazar 456
                }
457
 
458
            } else {
11705 eleazar 459
                $response = [
460
                    'success' => false,
461
                    'data' => 'ERROR_METHOD_NOT_ALLOWED'
462
                ];
11336 eleazar 463
            }
464
 
11714 eleazar 465
            return new JsonModel($response);
11336 eleazar 466
        }
467
 
468
    } catch (\Throwable $e) {
469
        $e->getMessage();
11984 eleazar 470
        return new JsonModel([
471
            'success' => false,
472
            'data' => $e
473
        ]);
11336 eleazar 474
    }
475
    }
11791 eleazar 476
 
11998 eleazar 477
     /**
478
     *
479
     * @param string $str
480
     * @return string
481
     */
482
    private function normalizeString ($str = ''){
483
        $basename  = substr($str, 0, strrpos($str, '.'));
484
        $basename  = str_replace('.', '-', $basename);
485
 
486
        $extension  = substr($str, strrpos($str, '.'));
487
 
488
        $str = $basename . $extension;
489
 
490
        $str = strip_tags($str);
491
        $str = preg_replace('/[\r\n\t ]+/', ' ', $str);
492
        $str = preg_replace('/[\"\*\/\:\<\>\?\'\|\,]+/', ' ', $str);
493
        $str = strtolower($str);
494
        $str = html_entity_decode( $str, ENT_QUOTES, "utf-8" );
495
        $str = htmlentities($str, ENT_QUOTES, "utf-8");
496
        $str = preg_replace("/(&)([a-z])([a-z]+;)/i", '$2', $str);
497
        $str = str_replace(' ', '-', $str);
498
        $str = rawurlencode($str);
499
        $str = str_replace('%', '-', $str);
500
        return trim(strtolower($str));
501
    }
502
 
14740 efrain 503
    private function renderFeed($id , $now){
11791 eleazar 504
 
11885 eleazar 505
        $sandbox = $this->config['leaderslinked.runmode.sandbox'];
506
        if($sandbox) {
507
            $company_profile_url = $this->config['leaderslinked.frontend.sandbox_company_profile'];
508
            $user_profile_url = $this->config['leaderslinked.frontend.sandbox_user_profile'];
509
 
510
        } else {
511
            $company_profile_url = $this->config['leaderslinked.frontend.production_company_profile'];
512
            $user_profile_url = $this->config['leaderslinked.frontend.production_user_profile'];
513
        }
11791 eleazar 514
 
515
 
516
        $currentUserPlugin = $this->plugin('currentUserPlugin');
517
        $currentUser = $currentUserPlugin->getUser();
518
        $currentCompany = $currentUserPlugin->getCompany();
519
 
520
        $companyMapper = CompanyMapper::getInstance($this->adapter);
521
        $company = $companyMapper->fetchOne($currentCompany->id);
522
 
523
        $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
11980 eleazar 524
        $owner = $companyUserMapper->fetchOwnerByCompanyId($currentCompany->id);
11791 eleazar 525
 
526
        $acl = $this->getEvent()->getViewModel()->getVariable('acl');
11976 eleazar 527
 
528
 
11995 eleazar 529
 
11791 eleazar 530
 
11977 eleazar 531
        $feedMapper = FeedMapper::getInstance($this->adapter);
532
        $feed = $feedMapper->fetchOne($id);
11995 eleazar 533
 
534
        $params = [
535
            'id' => $feed->uuid,
536
        ];
11791 eleazar 537
 
538
        $item = [
539
            'feed_unique' => uniqid(),
540
            'feed_uuid' => $feed->uuid,
11973 eleazar 541
            'feed_description' => $feed->description,
11994 eleazar 542
            'feed_delete_url' =>  $this->url()->fromRoute('my-trainer/question/answer/delete', $params),
11791 eleazar 543
            'feed_content_type' => $feed->file_type ? $feed->file_type : '',
544
            'feed_priority'=> $feed->priority,
545
        ];
546
 
547
        $userMapper = UserMapper::getInstance($this->adapter);
548
        $user = $userMapper->fetchOne($feed->user_id);
11994 eleazar 549
        $item['feed_delete_url'] = $this->url()->fromRoute('my-trainer/question/answer/delete',  $params);
11791 eleazar 550
        $item['owner_url'] =  str_replace('[uuid]', $company->uuid, $company_profile_url);
551
        $item['owner_image'] = $this->url()->fromRoute('storage', ['code' => $company->uuid, 'type' => 'user', 'filename' => $company->image]);
552
        $item['owner_name'] = $company->name;
553
 
14740 efrain 554
        $item['owner_time_elapse'] = Functions::timeAgo( $feed->added_on, $now);
11791 eleazar 555
 
556
        if($feed->file_type == Feed::FILE_TYPE_IMAGE) {
557
            $item['owner_file_image'] = $this->url()->fromRoute('storage', ['code' => $feed->uuid, 'type' => 'feed', 'filename' => $feed->file_name]);
558
 
559
        }
560
        if($feed->file_type == Feed::FILE_TYPE_DOCUMENT) {
561
            $item['owner_file_document'] = $this->url()->fromRoute('storage', ['code' => $feed->uuid, 'type' => 'feed', 'filename' => $feed->file_name]);
562
        }
563
        if($feed->file_type == Feed::FILE_TYPE_VIDEO) {
564
            $item['owner_file_image_preview'] = $this->url()->fromRoute('storage', ['code' => $feed->uuid, 'type' => 'feed', 'filename' => $feed->file_image_preview]);
565
            $item['owner_file_video'] = $this->url()->fromRoute('storage', ['code' => $feed->uuid, 'type' => 'feed', 'filename' => $feed->file_name]);
566
        }
567
        if($feed->file_type == Feed::FILE_TYPE_MEETING) {
568
            $dt = \DateTime::createFromFormat('Y-m-d', $feed->date);
569
            $dt2 = \DateTime::createFromFormat('H:i:s', $feed->time);
570
            $item['owner_meeting'] =  true;
571
            $item['owner_meeting_date'] =  $dt->format('d/m/Y');
572
            $item['owner_meeting_time'] =  $dt2->format('h:i a');
573
            $item['owner_meeting_link_type'] =  $feed->link_type;
574
            $item['owner_meeting_link_name'] =  $feed->link_name;
575
 
576
        }
577
 
578
        $commentMapper = CommentMapper::getInstance($this->adapter);
579
        $records = $commentMapper->fetchAllPublishedByFeedId($feed->id);
580
 
581
 
582
        $comments = [];
583
        $comment_count=0;
584
        foreach($records as $record)
585
        {
586
            $user = $userMapper->fetchOne($record->user_id);
587
 
14740 efrain 588
 
11791 eleazar 589
            $comment = [];
590
            $comment['unique'] = uniqid();
591
            $comment_count++;
592
            $comment['comment_index']=$comment_count;
593
            $user = $userMapper->fetchOne($record->user_id);
594
            if($user->id == $owner->user_id) {
595
                $comment['user_image'] = $this->url()->fromRoute('storage', ['type' => 'company',  'code' => $company->uuid, 'filename' =>  $company->image ]);
596
                $comment['user_url'] =  str_replace('[uuid]', $company->uuid, $company_profile_url);
597
                $comment['user_name'] = $company->name;
598
            } else {
599
                $comment['user_image'] = $this->url()->fromRoute('storage', ['type' => 'user',  'code' => $user->uuid, 'filename' =>  $user->image ]);
600
                $comment['user_url'] = str_replace('[uuid]', $user->uuid, $user_profile_url);
601
                $comment['user_name'] = $user->first_name . ' ' . $user->last_name;
602
            }
11854 eleazar 603
            $comment['link_delete'] = $this->url()->fromRoute('my-trainer/question/answer/comments/delete',['id' => $feed->uuid, 'comment' => $record->uuid ]);
11791 eleazar 604
 
605
 
11854 eleazar 606
            $comment['link_answer_add'] = $this->url()->fromRoute('my-trainer/question/answer/comments/answer',['id' => $feed->uuid, 'comment' => $record->uuid ]);
14740 efrain 607
            $comment['time_elapsed'] = Functions::timeAgo($record->added_on, $now);
11791 eleazar 608
            $comment['comment'] = $record->comment;
609
 
610
            $records2 = $commentMapper->fetchAllPublishedByCommentId($record->id);
611
            $answers = [];
612
            $contador=0;
613
            foreach($records2 as $record2)
614
            {
615
                $user = $userMapper->fetchOne($record2->user_id);
14740 efrain 616
 
11791 eleazar 617
 
618
                $answer = [];
619
                $answer['unique'] = uniqid();
620
 
621
 
622
                $user = $userMapper->fetchOne($record2->user_id);
623
                if($user->id == $owner->user_id) {
624
                    $answer['user_image'] = $this->url()->fromRoute('storage', ['type' => 'company',  'code' => $company->uuid, 'filename' =>  $company->image ]);
625
                    $answer['user_url'] =  str_replace('[uuid]', $company->uuid, $company_profile_url);
626
                    $answer['user_name'] = $company->name;
627
                } else {
628
                    $answer['user_image'] = $this->url()->fromRoute('storage', ['type' => 'user',  'code' => $user->uuid, 'filename' =>  $user->image ]);
629
                    $answer['user_url'] = str_replace('[uuid]', $user->uuid, $user_profile_url);
630
                    $answer['user_name'] = $user->first_name . ' ' . $user->last_name;
631
                }
632
 
11854 eleazar 633
                    $answer['link_delete'] = $this->url()->fromRoute('my-trainer/question/answer/comments/delete',['id' => $feed->uuid, 'comment' => $record2->uuid ]);
11791 eleazar 634
 
635
 
14740 efrain 636
                $answer['time_elapsed'] = Functions::timeAgo($record2->added_on, $now);
11791 eleazar 637
                $answer['comment'] = $record2->comment;
638
 
639
                $records2 = $commentMapper->fetchAllPublishedByCommentId($record2->id);
640
 
641
                $contador++;
642
                array_push($answers, $answer);
643
            }
644
            $comment['number_answers']=$contador;
645
            $comment['answers'] = $answers;
646
            array_push($comments, $comment);
647
        }
11854 eleazar 648
        $item['comment_add_url'] = $this->url()->fromRoute('my-trainer/question/answer/comments', ['id' => $feed->uuid]);
11791 eleazar 649
            $item['comments'] = $comments;
650
 
651
 
652
 
653
        return $item;
654
    }
11809 eleazar 655
 
656
    public function commentAction()
657
    {
658
 
659
 
660
        $currentUserPlugin = $this->plugin('currentUserPlugin');
661
        $currentUser = $currentUserPlugin->getUser();
662
        $currentCompany = $currentUserPlugin->getCompany();
663
 
664
 
665
        $id = $this->params()->fromRoute('id');
666
 
667
        $request = $this->getRequest();
668
        if($request->isPost()) {
669
            $feedMapper = FeedMapper::getInstance($this->adapter);
670
            $feed = $feedMapper->fetchOneByUuid($id);
671
            if(!$feed) {
672
                $response = [
673
                    'success' => false,
674
                    'data' => 'ERROR_POST_NOT_FOUND'
675
                ];
676
                return new JsonModel($response);
677
            }
678
 
679
            if($feed->company_id != $currentCompany->id) {
680
                $response = [
681
                    'success' => false,
682
                    'data' => 'ERROR_UNAUTHORIZED'
683
                ];
684
                return new JsonModel($response);
685
            }
686
 
687
            $dataPost = $request->getPost()->toArray();
688
            $form = new CommentForm();
689
            $form->setData($dataPost);
690
 
691
            if($form->isValid()) {
692
 
693
                $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
694
                $owner = $companyUserMapper->fetchOwnerByCompanyId($currentCompany->id);
695
 
696
                $dataPost = (array) $form->getData();
697
                $comment = new Comment();
698
                $comment->comment = $dataPost['comment'];
699
                $comment->feed_id = $feed->id;
700
                $comment->user_id = $currentCompany->id;
701
 
702
                $commentMapper = CommentMapper::getInstance($this->adapter);
703
                if($commentMapper->insert($comment)) {
14740 efrain 704
                    $utilMapper = UtilMapper::getInstance($this->adapter);
705
                    $now = $utilMapper->getDatebaseNow();
11809 eleazar 706
 
707
                    $total_comments = $commentMapper->fetchCountCommentByFeedId($comment->feed_id);
708
 
709
                    $feed->total_comments = $total_comments;
710
                    $feedMapper->update($feed);
711
 
712
                    $response = [
713
                        'success'   => true,
14740 efrain 714
                        'data'   => $this->renderComment($comment->id, $now),
11809 eleazar 715
                        'total_comments' => $total_comments
716
                    ];
717
 
718
                    return new JsonModel($response);
719
 
720
                } else {
721
 
722
                    $response = [
723
                        'success'   => false,
724
                        'data'   => $commentMapper->getError()
725
                    ];
726
 
727
                    return new JsonModel($response);
728
                }
729
 
730
            } else {
731
                $message = '';;
732
                $form_messages = (array) $form->getMessages();
733
                foreach($form_messages  as $fieldname => $field_messages)
734
                {
735
                    foreach( $field_messages as $key => $value)
736
                    {
737
                        $message = $value;
738
                    }
739
                }
740
 
741
                $response = [
742
                    'success'   => false,
743
                    'data'   => $message
744
                ];
745
 
746
                return new JsonModel($response);
747
            }
748
 
749
 
750
        } else {
751
            $response = [
752
                'success' => false,
753
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
754
            ];
755
 
756
            return new JsonModel($response);
757
        }
758
 
759
 
760
    }
11317 eleazar 761
 
11837 eleazar 762
    public function answerAction()
11809 eleazar 763
    {
11317 eleazar 764
 
11809 eleazar 765
 
766
        $currentUserPlugin = $this->plugin('currentUserPlugin');
767
        $currentUser = $currentUserPlugin->getUser();
768
        $currentCompany = $currentUserPlugin->getCompany();
769
 
770
 
771
        $id = $this->params()->fromRoute('id');
772
        $comment_uuid = $this->params()->fromRoute('comment');
773
 
774
        $request = $this->getRequest();
775
        if($request->isPost()) {
776
            $feedMapper = FeedMapper::getInstance($this->adapter);
777
            $feed = $feedMapper->fetchOneByUuid($id);
778
            if(!$feed) {
779
                $response = [
780
                    'success' => false,
781
                    'data' => 'ERROR_POST_NOT_FOUND'
782
                ];
783
                return new JsonModel($response);
784
            }
785
 
786
            if($feed->company_id != $currentCompany->id) {
787
                $response = [
788
                    'success' => false,
789
                    'data' => 'ERROR_UNAUTHORIZED'
790
                ];
791
                return new JsonModel($response);
792
            }
793
 
794
            $dataPost = $request->getPost()->toArray();
795
            $form = new CommentAnswerForm();
796
            $form->setData($dataPost);
797
 
798
            if($form->isValid()) {
799
 
800
                $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
801
                $owner = $companyUserMapper->fetchOwnerByCompanyId($currentCompany->id);
802
 
803
                $dataPost = (array) $form->getData();
804
                $answer = new Comment();
805
                $answer->comment = $dataPost['answer'];
806
                $answer->feed_id = $feed->id;
807
 
808
                $answer->user_id = $owner->user_id;
809
 
810
                $commentMapper = CommentMapper::getInstance($this->adapter);
811
                $comment=$commentMapper->fetchOneByUuid($comment_uuid);
812
                $answer->parent_id = $comment->id;
813
 
814
                if($commentMapper->insert($answer)) {
14740 efrain 815
                    $utilMapper = UtilMapper::getInstance($this->adapter);
816
                    $now = $utilMapper->getDatebaseNow();
11809 eleazar 817
 
818
                    $total_comments = $commentMapper->fetchCountCommentByFeedId($comment->feed_id);
819
 
820
                    $feed->total_comments = $total_comments;
821
                    $feedMapper->update($feed);
822
 
823
                    $response = [
824
                        'success'   => true,
14740 efrain 825
                        'data'   => $this->renderComment($answer->id, $now),
11809 eleazar 826
                        'total_comments' => $total_comments
827
                    ];
828
 
829
                    return new JsonModel($response);
830
 
831
                } else {
832
 
833
                    $response = [
834
                        'success'   => false,
835
                        'data'   => $commentMapper->getError()
836
                    ];
837
 
838
                    return new JsonModel($response);
839
                }
840
 
841
            } else {
842
                $message = '';;
843
                $form_messages = (array) $form->getMessages();
844
                foreach($form_messages  as $fieldname => $field_messages)
845
                {
846
                    foreach( $field_messages as $key => $value)
847
                    {
848
                        $message = $value;
849
                    }
850
                }
851
 
852
                $response = [
853
                    'success'   => false,
854
                    'data'   => $message
855
                ];
856
 
857
                return new JsonModel($response);
858
            }
859
 
860
 
861
        } else {
862
            $response = [
863
                'success' => false,
864
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
865
            ];
866
 
867
            return new JsonModel($response);
868
        }
869
 
870
 
871
    }
872
 
873
    public function commentDeleteAction()
874
    {
875
        $currentUserPlugin = $this->plugin('currentUserPlugin');
876
        $currentUser = $currentUserPlugin->getUser();
877
        $currentCompany = $currentUserPlugin->getCompany();
878
 
879
        $request = $this->getRequest();
880
        if($request->isPost()) {
881
            $currentUserPlugin = $this->plugin('currentUserPlugin');
882
            $currentUser = $currentUserPlugin->getUser();
883
 
884
            $id = $this->params()->fromRoute('id');
885
            $comment = $this->params()->fromRoute('comment');
886
 
887
            $feedMapper = FeedMapper::getInstance($this->adapter);
888
            $feed = $feedMapper->fetchOneByUuid($id);
889
            if(!$feed) {
890
                $response = [
891
                    'success' => false,
892
                    'data' => 'ERROR_POST_NOT_FOUND'
893
                ];
894
                return new JsonModel($response);
895
            }
896
 
897
            if($feed->company_id != $currentCompany->id) {
898
                $response = [
899
                    'success' => false,
900
                    'data' => 'ERROR_UNAUTHORIZED'
901
                ];
902
                return new JsonModel($response);
903
            }
904
 
905
            $commentMapper = CommentMapper::getInstance($this->adapter);
906
            $comment = $commentMapper->fetchOneByUuid($comment);
907
 
908
            if($comment && $comment->feed_id == $feed->id) {
909
                $comment->status = Comment::STATUS_DELETED;
910
                if($commentMapper->update($comment)) {
911
                    $total_comments = $commentMapper->fetchCountCommentByFeedId($comment->feed_id);
912
 
913
                    $feed = $feedMapper->fetchOne($comment->feed_id);
914
                    $feed->total_comments = $total_comments;
915
                    $feedMapper->update($feed);
916
 
917
 
918
 
919
 
920
 
921
                    $response = [
922
                        'success' => true,
923
                        'data' => [
924
                            'message' => 'LABEL_COMMENT_WAS_DELETED',
925
                            'total_comments' => $total_comments
926
                        ]
927
                   ];
928
                } else {
929
                    $response = [
930
                        'success' => false,
931
                        'data' => $commentMapper->getError()
932
                    ];
933
                }
934
 
935
            } else {
936
                $response = [
937
                    'success' => false,
938
                    'data' => 'ERROR_COMMENT_NOT_FOUND'
939
                ];
940
            }
941
 
942
        } else {
943
            $response = [
944
                'success' => false,
945
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
946
            ];
947
        }
948
 
949
        return new JsonModel($response);
950
    }
951
 
14740 efrain 952
    private function renderComment($comment_id, $now)
11809 eleazar 953
    {
954
        $currentUserPlugin = $this->plugin('currentUserPlugin');
955
        $currentUser = $currentUserPlugin->getUser();
956
        $currentCompany = $currentUserPlugin->getCompany();
957
 
958
        $companyMapper = CompanyMapper::getInstance($this->adapter);
959
        $company = $companyMapper->fetchOne($currentCompany->id);
960
 
961
        $companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
962
        $owner = $companyUserMapper->fetchOwnerByCompanyId($currentCompany->id);
963
 
964
 
965
 
966
        $sandbox = $this->config['leaderslinked.runmode.sandbox'];
967
        if($sandbox) {
968
            $company_profile_url = $this->config['leaderslinked.frontend.sandbox_company_profile'];
969
            $user_profile_url = $this->config['leaderslinked.frontend.sandbox_user_profile'];
970
        } else {
971
            $company_profile_url = $this->config['leaderslinked.frontend.production_company_profile'];
972
            $user_profile_url = $this->config['leaderslinked.frontend.production_user_profile'];
973
        }
974
 
975
 
976
        $item = [];
977
 
978
        $commentMapper = CommentMapper::getInstance($this->adapter);
979
        $record = $commentMapper->fetchOne($comment_id);
980
 
981
        $feedMapper = FeedMapper::getInstance($this->adapter);
982
        $feed = $feedMapper->fetchOne($record->feed_id);
983
 
984
        if($record) {
985
            $userMapper = UserMapper::getInstance($this->adapter);
986
 
14740 efrain 987
 
11809 eleazar 988
 
989
 
990
            $item = [];
991
            $item['unique'] = uniqid();
992
 
993
 
994
            $user = $userMapper->fetchOne($record->user_id);
995
            if($user->id == $owner->user_id) {
996
                $item['user_image'] = $this->url()->fromRoute('storage', ['type' => 'company',  'code' => $company->uuid, 'filename' =>  $company->image ]);
997
                $item['user_url'] =  str_replace('[uuid]', $company->uuid, $company_profile_url);
998
                $item['user_name'] = $company->name;
999
            } else {
1000
                $item['user_image'] = $this->url()->fromRoute('storage', ['type' => 'user',  'code' => $user->uuid, 'filename' =>  $user->image ]);
1001
                $item['user_url'] = str_replace('[uuid]', $user->uuid, $user_profile_url);
1002
                $item['user_name'] = $user->first_name . ' ' . $user->last_name;
1003
            }
1004
 
1005
 
1006
 
11854 eleazar 1007
            $item['link_answer_add'] = $this->url()->fromRoute('my-trainer/question/answer/comments/answer',['id' => $feed->uuid, 'comment' => $record->uuid ]);
1008
            $item['link_delete'] = $this->url()->fromRoute('my-trainer/question/answer/comments/delete',['id' => $feed->uuid, 'comment' => $record->uuid ]);
14740 efrain 1009
            $item['time_elapsed'] = Functions::timeAgo($record->added_on, $now);
11809 eleazar 1010
            $item['comment'] = $record->comment;
1011
 
1012
        }
1013
        return $item;
1014
    }
11990 eleazar 1015
 
1016
    public function deleteAction()
1017
    {
1018
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1019
        $currentUser = $currentUserPlugin->getUser();
1020
        $currentCompany = $currentUserPlugin->getCompany();
1021
 
1022
        $request = $this->getRequest();
1023
        if($request->isPost()) {
1024
 
1025
 
1026
            $id =  $this->params()->fromRoute('id');
1027
 
1028
            $feedMapper = FeedMapper::getInstance($this->adapter);
1029
            $feed = $feedMapper->fetchOneByUuid($id);
1030
            if(!$feed) {
1031
                $response = [
1032
                    'success' => false,
1033
                    'data' => 'ERROR_POST_NOT_FOUND'
1034
                ];
1035
                return new JsonModel($response);
1036
            }
1037
 
1038
            if($feed->company_id != $currentCompany->id) {
1039
                $response = [
1040
                    'success' => false,
1041
                    'data' => 'ERROR_UNAUTHORIZED'
1042
                ];
1043
                return new JsonModel($response);
1044
            }
1045
 
1046
            $feedMapper = FeedMapper::getInstance($this->adapter);
1047
            $feed->status = Feed::STATUS_DELETED;
1048
            if($feedMapper->update($feed)) {
1049
                $response = [
1050
                    'success' => true,
1051
                    'data' => 'LABEL_FEED_WAS_DELETED'
1052
                ];
1053
 
1054
            } else {
1055
                $response = [
1056
                    'success' => false,
1057
                    'data' => $feedMapper->getError()
1058
                ];
1059
            }
1060
 
1061
 
1062
            return new JsonModel($response);
1063
 
1064
        } else {
1065
            $response = [
1066
                'success' => false,
1067
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1068
            ];
1069
        }
1070
 
1071
        return new JsonModel($response);
1072
    }
11809 eleazar 1073
 
11317 eleazar 1074
}