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