Proyectos de Subversion LeadersLinked - Services

Rev

Rev 137 | Rev 242 | Ir a la última revisión | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
declare(strict_types=1);
3
 
4
namespace LeadersLinked\Controller;
5
 
6
use Laminas\Db\Adapter\AdapterInterface;
7
 
8
use Laminas\Mvc\Controller\AbstractActionController;
9
use Laminas\Log\LoggerInterface;
10
use Laminas\View\Model\ViewModel;
11
use Laminas\View\Model\JsonModel;
12
use LeadersLinked\Mapper\MyCoachCategoryMapper;
13
 
14
use LeadersLinked\Form\MyCoach\MyCoachQuestionForm;
15
use LeadersLinked\Library\MyCoachAccessControl;
16
use LeadersLinked\Form\MyCoach\MyCoachAnswerForm;
17
use LeadersLinked\Mapper\MyCoachQuestionMapper;
18
use LeadersLinked\Mapper\MyCoachQuestionCategoryMapper;
19
use LeadersLinked\Model\MyCoachQuestionCategory;
20
use LeadersLinked\Mapper\QueryMapper;
21
use LeadersLinked\Model\MyCoachQuestion;
22
use Laminas\Db\ResultSet\HydratingResultSet;
23
use Laminas\Paginator\Adapter\DbSelect;
24
use Laminas\Paginator\Paginator;
25
use LeadersLinked\Mapper\UserMapper;
26
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
27
use LeadersLinked\Library\Functions;
28
use LeadersLinked\Mapper\MyCoachAnswerMapper;
29
use LeadersLinked\Mapper\CommentMapper;
30
use LeadersLinked\Model\MyCoachAnswer;
31
use LeadersLinked\Form\MyCoach\CommentForm;
32
use LeadersLinked\Model\Comment;
33
use LeadersLinked\Mapper\ContentReactionMapper;
34
use LeadersLinked\Model\ContentReaction;
35
use LeadersLinked\Mapper\MyCoachQuestionViewMapper;
36
use LeadersLinked\Model\MyCoachQuestionView;
37
 
38
 
39
class MyCoachController extends AbstractActionController
40
{
41
    /**
42
     *
43
     * @var \Laminas\Db\Adapter\AdapterInterface
44
     */
45
    private $adapter;
46
 
47
    /**
48
     *
49
     * @var \LeadersLinked\Cache\CacheInterface
50
     */
51
    private $cache;
52
 
53
 
54
    /**
55
     *
56
     * @var \Laminas\Log\LoggerInterface
57
     */
58
    private $logger;
59
 
60
    /**
61
     *
62
     * @var array
63
     */
64
    private $config;
65
 
66
 
67
    /**
68
     *
69
     * @var \Laminas\Mvc\I18n\Translator
70
     */
71
    private $translator;
72
 
73
 
74
    /**
75
     *
76
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
77
     * @param \LeadersLinked\Cache\CacheInterface $cache
78
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
79
     * @param array $config
80
     * @param \Laminas\Mvc\I18n\Translator $translator
81
     */
82
    public function __construct($adapter, $cache, $logger, $config, $translator)
83
    {
84
        $this->adapter      = $adapter;
85
        $this->cache        = $cache;
86
        $this->logger       = $logger;
87
        $this->config       = $config;
88
        $this->translator   = $translator;
89
    }
90
 
91
    /**
92
     *
93
     * Generación del listado de perfiles
94
     * {@inheritDoc}
95
     * @see \Laminas\Mvc\Controller\AbstractActionController::indexAction()
96
     */
97
    public function indexAction()
98
    {
99
        $currentUserPlugin = $this->plugin('currentUserPlugin');
100
        $currentUser = $currentUserPlugin->getUser();
101
 
102
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
103
        $currentNetwork = $currentNetworkPlugin->getNetwork();
104
 
105
        $request = $this->getRequest();
106
        if ($request->isGet()) {
107
 
108
                $myCoachAccesControl = MyCoachAccessControl::getInstance($this->adapter);
109
                $categories = $myCoachAccesControl->getCategoriesWithAccessToFormSelect($currentUser->id, $currentNetwork->id);
110
 
111
                return new JsonModel([
112
                    'success' => true,
113
                    'data' => [
114
                        'categories' => $categories,
115
                    ]
116
                ]);
117
 
118
 
119
 
120
        } else {
121
            return new JsonModel([
122
                'success' => false,
123
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
124
            ]);
125
        }
126
    }
127
 
128
    public function questionsAction()
129
    {
130
        $currentUserPlugin = $this->plugin('currentUserPlugin');
131
        $currentUser = $currentUserPlugin->getUser();
132
 
133
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
134
        $currentNetwork = $currentNetworkPlugin->getNetwork();
135
 
136
 
137
        $request = $this->getRequest();
138
        if ($request->isGet()) {
139
            $userMapper                     = UserMapper::getInstance($this->adapter);
140
            $myCoachCategoryMapper          = MyCoachCategoryMapper::getInstance($this->adapter);
141
            $myCoachQuestionCategoryMapper  = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
142
            $myCoachAccessControl           = MyCoachAccessControl::getInstance($this->adapter);
143
 
144
            $category_filter_id = Functions::sanitizeFilterString($this->params()->fromQuery('category_id'));
145
            $search = Functions::sanitizeFilterString($this->params()->fromQuery('search'));
146
            $page   = intval($this->params()->fromQuery('start', 1), 10);
147
 
148
            $order_field        = 'added_on';
149
            $order_direction    = 'asc';
150
            $records_x_page     = 12;
151
 
152
 
153
            if ($category_filter_id) {
154
 
155
                $message_error = '';
156
                if(!$myCoachAccessControl->hasAccessForCategory($currentUser->id, $category_filter_id, $currentNetwork->id, $message_error)) {
157
 
158
                    return new JsonModel([
159
                        'success' => true,
160
                        'data' => $message_error,
161
                    ]);
162
 
163
                }
164
 
165
                $categoryFilter = $myCoachCategoryMapper->fetchOneByUuid($category_filter_id);
166
                $category_ids = [$categoryFilter->id];
167
            } else {
168
                $category_ids = $myCoachAccessControl->getCategoryIdsWithAccess($currentUser->id, $currentNetwork->id);
169
            }
170
 
171
            $category_ids_with_edition = $myCoachAccessControl->getCategoryIdsWithEdition($currentUser->id);
172
 
173
            $queryMapper = QueryMapper::getInstance($this->adapter);
174
 
175
            $prototype = new MyCoachQuestion();
176
            $selectIn = $queryMapper->getSql()->select(MyCoachQuestionCategoryMapper::_TABLE);
177
            $selectIn->columns(['question_id']);
178
            $selectIn->where->in('category_id', $category_ids);
179
 
180
 
181
 
182
            $select = $queryMapper->getSql()->select(MyCoachQuestionMapper::_TABLE);
183
            $select->where->in('id', $selectIn);
184
 
185
            if($search) {
186
                $select->where->nest()
187
                -> like('title', '%' . $search . '%')->or->like('description', '%' . $search . '%')
188
                ->unnest();
189
            }
190
            $select->order($order_field . ' ' . $order_direction);
191
 
192
            //echo $select->getSqlString($this->adapter->platform);
193
            //exit;
194
 
195
 
196
            $users = [];
197
            $categories = [];
198
            //echo $select->getSqlString($this->adapter->platform); exit;
199
 
200
            $hydrator   = new ObjectPropertyHydrator();
201
            $resultset  = new HydratingResultSet($hydrator, $prototype);
202
 
203
            $adapter = new DbSelect($select, $queryMapper->getSql(), $resultset);
204
            $paginator = new Paginator($adapter);
205
            $paginator->setItemCountPerPage($records_x_page);
206
            $paginator->setCurrentPageNumber($page);
207
 
208
 
209
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
210
            $commentMapper = CommentMapper::getInstance($this->adapter);
211
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
212
            $myCoachQuestionViewMapper = MyCoachQuestionViewMapper::getInstance($this->adapter);
213
 
214
            $items = [];
215
            $records = $paginator->getCurrentItems();
216
            foreach ($records as $record)
217
            {
218
                $bags_categories = [];
219
 
220
                $questionCategories = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($record->id);
221
 
222
 
223
 
224
 
225
                $allowEdit   = $myCoachAccessControl->hasAccessEditQuestion($currentUser->id, $record->id, $currentNetwork->id, $message_error);
226
                $allowDelete = $myCoachAccessControl->hasAccessDeleteQuestion($currentUser->id, $record->id, $currentNetwork->id, $message_error);
227
                foreach($questionCategories as $questionCategory)
228
                {
229
                    if(in_array($questionCategory->category_id, $category_ids_with_edition)) {
230
 
231
                        $allowDelete = true;
232
                    }
233
 
234
                    if (!isset($categories[$questionCategory->category_id])) {
235
                        $category = $myCoachCategoryMapper->fetchOne($questionCategory->category_id);
236
                        if ($category) {
237
                            $categories[$category->id] = $category->name;
238
 
239
                        }
240
                    }
241
 
242
                    array_push($bags_categories,['category' => $categories[ $questionCategory->category_id ] ]);
243
                }
244
 
245
                if(isset($users[$record->user_id])) {
246
                    $user = $users[ $record->user_id ];
247
                } else {
248
                    $user = $userMapper->fetchOne($record->user_id);
249
                    $users[ $record->user_id ] = $user;
250
                }
251
 
252
 
253
                $description = strip_tags($record->description);
254
                if (strlen($description) > 250) {
255
                    $description = substr($description, 0, 250) . '...';
256
                }
257
 
258
 
259
                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);
260
                $added_on = $dt->format('d/m/Y H:i a');
261
 
262
                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->updated_on);
263
                $updated_on = $dt->format('d/m/Y H:i a');
264
 
265
                $item = [
266
                    'uuid' => $record->uuid,
267
                    'user_name' => trim($user->first_name . ' ' . $user->last_name),
60 efrain 268
                    'user_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image],['force_canonical' => true]),
1 efrain 269
                    'title' => $record->title,
270
                    'description' => $description,
271
                    'categories' => $bags_categories,
272
                    'views' => intval($myCoachQuestionViewMapper->fetchCountByQuestionId($record->id), 10),
273
                    'answers' =>  intval($myCoachAnswerMapper->fetchCountByMyCoachQuestionId($record->id), 10),
274
                    'reactions' => intval($contentReactionMapper->fetchCountByMyCoachQuestionId($record->id), 10),
275
                    'comments' =>  intval($commentMapper->fetchCountByMyCoachQuestionId($record->id), 10),
276
                    'added_on' => $added_on,
277
                    'updated_on' => $updated_on,
278
                    'link_add_comment' => $this->url()->fromRoute('my-coach/questions/comments/add', ['id' => $record->uuid]),
279
                    'link_view' => $this->url()->fromRoute('my-coach/questions/view', ['id' => $record->uuid]),
280
                    'link_edit' => $allowEdit ?  $this->url()->fromRoute('my-coach/questions/edit', ['id' => $record->uuid]) : '',
281
                    'link_delete' => $allowDelete ? $this->url()->fromRoute('my-coach/questions/delete', ['id' =>  $record->uuid]) : '',
282
                ];
283
 
284
                array_push($items, $item);
285
            }
286
 
287
            return new JsonModel([
288
                'success' => true,
289
                'data' => [
290
                    'items' => $items,
291
                    'total' => $paginator->getTotalItemCount(),
292
                    'page' => $paginator->getCurrentPageNumber(),
143 efrain 293
                    'total_pages' => $paginator->getPages()->pageCount,
1 efrain 294
                ]
295
            ]);
296
 
297
 
298
        } else {
299
            return new JsonModel([
300
                'success' => false,
301
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
302
            ]);
303
        }
304
    }
305
 
306
    public function addQuestionAction()
307
    {
308
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
309
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
310
 
311
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
312
        $currentUser        = $currentUserPlugin->getUser();
313
 
314
        $request            = $this->getRequest();
315
 
316
        if ($request->isPost()) {
317
 
318
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
319
 
320
 
321
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
322
            $categories = $myCoachAccessControl->getCategoriesWithAccessToFormSelect($currentUser->id, $currentNetwork->id);
323
 
324
            $form = new MyCoachQuestionForm($categories);
325
            $form->setData($dataPost);
326
 
327
            if ($form->isValid()) {
328
                $dataPost = (array) $form->getData();
329
 
330
                $myCoachQuestion = new MyCoachQuestion();
331
                $myCoachQuestion->network_id    = $currentNetwork ->id;
332
                $myCoachQuestion->user_id       = $currentUser->id;
333
                $myCoachQuestion->title         = $dataPost['title'];
334
                $myCoachQuestion->description   = $dataPost['description'];
335
 
336
 
337
                $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
338
                if ($myCoachQuestionMapper->insert($myCoachQuestion)) {
339
                    $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
340
                    $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
341
 
342
                    $category_ids = $dataPost['category_id'];
137 efrain 343
                    if(is_array($category_ids)) {
344
 
345
 
346
                        foreach($category_ids as $category_id)
347
                        {
348
                            $myCoachCategory = $myCoachCategoryMapper->fetchOneByUuid($category_id);
349
                            if($myCoachCategory) {
350
                                $myCoachQuestionCategory = new MyCoachQuestionCategory();
351
                                $myCoachQuestionCategory->category_id = $myCoachCategory->id;
352
                                $myCoachQuestionCategory->question_id = $myCoachQuestion->id;
353
 
354
                                $myCoachQuestionCategoryMapper->insert($myCoachQuestionCategory);
355
                            }
356
                        }
357
                    } else {
358
                        $myCoachCategory = $myCoachCategoryMapper->fetchOneByUuid($category_ids);
1 efrain 359
                        if($myCoachCategory) {
360
                            $myCoachQuestionCategory = new MyCoachQuestionCategory();
361
                            $myCoachQuestionCategory->category_id = $myCoachCategory->id;
362
                            $myCoachQuestionCategory->question_id = $myCoachQuestion->id;
363
 
364
                            $myCoachQuestionCategoryMapper->insert($myCoachQuestionCategory);
365
                        }
366
                    }
367
 
368
 
369
                    $this->logger->info('Se agrego la pregunta ' . $myCoachQuestion->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
370
 
371
                    $data = [
372
                        'success'   => true,
373
                        'data'   => 'LABEL_RECORD_ADDED'
374
                    ];
375
                } else {
376
                    $data = [
377
                        'success'   => false,
378
                        'data'      => $myCoachQuestionMapper->getError()
379
                    ];
380
                }
381
 
382
                return new JsonModel($data);
383
            } else {
384
                $messages = [];
385
                $form_messages = (array) $form->getMessages();
386
                foreach ($form_messages  as $fieldname => $field_messages)
387
                {
388
                    $messages[$fieldname] = array_values($field_messages);
389
                }
390
 
391
                return new JsonModel([
392
                    'success'   => false,
393
                    'data'   => $messages
394
                ]);
395
            }
396
        } else {
397
            $data = [
398
                'success' => false,
399
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
400
            ];
401
 
402
            return new JsonModel($data);
403
        }
404
 
405
        return new JsonModel($data);
406
    }
407
 
408
 
409
 
410
    public function deleteQuestionAction()
411
    {
412
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
413
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
414
 
415
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
416
        $currentUser        = $currentUserPlugin->getUser();
417
 
418
        $request    = $this->getRequest();
419
        $id         = $this->params()->fromRoute('id');
420
 
421
        $message_error = '';
422
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
423
        if(!$myCoachAccessControl->hasAccessDeleteQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
424
            return new JsonModel([
425
                'success'   => false,
426
                'data'   => $message_error
427
            ]);
428
        }
429
 
430
 
431
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
432
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
433
 
434
 
435
        if ($request->isPost()) {
436
 
437
            $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
438
            $myCoachQuestionCategoryMapper->deleteAllByQuestionId($myCoachQuestion->id);
439
 
440
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
441
            $myCoachAnswerMapper->deleteAllByQuestionId($myCoachQuestion->id);
442
 
443
            $result =  $myCoachQuestionMapper->delete($myCoachQuestion);
444
            if ($result) {
445
                $data = [
446
                    'success' => true,
447
                    'data' => 'LABEL_RECORD_DELETED'
448
                ];
449
            } else {
450
 
451
                $data = [
452
                    'success'   => false,
453
                    'data'      => $myCoachQuestionMapper->getError()
454
                ];
455
 
456
                return new JsonModel($data);
457
            }
458
        } else {
459
            $data = [
460
                'success' => false,
461
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
462
            ];
463
 
464
            return new JsonModel($data);
465
        }
466
 
467
        return new JsonModel($data);
468
    }
469
 
470
 
471
    public function editQuestionAction()
472
    {
473
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
474
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
475
 
476
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
477
        $currentUser        = $currentUserPlugin->getUser();
478
 
479
        $request    = $this->getRequest();
480
        $id    = $this->params()->fromRoute('id');
481
 
482
        $message_error = '';
483
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
484
        if(!$myCoachAccessControl->hasAccessEditQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
485
            return new JsonModel([
486
                'success'   => false,
487
                'data'   => $message_error
488
            ]);
489
        }
490
 
491
 
492
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
493
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
494
 
495
 
496
        if ($request->isGet()) {
497
 
498
            $category_ids = [];
499
            $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
500
 
501
            $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
502
            $records = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($myCoachQuestion->id);
503
            foreach($records as $record)
504
            {
505
                $myCoachCategory = $myCoachCategoryMapper->fetchOne($record->category_id);
506
                if($myCoachCategory) {
507
                    array_push($category_ids,$myCoachCategory->uuid);
508
                }
509
            }
510
 
511
 
512
 
513
            $data = [
514
                'success' => true,
515
                'data' => [
516
                    'category_id' => $category_ids,
517
                    'title' => $myCoachQuestion->title,
518
                    'description' => $myCoachQuestion->description,
519
                ]
520
            ];
521
 
522
            return new JsonModel($data);
523
        } else if ($request->isPost()) {
524
 
525
            $categories = $myCoachAccessControl->getCategoriesWithAccessToFormSelect($myCoachQuestion->user_id, $currentNetwork->id);
526
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
527
 
528
            $form = new MyCoachQuestionForm($categories);
529
            $form->setData($dataPost);
530
 
531
            if ($form->isValid()) {
532
                $dataPost = (array) $form->getData();
533
 
534
 
535
 
536
                $myCoachQuestion->title = $dataPost['title'];
537
                $myCoachQuestion->description = $dataPost['description'];
538
 
539
 
540
                if ($myCoachQuestionMapper->update($myCoachQuestion)) {
541
 
542
 
543
                    $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
544
 
545
                    $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
546
                    $myCoachQuestionCategoryMapper->deleteAllByQuestionId($myCoachQuestion->id);
547
 
548
                    $category_ids = $dataPost['category_id'];
137 efrain 549
                    $category_ids = $dataPost['category_id'];
550
                    if(is_array($category_ids)) {
551
 
552
 
553
                        foreach($category_ids as $category_id)
554
                        {
555
                            $myCoachCategory = $myCoachCategoryMapper->fetchOneByUuid($category_id);
556
                            if($myCoachCategory) {
557
                                $myCoachQuestionCategory = new MyCoachQuestionCategory();
558
                                $myCoachQuestionCategory->category_id = $myCoachCategory->id;
559
                                $myCoachQuestionCategory->question_id = $myCoachQuestion->id;
560
 
561
                                $myCoachQuestionCategoryMapper->insert($myCoachQuestionCategory);
562
                            }
563
                        }
564
                    } else {
565
                        $myCoachCategory = $myCoachCategoryMapper->fetchOneByUuid($category_ids);
1 efrain 566
                        if($myCoachCategory) {
567
                            $myCoachQuestionCategory = new MyCoachQuestionCategory();
568
                            $myCoachQuestionCategory->category_id = $myCoachCategory->id;
569
                            $myCoachQuestionCategory->question_id = $myCoachQuestion->id;
570
 
571
                            $myCoachQuestionCategoryMapper->insert($myCoachQuestionCategory);
572
                        }
573
                    }
574
 
575
 
137 efrain 576
 
1 efrain 577
                    $this->logger->info('Se edito la pregunta ' . $myCoachQuestion->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
578
 
579
                    $data = [
580
                        'success'   => true,
581
                        'data'   => 'LABEL_RECORD_UPDATED'
582
                    ];
583
                } else {
584
                    $data = [
585
                        'success'   => false,
586
                        'data'      => $myCoachQuestionMapper->getError()
587
                    ];
588
                }
589
 
590
                return new JsonModel($data);
591
            } else {
592
                $messages = [];
593
                $form_messages = (array) $form->getMessages();
594
                foreach ($form_messages  as $fieldname => $field_messages) {
595
 
596
                    $messages[$fieldname] = array_values($field_messages);
597
                }
598
 
599
                return new JsonModel([
600
                    'success'   => false,
601
                    'data'   => $messages
602
                ]);
603
            }
604
        } else {
605
            $data = [
606
                'success' => false,
607
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
608
            ];
609
 
610
            return new JsonModel($data);
611
        }
612
 
613
        return new JsonModel($data);
614
    }
615
 
616
 
617
    public function viewQuestionAction()
618
    {
619
        $currentUserPlugin = $this->plugin('currentUserPlugin');
620
        $currentUser = $currentUserPlugin->getUser();
621
 
622
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
623
        $currentNetwork = $currentNetworkPlugin->getNetwork();
624
 
625
        $request    = $this->getRequest();
626
        $id    = $this->params()->fromRoute('id');
627
 
628
        $message_error = '';
629
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
630
        if(!$myCoachAccessControl->hasAccessViewQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
631
            return new JsonModel([
632
                'success'   => false,
633
                'data'   => $message_error
634
            ]);
635
        }
636
 
637
 
638
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
639
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
640
 
641
        $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
642
        $commentMapper = CommentMapper::getInstance($this->adapter);
643
        $myCoachQuestionViewMapper = MyCoachQuestionViewMapper::getInstance($this->adapter);
644
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
645
 
646
 
647
        $request = $this->getRequest();
648
        if ($request->isGet()) {
649
 
650
            $categories = [];
651
            $users = [];
652
 
653
 
654
 
655
            $bags_categories = [];
656
 
657
            $myCoachQuestionViewMapper = MyCoachQuestionViewMapper::getInstance($this->adapter);
658
            $myCoachQuestionView = $myCoachQuestionViewMapper->fetchOneByQuestionIdAndUserId($myCoachQuestion->id, $currentUser->id);
659
            if(!$myCoachQuestionView) {
660
                $myCoachQuestionView = new MyCoachQuestionView();
661
                $myCoachQuestionView->question_id = $myCoachQuestion->id;
662
                $myCoachQuestionView->user_id = $currentUser->id;
663
 
664
                $myCoachQuestionViewMapper->insert($myCoachQuestionView);
665
 
666
            }
667
 
668
 
669
 
670
            $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
671
            $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
672
 
673
            $questionCategories = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($myCoachQuestion->id);
674
            foreach($questionCategories as $questionCategory)
675
            {
676
 
677
                if (!isset($categories[$questionCategory->category_id])) {
678
                    $category = $myCoachCategoryMapper->fetchOne($questionCategory->category_id);
679
                    if ($category) {
680
                        $categories[$category->id] = $category->name;
681
                    }
682
                }
683
 
684
                array_push($bags_categories,['category' => $categories[ $questionCategory->category_id ] ]);
685
            }
686
 
687
            $users = [];
688
            $userMapper = UserMapper::getInstance($this->adapter);
689
            if(isset($users[$myCoachQuestion->user_id])) {
690
                $user = $users[$myCoachQuestion->user_id];
691
            } else {
692
                $user = $userMapper->fetchOne( $myCoachQuestion->user_id );
693
                $users[ $myCoachQuestion->user_id ] = $user;
694
            }
695
 
696
 
697
 
698
            $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $myCoachQuestion->added_on);
699
            $added_on = $dt->format('d/m/Y H:i a');
700
 
701
            $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $myCoachQuestion->updated_on);
702
            $updated_on = $dt->format('d/m/Y H:i a');
703
 
704
 
705
 
706
            $allowDelete = $myCoachAccessControl->hasAccessDeleteQuestion($currentUser->id, $myCoachQuestion->id, $currentNetwork->id, $message_error);
707
            if($allowDelete) {
708
                $link_delete = $this->url()->fromRoute('my-coach/questions/delete', ['id' => $myCoachQuestion->uuid]);
709
            } else {
710
                $link_delete = '';
711
            }
712
 
713
            $allowAnswerAdd = $myCoachAccessControl->hasAccessAnswerQuestion($currentUser->id, $myCoachQuestion->id, $currentNetwork->id, $message_error);
714
            if ($allowAnswerAdd) {
715
                $link_answers_add = $this->url()->fromRoute('my-coach/questions/answers/add', ['id' => $myCoachQuestion->uuid]);
716
            } else {
717
                $link_answers_add = '';
718
            }
719
 
720
 
721
 
722
            $myCoachLastAnswer = $myCoachAnswerMapper->fetchOneLastAnswerByQuestionId($myCoachQuestion->id);
723
 
724
            if( $myCoachLastAnswer) {
725
                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $myCoachLastAnswer->added_on);
726
                $last_answer_on = $dt->format('d/m/Y H:i a');
727
 
728
 
729
 
730
            } else {
731
                $last_answer_on = '';
732
            }
733
 
734
 
735
            return new JsonModel([
736
                'success' => true,
737
                'data' => [
738
                    'uuid' => $myCoachQuestion->uuid,
739
                    'user_name' => trim($user->first_name . ' ' . $user->last_name),
60 efrain 740
                    'user_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image],['force_canonical' => true]),
1 efrain 741
                    'title' => $myCoachQuestion->title,
742
                    'description' => $myCoachQuestion->description,
743
                    'categories' => $bags_categories,
744
                    'views' => intval($myCoachQuestionViewMapper->fetchCountByQuestionId($myCoachQuestion->id) , 10),
745
                    'answers' => intval($myCoachAnswerMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id) , 10),
746
                    'reactions' => intval($contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id), 10),
747
                    'comments' => intval($commentMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id), 10),
748
                    'added_on' => $added_on,
749
                    'updated_on' => $updated_on,
750
                    'last_answer_on' => $last_answer_on,
751
                    'link_answers' => $this->url()->fromRoute('my-coach/questions/answers', ['id' => $myCoachQuestion->uuid]),
752
                    'link_answers_add' => $link_answers_add,
753
                    'link_delete' => $link_delete,
754
                ]
755
 
756
            ]);
757
 
758
 
759
        } else {
760
            return new JsonModel([
761
                'success' => false,
762
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
763
            ]);
764
        }
765
 
766
 
767
 
768
 
769
 
770
    }
771
 
772
    /**
773
     *
774
     * {@inheritDoc}
775
     * @see \Laminas\Mvc\Controller\AbstractActionController::indexAction()
776
     */
777
    public function answersAction()
778
    {
779
        $currentUserPlugin = $this->plugin('currentUserPlugin');
780
        $currentUser = $currentUserPlugin->getUser();
781
 
782
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
783
        $currentNetwork = $currentNetworkPlugin->getNetwork();
784
 
785
        $request    = $this->getRequest();
786
        $id    = $this->params()->fromRoute('id');
787
 
788
        $message_error = '';
789
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
790
        if(!$myCoachAccessControl->hasAccessViewQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
791
            return new JsonModel([
792
                'success'   => false,
793
                'data'   => $message_error
794
            ]);
795
        }
796
 
797
 
798
 
799
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
800
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
801
 
802
        $request = $this->getRequest();
803
        if ($request->isGet()) {
804
 
805
 
806
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
807
            $now = $myCoachAnswerMapper->getDatebaseNow();
808
 
809
            $records = $myCoachAnswerMapper->fetchAllByQuestionId($myCoachQuestion->id);
810
 
811
 
812
            $items = [];
813
 
814
            foreach($records as $record)
815
            {
816
                $items[] = $this->renderAnswer($record->id, $currentUser->id, $now);
817
            }
818
 
819
 
820
 
821
            return new JsonModel([
822
                'success' => true,
823
                'data' => [
824
                    'items' => $items
825
                ]
826
            ]);
827
 
828
 
829
        } else {
830
            return new JsonModel([
831
                'success' => false,
832
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
833
            ]);
834
        }
835
    }
836
 
837
    public function deleteAnswerAction()
838
    {
839
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
840
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
841
 
842
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
843
        $currentUser        = $currentUserPlugin->getUser();
844
 
845
        $request    = $this->getRequest();
846
        $answer     = $this->params()->fromRoute('answer');
847
 
848
        $message_error = '';
849
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
850
        if(!$myCoachAccessControl->hasAccessEditOrDeleteAnswer($currentUser->id, $answer, $currentNetwork->id, $message_error)) {
851
            return new JsonModel([
852
                'success'   => false,
853
                'data'   => $message_error
854
            ]);
855
        }
856
 
857
 
858
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
859
        $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($answer);
860
 
861
        if ($request->isPost()) {
862
 
863
            if($myCoachAnswerMapper->delete($myCoachAnswer)) {
864
 
865
                $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
866
                $commentMapper = CommentMapper::getInstance($this->adapter);
867
 
868
 
869
                $this->logger->info('Se borro la respuesta ' . $myCoachAnswer->text, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
870
 
871
                $data = [
872
                    'success'   => true,
873
                    'data'   => [
874
                        'total_comments' => intval($commentMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10),
875
                        'total_answers' => intval($myCoachAnswerMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10),
876
                        'total_reactions' => intval($contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10)
877
 
878
                    ]
879
                ];
880
            } else {
881
                $data = [
882
                    'success'   => false,
883
                    'data'      => $myCoachAnswerMapper->getError()
884
                ];
885
            }
886
        } else {
887
            $data = [
888
                'success' => false,
889
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
890
            ];
891
 
892
 
893
        }
894
        return new JsonModel($data);
895
 
896
 
897
    }
898
 
899
 
900
    public function editAnswerAction()
901
    {
902
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
903
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
904
 
905
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
906
        $currentUser        = $currentUserPlugin->getUser();
907
 
908
        $request    = $this->getRequest();
909
        $answer     = $this->params()->fromRoute('answer');
910
 
911
        $message_error = '';
912
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
913
        if(!$myCoachAccessControl->hasAccessEditOrDeleteAnswer($currentUser->id, $answer, $currentNetwork->id, $message_error)) {
914
            return new JsonModel([
915
                'success'   => false,
916
                'data'   => $message_error
917
            ]);
918
        }
919
 
920
 
921
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
922
        $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($answer);
923
 
924
        if ($request->isPost()) {
925
 
926
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
927
            $form = new MyCoachAnswerForm();
928
            $form->setData($dataPost);
929
 
930
            if ($form->isValid()) {
931
                $myCoachAnswer->text        = $dataPost['description'];
932
 
933
                if($myCoachAnswerMapper->update($myCoachAnswer)) {
934
 
935
                    $this->logger->info('Se edito la respuesta ' . $myCoachAnswer->text, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
936
 
937
                    $data = [
938
                        'success'   => true,
939
                        'data'   => [
940
                            'description' => $myCoachAnswer->text
941
                        ]
942
                    ];
943
                } else {
944
                    $data = [
945
                        'success'   => false,
946
                        'data'      => $myCoachAnswerMapper->getError()
947
                    ];
948
                }
949
 
950
                return new JsonModel($data);
951
            } else {
952
                $messages = [];
953
                $form_messages = (array) $form->getMessages();
954
                foreach ($form_messages  as $fieldname => $field_messages)
955
                {
956
                    $messages[$fieldname] = array_values($field_messages);
957
                }
958
 
959
                return new JsonModel([
960
                    'success'   => false,
961
                    'data'   => $messages
962
                ]);
963
            }
964
        } else  if ($request->isGet()) {
965
            return new JsonModel([
966
                'success'   => true,
967
                'data'   => [
968
                    'description' => $myCoachAnswer->text
969
                ]
970
            ]);
971
        } else {
972
            $data = [
973
                'success' => false,
974
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
975
            ];
976
 
977
            return new JsonModel($data);
978
        }
979
 
980
 
981
    }
982
 
983
 
984
 
985
 
986
 
987
    public function addAnswerAction()
988
    {
989
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
990
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
991
 
992
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
993
        $currentUser        = $currentUserPlugin->getUser();
994
 
995
        $request    = $this->getRequest();
996
        $id    = $this->params()->fromRoute('id');
997
 
998
        $message_error = '';
999
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1000
        if(!$myCoachAccessControl->hasAccessAnswerQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1001
            return new JsonModel([
1002
                'success'   => false,
1003
                'data'   => $message_error
1004
            ]);
1005
        }
1006
 
1007
 
1008
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
1009
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
1010
 
1011
        if ($request->isPost()) {
1012
 
1013
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
1014
            $form = new MyCoachAnswerForm();
1015
            $form->setData($dataPost);
1016
 
1017
            if ($form->isValid()) {
1018
 
1019
                $myCoachAnswer = new MyCoachAnswer();
1020
                $myCoachAnswer->question_id = $myCoachQuestion->id;
1021
                $myCoachAnswer->text        = $dataPost['description'];
1022
                $myCoachAnswer->user_id     = $currentUser->id;
1023
 
1024
 
1025
                $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1026
                if($myCoachAnswerMapper->insert($myCoachAnswer)) {
1027
                    $now = $myCoachAnswerMapper->getDatebaseNow();
1028
 
1029
                    $this->logger->info('Se agrego la respuesta ' . $myCoachAnswer->text, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
1030
 
1031
                    $data = [
1032
                        'success'   => true,
1033
                        'data'   => [
1034
                            'answers' => $myCoachAnswerMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id),
1035
                            'item' => $this->renderAnswer($myCoachAnswer->id, $currentUser->id, $now)
1036
                        ]
1037
                    ];
1038
                } else {
1039
                    $data = [
1040
                        'success'   => false,
1041
                        'data'      => $myCoachQuestionMapper->getError()
1042
                    ];
1043
                }
1044
 
1045
                return new JsonModel($data);
1046
            } else {
1047
                $messages = [];
1048
                $form_messages = (array) $form->getMessages();
1049
                foreach ($form_messages  as $fieldname => $field_messages)
1050
                {
1051
                    $messages[$fieldname] = array_values($field_messages);
1052
                }
1053
 
1054
                return new JsonModel([
1055
                    'success'   => false,
1056
                    'data'   => $messages
1057
                ]);
1058
            }
1059
 
1060
        } else {
1061
            $data = [
1062
                'success' => false,
1063
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1064
            ];
1065
 
1066
            return new JsonModel($data);
1067
        }
1068
 
1069
 
1070
    }
60 efrain 1071
 
1 efrain 1072
 
1073
 
1074
    public function addCommentAction()
1075
    {
1076
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1077
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1078
 
1079
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1080
        $currentUser        = $currentUserPlugin->getUser();
1081
 
1082
        $request    = $this->getRequest();
1083
        $id    = $this->params()->fromRoute('id');
1084
 
1085
 
1086
        $request = $this->getRequest();
1087
        if ($request->isPost()) {
1088
 
1089
            $message_error = '';
1090
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1091
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1092
                return new JsonModel([
1093
                    'success'   => false,
1094
                    'data'   => $message_error
1095
                ]);
1096
            }
1097
 
1098
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1099
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1100
 
1101
            $dataPost = $request->getPost()->toArray();
1102
            $form = new CommentForm();
1103
            $form->setData($dataPost);
1104
 
1105
            if ($form->isValid()) {
1106
 
1107
 
1108
                $currentUserPlugin = $this->plugin('currentUserPlugin');
1109
                $currentUser = $currentUserPlugin->getUser();
1110
 
1111
                $dataPost = (array) $form->getData();
1112
 
1113
 
1114
 
1115
                $comment = new Comment();
1116
                $comment->network_id = $currentUser->network_id;
1117
                $comment->comment = $dataPost['comment'];
1118
                $comment->user_id = $currentUser->id;
1119
                $comment->my_coach_answer_id = $myCoachAnswer->id;
1120
                $comment->relational = Comment::RELATIONAL_MY_COACH;
1121
 
1122
                $commentMapper = CommentMapper::getInstance($this->adapter);
1123
                if ($commentMapper->insert($comment)) {
1124
                    $now = $commentMapper->getDatebaseNow();
1125
 
1126
                    $response = [
1127
                        'success'           => true,
1128
                        'data'              => [
1129
                            'item'  => $this->renderComment($comment->id, $now),
1130
                            'total_comments_answer' => intval( $commentMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10),
1131
                            'total_comments_question' => intval( $commentMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10),
1132
                        ]
1133
                    ];
1134
 
1135
                    return new JsonModel($response);
1136
                } else {
1137
 
1138
                    $response = [
1139
                        'success'   => false,
1140
                        'data'   => $commentMapper->getError()
1141
                    ];
1142
 
1143
                    return new JsonModel($response);
1144
                }
1145
            } else {
1146
                $message = '';;
1147
                $form_messages = (array) $form->getMessages();
1148
                foreach ($form_messages  as $fieldname => $field_messages) {
1149
                    foreach ($field_messages as $key => $value) {
1150
                        $message = $value;
1151
                    }
1152
                }
1153
 
1154
                $response = [
1155
                    'success'   => false,
1156
                    'data'   => $message
1157
                ];
1158
 
1159
                return new JsonModel($response);
1160
            }
1161
        } else {
1162
            $response = [
1163
                'success' => false,
1164
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1165
            ];
1166
 
1167
            return new JsonModel($response);
1168
        }
1169
    }
1170
 
1171
 
1172
 
1173
    public function deleteCommentAction()
1174
    {
1175
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1176
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1177
 
1178
        $currentUserPlugin      = $this->plugin('currentUserPlugin');
1179
        $currentUser            = $currentUserPlugin->getUser();
1180
 
1181
        $request                = $this->getRequest();
1182
        $id                     = $this->params()->fromRoute('id');
1183
        $comment                = $this->params()->fromRoute('comment');
1184
 
1185
 
1186
        $request = $this->getRequest();
1187
        if ($request->isPost()) {
1188
 
1189
 
1190
 
1191
 
1192
            $message_error = '';
1193
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1194
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1195
                return new JsonModel([
1196
                    'success'   => false,
1197
                    'data'   => $message_error
1198
                ]);
1199
            }
1200
 
1201
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1202
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1203
 
1204
            $commentMapper = CommentMapper::getInstance($this->adapter);
1205
            $comment = $commentMapper->fetchOneByUuid($comment);
1206
 
1207
 
1208
            if ($comment && $comment->my_coach_answer_id == $myCoachAnswer->id && $comment->user_id == $currentUser->id) {
1209
 
1210
                $comment->status = Comment::STATUS_DELETED;
1211
 
1212
                if ($commentMapper->update($comment)) {
1213
 
1214
                    $response = [
1215
                        'success' => true,
1216
                        'data' => [
1217
                            'message' => 'LABEL_COMMENT_WAS_DELETED',
1218
                            'total_comments_answer' => intval( $commentMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10),
1219
                            'total_comments_question' => intval( $commentMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10),
1220
                        ]
1221
                    ];
1222
                } else {
1223
                    $response = [
1224
                        'success' => false,
1225
                        'data' => $commentMapper->getError()
1226
                    ];
1227
 
1228
                }
1229
            } else {
1230
                $response = [
1231
                    'success' => false,
1232
                    'data' => 'ERROR_COMMENT_NOT_FOUND'
1233
                ];
1234
            }
1235
        } else {
1236
            $response = [
1237
                'success' => false,
1238
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1239
            ];
1240
        }
1241
 
1242
        return new JsonModel($response);
1243
    }
1244
 
1245
    public function reactionsAction()
1246
    {
1247
        return new JsonModel([
1248
            'success' => false,
1249
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1250
        ]);
1251
 
1252
    }
1253
 
1254
 
1255
 
1256
    public function saveReactionAction()
1257
    {
1258
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1259
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1260
 
1261
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1262
        $currentUser        = $currentUserPlugin->getUser();
1263
 
1264
        $request    = $this->getRequest();
1265
 
1266
        $id = $this->params()->fromRoute('id');
1267
        $reaction  = $this->params()->fromPost('reaction');
1268
 
1269
        $request = $this->getRequest();
1270
        if ($request->isPost()) {
1271
 
1272
 
1273
            $message_error = '';
1274
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1275
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1276
                return new JsonModel([
1277
                    'success'   => false,
1278
                    'data'   => $message_error
1279
                ]);
1280
            }
1281
 
1282
            $reactions = [
1283
                ContentReaction::REACTION_RECOMMENDED,
1284
                ContentReaction::REACTION_SUPPORT,
1285
                ContentReaction::REACTION_LOVE,
1286
                ContentReaction::REACTION_INTEREST,
1287
                ContentReaction::REACTION_FUN
1288
 
1289
            ];
1290
            if(!in_array($reaction, $reactions)) {
1291
                $response = [
1292
                    'success' => false,
1293
                    'data' => 'ERROR_REACTION_NOT_FOUND'
1294
                ];
1295
                return new JsonModel($response);
1296
            }
1297
 
1298
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1299
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1300
 
1301
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
1302
            $contentReaction = $contentReactionMapper->fetchOneByMyCoachAnswerIdAndUserId($myCoachAnswer->id, $currentUser->id);
1303
 
1304
            if ($contentReaction) {
1305
                $contentReaction->reaction = $reaction;
1306
 
1307
                $result = $contentReactionMapper->update($contentReaction);
1308
            } else {
1309
                $contentReaction = new ContentReaction();
1310
                $contentReaction->user_id = $currentUser->id;
1311
                $contentReaction->my_coach_answer_id = $myCoachAnswer->id;
1312
                $contentReaction->relational = ContentReaction::RELATIONAL_MY_COACH;
1313
                $contentReaction->reaction = $reaction;
1314
 
1315
                $result = $contentReactionMapper->insert($contentReaction);
1316
            }
1317
 
1318
 
1319
 
1320
            if ($result) {
1321
 
1322
                $total_reactions_question = intval($contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10);
1323
                $total_reactions_answer = intval($contentReactionMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10);
1324
                $response = [
1325
                    'success' => true,
1326
                    'data' => [
1327
                        'reaction' => $reaction,
1328
                        'total_reactions_question' => $total_reactions_question,
1329
                        'total_reactions_answer' => $total_reactions_answer
1330
                    ]
1331
                ];
1332
            } else {
1333
                $response = [
1334
                    'success' => false,
1335
                    'data' => $contentReactionMapper->getError()
1336
                ];
1337
            }
1338
            return new JsonModel($response);
1339
        }
1340
 
1341
        $response = [
1342
            'success' => false,
1343
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1344
        ];
1345
        return new JsonModel($response);
1346
    }
1347
 
1348
    public function deleteReactionAction()
1349
    {
1350
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1351
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1352
 
1353
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1354
        $currentUser        = $currentUserPlugin->getUser();
1355
 
1356
        $request    = $this->getRequest();
1357
 
1358
        $id = $this->params()->fromRoute('id');
1359
 
1360
        $request = $this->getRequest();
1361
        if ($request->isPost()) {
1362
 
1363
            $message_error = '';
1364
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1365
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1366
                return new JsonModel([
1367
                    'success'   => false,
1368
                    'data'   => $message_error
1369
                ]);
1370
            }
1371
 
1372
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1373
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1374
 
1375
 
1376
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
1377
            $contentReaction = $contentReactionMapper->fetchOneByMyCoachAnswerIdAndUserId($myCoachAnswer->id, $currentUser->id);
1378
 
1379
            if ($contentReaction) {
1380
                if ($contentReactionMapper->deleteByByMyCoachAnswerId($myCoachAnswer->id, $currentUser->id)) {
1381
                    $total_reactions_question = intval($contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10);
1382
                    $total_reactions_answer = intval($contentReactionMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10);
1383
 
1384
                    $response = [
1385
                        'success' => true,
1386
                        'data' => [
1387
                            'total_reactions_question' => $total_reactions_question,
1388
                            'total_reactions_answer' => $total_reactions_answer
1389
                        ]
1390
                    ];
1391
                } else {
1392
                    $response = [
1393
                        'success' => false,
1394
                        'data' => $contentReactionMapper->getError()
1395
                    ];
1396
                }
1397
            } else {
1398
                $total_reactions_question = $contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id);
1399
                $total_reactions_answer = $contentReactionMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id);
1400
 
1401
                $response = [
1402
                    'success' => true,
1403
                    'data' => [
1404
                        'total_reactions_question' => $total_reactions_question,
1405
                        'total_reactions_answer' => $total_reactions_answer
1406
                    ]
1407
                ];
1408
 
1409
 
1410
            }
1411
 
1412
 
1413
 
1414
            return new JsonModel($response);
1415
        }
1416
 
1417
        $response = [
1418
            'success' => false,
1419
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1420
        ];
1421
        return new JsonModel($response);
1422
    }
1423
 
1424
    public function commentsAction()
1425
    {
1426
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1427
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1428
 
1429
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1430
        $currentUser        = $currentUserPlugin->getUser();
1431
 
1432
 
1433
        $id = $this->params()->fromRoute('id');
1434
 
1435
        $request = $this->getRequest();
1436
        if ($request->isGet()) {
1437
            $message_error = '';
1438
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1439
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1440
                return new JsonModel([
1441
                    'success'   => false,
1442
                    'data'   => $message_error
1443
                ]);
1444
            }
1445
 
1446
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1447
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1448
            $now = $myCoachAnswerMapper->getDatebaseNow();
1449
 
1450
            $commentMapper = CommentMapper::getInstance($this->adapter);
1451
            $records = $commentMapper->fetchAllPublishedByMyCoachAnswerId($myCoachAnswer->id);
1452
 
1453
            $comments = [];
1454
            foreach ($records as $record) {
1455
                $comment = $this->renderComment($record->id, $now);
1456
                array_push($comments, $comment);
1457
            }
1458
 
1459
            $response = [
1460
                'success' => true,
1461
                'data' => $comments
1462
            ];
1463
 
1464
            return new JsonModel($response);
1465
        } else {
1466
 
1467
 
1468
 
1469
            $response = [
1470
                'success' => false,
1471
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1472
            ];
1473
 
1474
 
1475
            return new JsonModel($response);
1476
        }
1477
    }
1478
 
1479
 
1480
    private function renderAnswer($answer_id, $current_user_id, $now)
1481
    {
1482
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1483
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1484
        $message_error = '';
1485
 
1486
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1487
        $myCoachAnswer =  $myCoachAnswerMapper->fetchOne($answer_id);
1488
 
1489
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
1490
        $myCoachQuestion = $myCoachQuestionMapper->fetchOne($myCoachAnswer->question_id);
1491
 
1492
 
1493
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1494
        $hasAccessEditOrDeleteAnswer = $myCoachAccessControl->hasAccessEditOrDeleteAnswer($current_user_id, $answer_id, $currentNetwork->id, $message_error);
1495
        if($hasAccessEditOrDeleteAnswer) {
1496
 
1497
 
1498
            $link_edit = $this->url()->fromRoute('my-coach/questions/answers/edit',['id' => $myCoachQuestion->uuid, 'answer' => $myCoachAnswer->uuid]);
1499
            $link_delete = $this->url()->fromRoute('my-coach/questions/answers/delete',['id' => $myCoachQuestion->uuid, 'answer' => $myCoachAnswer->uuid]);
1500
 
1501
        } else {
1502
            $link_edit = '';
1503
            $link_delete = '';
1504
        }
1505
 
1506
        $userMapper = UserMapper::getInstance($this->adapter);
1507
        $user = $userMapper->fetchOne($myCoachAnswer->user_id);
1508
 
1509
        $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
1510
        $contentReaction = $contentReactionMapper->fetchOneByMyCoachAnswerIdAndUserId($myCoachAnswer->id, $current_user_id);
1511
        $total_reactions = intval($contentReactionMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10);
1512
 
1513
 
1514
 
1515
 
1516
        $comments = [];
1517
        $commentMapper = CommentMapper::getInstance($this->adapter);
1518
        $total_comments = $commentMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id);
1519
        $records = $commentMapper->fetchAllPublishedByMyCoachAnswerId($myCoachAnswer->id);
1520
        foreach($records as $record)
1521
        {
1522
            $comments[] = $this->renderComment($record->id, $now);
1523
        }
1524
 
1525
 
1526
        $item = [
1527
            'unique' => uniqid(),
1528
            'uuid' => $myCoachAnswer->uuid,
1529
            'question_uuid' => $myCoachQuestion->uuid,
60 efrain 1530
            'user_image' => $this->url()->fromRoute('storage', ['type' => 'user',  'code' => $user->uuid, 'filename' =>  $user->image],['force_canonical' => true]),
1 efrain 1531
            'user_url' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
1532
            'user_name' => $user->first_name . ' ' . $user->last_name,
1533
            'time_elapsed' => Functions::timeAgo($myCoachAnswer->added_on, $now),
1534
            'text' => $myCoachAnswer->text,
1535
            'reaction' => $contentReaction ? $contentReaction->reaction : '',
1536
            'total_comments' => $total_comments,
1537
            'total_reactions' => $total_reactions,
1538
            'comments' => $comments,
1539
            'link_edit' => $link_edit,
1540
            'link_delete' => $link_delete,
1541
            'link_reaction_delete' => $this->url()->fromRoute('my-coach/questions/reaction/delete', ['id' => $myCoachAnswer->uuid]),
1542
            'link_save_reaction' => $this->url()->fromRoute('my-coach/questions/reaction/save', ['id' => $myCoachAnswer->uuid]),
1543
            'link_add_comment' => $this->url()->fromRoute('my-coach/questions/comments/add', ['id' => $myCoachAnswer->uuid]),
1544
        ];
1545
 
1546
        return $item;
1547
 
1548
 
1549
 
1550
    }
1551
 
1552
 
1553
 
1554
    private function renderComment($comment_id, $now)
1555
    {
1556
        $item = [];
1557
 
1558
        $commentMapper = CommentMapper::getInstance($this->adapter);
1559
        $record = $commentMapper->fetchOne($comment_id);
1560
 
1561
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1562
        $myCoachAnswer = $myCoachAnswerMapper->fetchOne($record->my_coach_answer_id);
1563
 
1564
 
1565
        if ($record) {
1566
            $userMapper = UserMapper::getInstance($this->adapter);
1567
 
1568
            $user = $userMapper->fetchOne($record->user_id);
1569
 
1570
            $item['unique'] = uniqid();
1571
            $item['answer_uuid'] = $myCoachAnswer->uuid;
60 efrain 1572
            $item['user_image'] = $this->url()->fromRoute('storage', ['type' => 'user',  'code' => $user->uuid, 'filename' =>  $user->image],['force_canonical' => true]);
1 efrain 1573
            $item['user_url'] = $this->url()->fromRoute('profile/view', ['id' => $user->uuid]);
1574
            $item['user_name'] = $user->first_name . ' ' . $user->last_name;
1575
            $item['time_elapsed'] = Functions::timeAgo($record->added_on, $now);
1576
            $item['comment'] = $record->comment;
1577
            $item['link_delete'] = $this->url()->fromRoute('my-coach/questions/comments/delete', ['id' => $myCoachAnswer->uuid, 'comment' => $record->uuid]);
1578
        }
1579
        return $item;
1580
    }
1581
 
1582
}