Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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

Rev Autor Línea Nro. Línea
5050 efrain 1
<?php
2
declare(strict_types=1);
3
 
4
namespace LeadersLinked\Controller;
5
 
6
use Laminas\Db\Adapter\AdapterInterface;
6849 efrain 7
 
5050 efrain 8
use Laminas\Mvc\Controller\AbstractActionController;
9
use Laminas\Log\LoggerInterface;
10
use Laminas\View\Model\ViewModel;
11
use Laminas\View\Model\JsonModel;
6388 efrain 12
use LeadersLinked\Mapper\MyCoachCategoryMapper;
6521 efrain 13
 
6388 efrain 14
use LeadersLinked\Form\MyCoach\MyCoachQuestionForm;
6521 efrain 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
use Laminas\Db\Sql\Expression;
5050 efrain 38
 
39
class MyCoachController extends AbstractActionController
40
{
41
    /**
42
     *
6866 efrain 43
     * @var \Laminas\Db\Adapter\AdapterInterface
5050 efrain 44
     */
45
    private $adapter;
6866 efrain 46
 
5050 efrain 47
    /**
48
     *
6866 efrain 49
     * @var \LeadersLinked\Cache\CacheInterface
5050 efrain 50
     */
6866 efrain 51
    private $cache;
52
 
53
 
54
    /**
55
     *
56
     * @var \Laminas\Log\LoggerInterface
57
     */
5050 efrain 58
    private $logger;
6866 efrain 59
 
5050 efrain 60
    /**
61
     *
62
     * @var array
63
     */
64
    private $config;
6866 efrain 65
 
66
 
5050 efrain 67
    /**
68
     *
6866 efrain 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
5050 efrain 79
     * @param array $config
6866 efrain 80
     * @param \Laminas\Mvc\I18n\Translator $translator
5050 efrain 81
     */
6866 efrain 82
    public function __construct($adapter, $cache, $logger, $config, $translator)
5050 efrain 83
    {
84
        $this->adapter      = $adapter;
6866 efrain 85
        $this->cache        = $cache;
5050 efrain 86
        $this->logger       = $logger;
87
        $this->config       = $config;
6866 efrain 88
        $this->translator   = $translator;
6388 efrain 89
    }
5050 efrain 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
    {
6388 efrain 99
        $currentUserPlugin = $this->plugin('currentUserPlugin');
100
        $currentUser = $currentUserPlugin->getUser();
101
 
102
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
103
        $currentNetwork = $currentNetworkPlugin->getNetwork();
104
 
5050 efrain 105
        $request = $this->getRequest();
6388 efrain 106
        if ($request->isGet()) {
6521 efrain 107
 
108
            $myCoachAccesControl = MyCoachAccessControl::getInstance($this->adapter);
109
            $categories = $myCoachAccesControl->getCategoriesWithAccessToFormSelect($currentUser->id, $currentNetwork->id);
110
 
111
            $formQuestion = new MyCoachQuestionForm($categories);
112
            $formAnswer = new MyCoachAnswerForm();
5050 efrain 113
 
6388 efrain 114
 
6521 efrain 115
            $this->layout()->setTemplate('layout/layout');
116
            $viewModel = new ViewModel();
117
            $viewModel->setTemplate('leaders-linked/my-coach/index');
118
            $viewModel->setVariables([
119
                'categories' => $categories,
120
                'formQuestion' => $formQuestion,
121
                'formAnswer' => $formAnswer,
122
            ]);
123
            return $viewModel;
6388 efrain 124
 
6521 efrain 125
        } else {
126
            return new JsonModel([
127
                'success' => false,
128
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
129
            ]);
130
        }
131
    }
132
 
133
    public function questionsAction()
134
    {
135
        $currentUserPlugin = $this->plugin('currentUserPlugin');
136
        $currentUser = $currentUserPlugin->getUser();
137
 
138
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
139
        $currentNetwork = $currentNetworkPlugin->getNetwork();
140
 
141
 
142
        $request = $this->getRequest();
143
        if ($request->isGet()) {
144
            $userMapper                     = UserMapper::getInstance($this->adapter);
145
            $myCoachCategoryMapper          = MyCoachCategoryMapper::getInstance($this->adapter);
146
            $myCoachQuestionCategoryMapper  = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
147
            $myCoachAccessControl           = MyCoachAccessControl::getInstance($this->adapter);
148
 
6749 efrain 149
            $category_filter_id = Functions::sanitizeFilterString($this->params()->fromQuery('category_id'));
150
            $search = Functions::sanitizeFilterString($this->params()->fromQuery('search'));
6521 efrain 151
            $page   = intval($this->params()->fromQuery('start', 1), 10);
152
 
153
            $order_field        = 'added_on';
154
            $order_direction    = 'asc';
155
            $records_x_page     = 12;
156
 
6685 efrain 157
 
6521 efrain 158
            if ($category_filter_id) {
159
 
160
                $message_error = '';
161
                if(!$myCoachAccessControl->hasAccessForCategory($currentUser->id, $category_filter_id, $currentNetwork->id, $message_error)) {
162
 
163
                    return new JsonModel([
164
                        'success' => true,
165
                        'data' => $message_error,
166
                    ]);
167
 
6388 efrain 168
                }
6521 efrain 169
 
170
                $categoryFilter = $myCoachCategoryMapper->fetchOneByUuid($category_filter_id);
171
                $category_ids = [$categoryFilter->id];
172
            } else {
173
                $category_ids = $myCoachAccessControl->getCategoryIdsWithAccess($currentUser->id, $currentNetwork->id);
174
            }
175
 
176
            $category_ids_with_edition = $myCoachAccessControl->getCategoryIdsWithEdition($currentUser->id);
177
 
178
            $queryMapper = QueryMapper::getInstance($this->adapter);
179
 
180
            $prototype = new MyCoachQuestion();
181
            $selectIn = $queryMapper->getSql()->select(MyCoachQuestionCategoryMapper::_TABLE);
6685 efrain 182
            $selectIn->columns(['question_id']);
6521 efrain 183
            $selectIn->where->in('category_id', $category_ids);
184
 
185
 
186
 
187
            $select = $queryMapper->getSql()->select(MyCoachQuestionMapper::_TABLE);
188
            $select->where->in('id', $selectIn);
189
 
190
            if($search) {
191
                $select->where->nest()
192
                -> like('title', '%' . $search . '%')->or->like('description', '%' . $search . '%')
193
                ->unnest();
194
            }
195
            $select->order($order_field . ' ' . $order_direction);
196
 
197
            //echo $select->getSqlString($this->adapter->platform);
198
            //exit;
199
 
200
 
201
            $users = [];
202
            $categories = [];
203
            //echo $select->getSqlString($this->adapter->platform); exit;
204
 
205
            $hydrator   = new ObjectPropertyHydrator();
206
            $resultset  = new HydratingResultSet($hydrator, $prototype);
207
 
208
            $adapter = new DbSelect($select, $queryMapper->getSql(), $resultset);
209
            $paginator = new Paginator($adapter);
210
            $paginator->setItemCountPerPage($records_x_page);
211
            $paginator->setCurrentPageNumber($page);
212
 
213
 
214
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
215
            $commentMapper = CommentMapper::getInstance($this->adapter);
216
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
217
            $myCoachQuestionViewMapper = MyCoachQuestionViewMapper::getInstance($this->adapter);
218
 
219
            $items = [];
220
            $records = $paginator->getCurrentItems();
221
            foreach ($records as $record)
222
            {
223
                $bags_categories = [];
224
 
225
                $questionCategories = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($record->id);
6388 efrain 226
 
6521 efrain 227
 
228
 
229
 
230
                $allowEdit   = $myCoachAccessControl->hasAccessEditQuestion($currentUser->id, $record->id, $currentNetwork->id, $message_error);
231
                $allowDelete = $myCoachAccessControl->hasAccessDeleteQuestion($currentUser->id, $record->id, $currentNetwork->id, $message_error);
232
                foreach($questionCategories as $questionCategory)
233
                {
234
                    if(in_array($questionCategory->category_id, $category_ids_with_edition)) {
235
 
236
                        $allowDelete = true;
237
                    }
238
 
239
                    if (!isset($categories[$questionCategory->category_id])) {
240
                        $category = $myCoachCategoryMapper->fetchOne($questionCategory->category_id);
241
                        if ($category) {
242
                            $categories[$category->id] = $category->name;
243
 
6388 efrain 244
                        }
245
                    }
6521 efrain 246
 
247
                    array_push($bags_categories,['category' => $categories[ $questionCategory->category_id ] ]);
6388 efrain 248
                }
6521 efrain 249
 
250
                if(isset($users[$record->user_id])) {
251
                    $user = $users[ $record->user_id ];
252
                } else {
253
                    $user = $userMapper->fetchOne($record->user_id);
254
                    $users[ $record->user_id ] = $user;
255
                }
256
 
257
 
258
                $description = strip_tags($record->description);
259
                if (strlen($description) > 250) {
260
                    $description = substr($description, 0, 250) . '...';
261
                }
262
 
263
 
264
                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);
265
                $added_on = $dt->format('d/m/Y H:i a');
266
 
267
                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->updated_on);
268
                $updated_on = $dt->format('d/m/Y H:i a');
269
 
270
                $item = [
271
                    'uuid' => $record->uuid,
272
                    'user_name' => trim($user->first_name . ' ' . $user->last_name),
273
                    'user_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]),
274
                    'title' => $record->title,
275
                    'description' => $description,
276
                    'categories' => $bags_categories,
277
                    'views' => intval($myCoachQuestionViewMapper->fetchCountByQuestionId($record->id), 10),
278
                    'answers' =>  intval($myCoachAnswerMapper->fetchCountByMyCoachQuestionId($record->id), 10),
279
                    'reactions' => intval($contentReactionMapper->fetchCountByMyCoachQuestionId($record->id), 10),
280
                    'comments' =>  intval($commentMapper->fetchCountByMyCoachQuestionId($record->id), 10),
281
                    'added_on' => $added_on,
282
                    'updated_on' => $updated_on,
283
                    'link_add_comment' => $this->url()->fromRoute('my-coach/questions/comments/add', ['id' => $record->uuid]),
284
                    'link_view' => $this->url()->fromRoute('my-coach/questions/view', ['id' => $record->uuid]),
285
                    'link_edit' => $allowEdit ?  $this->url()->fromRoute('my-coach/questions/edit', ['id' => $record->uuid]) : '',
286
                    'link_delete' => $allowDelete ? $this->url()->fromRoute('my-coach/questions/delete', ['id' =>  $record->uuid]) : '',
287
                ];
288
 
289
                array_push($items, $item);
290
            }
291
 
292
            return new JsonModel([
293
                'success' => true,
294
                'data' => [
295
                    'items' => $items,
296
                    'total' => $paginator->getTotalItemCount(),
297
                    'page' => $paginator->getCurrentPageNumber(),
298
                    'total_pages' => $paginator->getPageRange()
299
                ]
300
            ]);
301
 
302
 
303
        } else {
304
            return new JsonModel([
305
                'success' => false,
306
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
307
            ]);
308
        }
309
    }
310
 
311
    public function addQuestionAction()
312
    {
313
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
314
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
315
 
316
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
317
        $currentUser        = $currentUserPlugin->getUser();
318
 
319
        $request            = $this->getRequest();
320
 
321
        if ($request->isPost()) {
322
 
323
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
324
 
325
 
326
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
327
            $categories = $myCoachAccessControl->getCategoriesWithAccessToFormSelect($currentUser->id, $currentNetwork->id);
328
 
329
            $form = new MyCoachQuestionForm($categories);
330
            $form->setData($dataPost);
331
 
332
            if ($form->isValid()) {
333
                $dataPost = (array) $form->getData();
334
 
335
                $myCoachQuestion = new MyCoachQuestion();
336
                $myCoachQuestion->network_id    = $currentNetwork ->id;
337
                $myCoachQuestion->user_id       = $currentUser->id;
338
                $myCoachQuestion->title         = $dataPost['title'];
339
                $myCoachQuestion->description   = $dataPost['description'];
340
 
341
 
342
                $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
343
                if ($myCoachQuestionMapper->insert($myCoachQuestion)) {
344
                    $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
345
                    $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
346
 
347
                    $category_ids = $dataPost['category_id'];
348
                    foreach($category_ids as $category_id)
349
                    {
350
                        $myCoachCategory = $myCoachCategoryMapper->fetchOneByUuid($category_id);
351
                        if($myCoachCategory) {
352
                            $myCoachQuestionCategory = new MyCoachQuestionCategory();
353
                            $myCoachQuestionCategory->category_id = $myCoachCategory->id;
354
                            $myCoachQuestionCategory->question_id = $myCoachQuestion->id;
355
 
356
                            $myCoachQuestionCategoryMapper->insert($myCoachQuestionCategory);
357
                        }
358
                    }
359
 
360
 
361
                    $this->logger->info('Se agrego la pregunta ' . $myCoachQuestion->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
362
 
363
                    $data = [
364
                        'success'   => true,
365
                        'data'   => 'LABEL_RECORD_ADDED'
366
                    ];
367
                } else {
368
                    $data = [
369
                        'success'   => false,
370
                        'data'      => $myCoachQuestionMapper->getError()
371
                    ];
372
                }
373
 
374
                return new JsonModel($data);
375
            } else {
376
                $messages = [];
377
                $form_messages = (array) $form->getMessages();
378
                foreach ($form_messages  as $fieldname => $field_messages)
379
                {
380
                    $messages[$fieldname] = array_values($field_messages);
381
                }
382
 
383
                return new JsonModel([
384
                    'success'   => false,
385
                    'data'   => $messages
386
                ]);
387
            }
388
        } else {
389
            $data = [
390
                'success' => false,
391
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
392
            ];
393
 
394
            return new JsonModel($data);
395
        }
396
 
397
        return new JsonModel($data);
398
    }
399
 
400
 
401
 
402
    public function deleteQuestionAction()
403
    {
404
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
405
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
406
 
407
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
408
        $currentUser        = $currentUserPlugin->getUser();
409
 
410
        $request    = $this->getRequest();
411
        $id         = $this->params()->fromRoute('id');
412
 
413
        $message_error = '';
414
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
415
        if(!$myCoachAccessControl->hasAccessDeleteQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
416
            return new JsonModel([
417
                'success'   => false,
418
                'data'   => $message_error
419
            ]);
420
        }
421
 
422
 
423
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
424
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
6388 efrain 425
 
6521 efrain 426
 
427
        if ($request->isPost()) {
428
 
429
            $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
430
            $myCoachQuestionCategoryMapper->deleteAllByQuestionId($myCoachQuestion->id);
431
 
432
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
433
            $myCoachAnswerMapper->deleteAllByQuestionId($myCoachQuestion->id);
434
 
435
            $result =  $myCoachQuestionMapper->delete($myCoachQuestion);
436
            if ($result) {
437
                $data = [
438
                    'success' => true,
439
                    'data' => 'LABEL_RECORD_DELETED'
440
                ];
441
            } else {
442
 
443
                $data = [
444
                    'success'   => false,
445
                    'data'      => $myCoachQuestionMapper->getError()
446
                ];
447
 
448
                return new JsonModel($data);
449
            }
450
        } else {
451
            $data = [
452
                'success' => false,
453
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
454
            ];
455
 
456
            return new JsonModel($data);
457
        }
458
 
459
        return new JsonModel($data);
460
    }
461
 
462
 
463
    public function editQuestionAction()
464
    {
465
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
466
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
467
 
468
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
469
        $currentUser        = $currentUserPlugin->getUser();
470
 
471
        $request    = $this->getRequest();
472
        $id    = $this->params()->fromRoute('id');
473
 
474
        $message_error = '';
475
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
476
        if(!$myCoachAccessControl->hasAccessEditQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
477
            return new JsonModel([
478
                'success'   => false,
479
                'data'   => $message_error
480
            ]);
481
        }
482
 
483
 
484
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
485
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
486
 
487
 
488
        if ($request->isGet()) {
489
 
490
            $category_ids = [];
491
            $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
492
 
493
            $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
494
            $records = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($myCoachQuestion->id);
495
            foreach($records as $record)
496
            {
497
                $myCoachCategory = $myCoachCategoryMapper->fetchOne($record->category_id);
498
                if($myCoachCategory) {
499
                    array_push($category_ids,$myCoachCategory->uuid);
500
                }
501
            }
502
 
503
 
504
 
505
            $data = [
506
                'success' => true,
507
                'data' => [
508
                    'category_id' => $category_ids,
509
                    'title' => $myCoachQuestion->title,
510
                    'description' => $myCoachQuestion->description,
511
                ]
512
            ];
513
 
514
            return new JsonModel($data);
515
        } else if ($request->isPost()) {
516
 
517
            $categories = $myCoachAccessControl->getCategoriesWithAccessToFormSelect($myCoachQuestion->user_id, $currentNetwork->id);
518
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
519
 
520
            $form = new MyCoachQuestionForm($categories);
521
            $form->setData($dataPost);
522
 
523
            if ($form->isValid()) {
524
                $dataPost = (array) $form->getData();
525
 
526
 
527
 
528
                $myCoachQuestion->title = $dataPost['title'];
529
                $myCoachQuestion->description = $dataPost['description'];
530
 
531
 
532
                if ($myCoachQuestionMapper->update($myCoachQuestion)) {
533
 
534
 
535
                    $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
536
 
537
                    $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
538
                    $myCoachQuestionCategoryMapper->deleteAllByQuestionId($myCoachQuestion->id);
539
 
540
                    $category_ids = $dataPost['category_id'];
541
                    foreach($category_ids as $category_id)
542
                    {
543
                        $myCoachCategory = $myCoachCategoryMapper->fetchOneByUuid($category_id);
544
                        if($myCoachCategory) {
545
                            $myCoachQuestionCategory = new MyCoachQuestionCategory();
546
                            $myCoachQuestionCategory->category_id = $myCoachCategory->id;
547
                            $myCoachQuestionCategory->question_id = $myCoachQuestion->id;
548
 
549
                            $myCoachQuestionCategoryMapper->insert($myCoachQuestionCategory);
6388 efrain 550
                        }
551
                    }
6521 efrain 552
 
553
 
554
                    $this->logger->info('Se edito la pregunta ' . $myCoachQuestion->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
555
 
556
                    $data = [
557
                        'success'   => true,
558
                        'data'   => 'LABEL_RECORD_UPDATED'
559
                    ];
560
                } else {
561
                    $data = [
562
                        'success'   => false,
563
                        'data'      => $myCoachQuestionMapper->getError()
564
                    ];
6388 efrain 565
                }
6521 efrain 566
 
567
                return new JsonModel($data);
568
            } else {
569
                $messages = [];
570
                $form_messages = (array) $form->getMessages();
571
                foreach ($form_messages  as $fieldname => $field_messages) {
572
 
573
                    $messages[$fieldname] = array_values($field_messages);
574
                }
575
 
576
                return new JsonModel([
577
                    'success'   => false,
578
                    'data'   => $messages
579
                ]);
580
            }
581
        } else {
582
            $data = [
583
                'success' => false,
584
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
585
            ];
586
 
587
            return new JsonModel($data);
588
        }
589
 
590
        return new JsonModel($data);
591
    }
592
 
593
 
594
    public function viewQuestionAction()
595
    {
596
        $currentUserPlugin = $this->plugin('currentUserPlugin');
597
        $currentUser = $currentUserPlugin->getUser();
598
 
599
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
600
        $currentNetwork = $currentNetworkPlugin->getNetwork();
601
 
602
        $request    = $this->getRequest();
603
        $id    = $this->params()->fromRoute('id');
604
 
605
        $message_error = '';
606
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
607
        if(!$myCoachAccessControl->hasAccessViewQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
608
            return new JsonModel([
609
                'success'   => false,
610
                'data'   => $message_error
611
            ]);
612
        }
613
 
614
 
615
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
616
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
617
 
618
        $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
619
        $commentMapper = CommentMapper::getInstance($this->adapter);
620
        $myCoachQuestionViewMapper = MyCoachQuestionViewMapper::getInstance($this->adapter);
621
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
622
 
623
 
624
        $request = $this->getRequest();
625
        if ($request->isGet()) {
626
 
627
            $categories = [];
628
            $users = [];
629
 
630
 
631
 
632
            $bags_categories = [];
633
 
634
            $myCoachQuestionViewMapper = MyCoachQuestionViewMapper::getInstance($this->adapter);
635
            $myCoachQuestionView = $myCoachQuestionViewMapper->fetchOneByQuestionIdAndUserId($myCoachQuestion->id, $currentUser->id);
636
            if(!$myCoachQuestionView) {
637
                $myCoachQuestionView = new MyCoachQuestionView();
638
                $myCoachQuestionView->question_id = $myCoachQuestion->id;
639
                $myCoachQuestionView->user_id = $currentUser->id;
640
 
641
                $myCoachQuestionViewMapper->insert($myCoachQuestionView);
642
 
643
            }
644
 
645
 
646
 
647
            $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
648
            $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
649
 
650
            $questionCategories = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($myCoachQuestion->id);
651
            foreach($questionCategories as $questionCategory)
652
            {
653
 
654
                if (!isset($categories[$questionCategory->category_id])) {
655
                    $category = $myCoachCategoryMapper->fetchOne($questionCategory->category_id);
656
                    if ($category) {
657
                        $categories[$category->id] = $category->name;
658
                    }
659
                }
660
 
661
                array_push($bags_categories,['category' => $categories[ $questionCategory->category_id ] ]);
662
            }
663
 
664
            $users = [];
665
            $userMapper = UserMapper::getInstance($this->adapter);
666
            if(isset($users[$myCoachQuestion->user_id])) {
667
                $user = $users[$myCoachQuestion->user_id];
668
            } else {
669
                $user = $userMapper->fetchOne( $myCoachQuestion->user_id );
670
                $users[ $myCoachQuestion->user_id ] = $user;
671
            }
672
 
673
 
674
 
675
            $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $myCoachQuestion->added_on);
676
            $added_on = $dt->format('d/m/Y H:i a');
677
 
678
            $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $myCoachQuestion->updated_on);
679
            $updated_on = $dt->format('d/m/Y H:i a');
680
 
681
 
682
 
683
            $allowDelete = $myCoachAccessControl->hasAccessDeleteQuestion($currentUser->id, $myCoachQuestion->id, $currentNetwork->id, $message_error);
684
            if($allowDelete) {
685
                $link_delete = $this->url()->fromRoute('my-coach/questions/delete', ['id' => $myCoachQuestion->uuid]);
686
            } else {
687
                $link_delete = '';
688
            }
689
 
690
            $allowAnswerAdd = $myCoachAccessControl->hasAccessAnswerQuestion($currentUser->id, $myCoachQuestion->id, $currentNetwork->id, $message_error);
691
            if ($allowAnswerAdd) {
692
                $link_answers_add = $this->url()->fromRoute('my-coach/questions/answers/add', ['id' => $myCoachQuestion->uuid]);
693
            } else {
694
                $link_answers_add = '';
695
            }
6547 efrain 696
 
6521 efrain 697
 
6388 efrain 698
 
6521 efrain 699
            $myCoachLastAnswer = $myCoachAnswerMapper->fetchOneLastAnswerByQuestionId($myCoachQuestion->id);
700
 
701
            if( $myCoachLastAnswer) {
702
                $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $myCoachLastAnswer->added_on);
703
                $last_answer_on = $dt->format('d/m/Y H:i a');
704
 
705
 
706
 
707
            } else {
708
                $last_answer_on = '';
709
            }
710
 
6388 efrain 711
 
6521 efrain 712
            return new JsonModel([
713
                'success' => true,
714
                'data' => [
715
                    'uuid' => $myCoachQuestion->uuid,
716
                    'user_name' => trim($user->first_name . ' ' . $user->last_name),
717
                    'user_image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]),
718
                    'title' => $myCoachQuestion->title,
719
                    'description' => $myCoachQuestion->description,
720
                    'categories' => $bags_categories,
721
                    'views' => intval($myCoachQuestionViewMapper->fetchCountByQuestionId($myCoachQuestion->id) , 10),
6547 efrain 722
                    'answers' => intval($myCoachAnswerMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id) , 10),
6521 efrain 723
                    'reactions' => intval($contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id), 10),
724
                    'comments' => intval($commentMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id), 10),
725
                    'added_on' => $added_on,
726
                    'updated_on' => $updated_on,
727
                    'last_answer_on' => $last_answer_on,
728
                    'link_answers' => $this->url()->fromRoute('my-coach/questions/answers', ['id' => $myCoachQuestion->uuid]),
729
                    'link_answers_add' => $link_answers_add,
730
                    'link_delete' => $link_delete,
731
                ]
732
 
733
            ]);
734
 
735
 
736
        } else {
737
            return new JsonModel([
738
                'success' => false,
739
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
740
            ]);
741
        }
742
 
743
 
744
 
745
 
746
 
747
    }
748
 
749
    /**
750
     *
751
     * {@inheritDoc}
752
     * @see \Laminas\Mvc\Controller\AbstractActionController::indexAction()
753
     */
754
    public function answersAction()
755
    {
756
        $currentUserPlugin = $this->plugin('currentUserPlugin');
757
        $currentUser = $currentUserPlugin->getUser();
758
 
759
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
760
        $currentNetwork = $currentNetworkPlugin->getNetwork();
761
 
762
        $request    = $this->getRequest();
763
        $id    = $this->params()->fromRoute('id');
764
 
765
        $message_error = '';
766
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
767
        if(!$myCoachAccessControl->hasAccessViewQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
768
            return new JsonModel([
769
                'success'   => false,
770
                'data'   => $message_error
771
            ]);
772
        }
773
 
774
 
775
 
776
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
777
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
778
 
779
        $request = $this->getRequest();
780
        if ($request->isGet()) {
781
 
782
 
783
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
784
            $now = $myCoachAnswerMapper->getDatebaseNow();
785
 
786
            $records = $myCoachAnswerMapper->fetchAllByQuestionId($myCoachQuestion->id);
787
 
788
 
789
            $items = [];
790
 
791
            foreach($records as $record)
792
            {
793
                $items[] = $this->renderAnswer($record->id, $currentUser->id, $now);
794
            }
795
 
796
 
797
 
798
            return new JsonModel([
799
                'success' => true,
800
                'data' => [
801
                    'items' => $items
802
                ]
803
            ]);
804
 
805
 
806
        } else {
807
            return new JsonModel([
808
                'success' => false,
809
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
810
            ]);
811
        }
812
    }
813
 
6547 efrain 814
    public function deleteAnswerAction()
815
    {
816
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
817
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
818
 
819
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
820
        $currentUser        = $currentUserPlugin->getUser();
821
 
822
        $request    = $this->getRequest();
823
        $answer     = $this->params()->fromRoute('answer');
824
 
825
        $message_error = '';
826
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
827
        if(!$myCoachAccessControl->hasAccessEditOrDeleteAnswer($currentUser->id, $answer, $currentNetwork->id, $message_error)) {
828
            return new JsonModel([
829
                'success'   => false,
830
                'data'   => $message_error
831
            ]);
832
        }
833
 
834
 
835
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
836
        $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($answer);
837
 
838
        if ($request->isPost()) {
839
 
840
            if($myCoachAnswerMapper->delete($myCoachAnswer)) {
841
 
842
                $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
843
                $commentMapper = CommentMapper::getInstance($this->adapter);
844
 
845
 
846
                $this->logger->info('Se borro la respuesta ' . $myCoachAnswer->text, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
847
 
848
                $data = [
849
                    'success'   => true,
850
                    'data'   => [
851
                        'total_comments' => intval($commentMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10),
852
                        'total_answers' => intval($myCoachAnswerMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10),
853
                        'total_reactions' => intval($contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10)
854
 
855
                    ]
856
                ];
857
            } else {
858
                $data = [
859
                    'success'   => false,
860
                    'data'      => $myCoachAnswerMapper->getError()
861
                ];
862
            }
863
        } else {
864
            $data = [
865
                'success' => false,
866
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
867
            ];
868
 
869
 
870
        }
871
        return new JsonModel($data);
872
 
873
 
874
    }
875
 
876
 
877
    public function editAnswerAction()
878
    {
879
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
880
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
881
 
882
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
883
        $currentUser        = $currentUserPlugin->getUser();
884
 
885
        $request    = $this->getRequest();
886
        $answer     = $this->params()->fromRoute('answer');
887
 
888
        $message_error = '';
889
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
890
        if(!$myCoachAccessControl->hasAccessEditOrDeleteAnswer($currentUser->id, $answer, $currentNetwork->id, $message_error)) {
891
            return new JsonModel([
892
                'success'   => false,
893
                'data'   => $message_error
894
            ]);
895
        }
896
 
897
 
898
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
899
        $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($answer);
900
 
901
        if ($request->isPost()) {
902
 
903
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
904
            $form = new MyCoachAnswerForm();
905
            $form->setData($dataPost);
906
 
907
            if ($form->isValid()) {
908
                $myCoachAnswer->text        = $dataPost['description'];
6388 efrain 909
 
6547 efrain 910
                if($myCoachAnswerMapper->update($myCoachAnswer)) {
911
 
912
                    $this->logger->info('Se edito la respuesta ' . $myCoachAnswer->text, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
913
 
914
                    $data = [
915
                        'success'   => true,
916
                        'data'   => [
917
                            'description' => $myCoachAnswer->text
918
                        ]
919
                    ];
920
                } else {
921
                    $data = [
922
                        'success'   => false,
923
                        'data'      => $myCoachAnswerMapper->getError()
924
                    ];
925
                }
926
 
927
                return new JsonModel($data);
928
            } else {
929
                $messages = [];
930
                $form_messages = (array) $form->getMessages();
931
                foreach ($form_messages  as $fieldname => $field_messages)
932
                {
933
                    $messages[$fieldname] = array_values($field_messages);
934
                }
935
 
936
                return new JsonModel([
937
                    'success'   => false,
938
                    'data'   => $messages
939
                ]);
940
            }
941
        } else  if ($request->isGet()) {
942
            return new JsonModel([
943
                'success'   => true,
944
                'data'   => [
945
                    'description' => $myCoachAnswer->text
946
                ]
947
            ]);
948
        } else {
949
            $data = [
950
                'success' => false,
951
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
952
            ];
953
 
954
            return new JsonModel($data);
955
        }
956
 
957
 
958
    }
959
 
6521 efrain 960
 
961
 
6547 efrain 962
 
963
 
6521 efrain 964
    public function addAnswerAction()
965
    {
966
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
967
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
968
 
969
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
970
        $currentUser        = $currentUserPlugin->getUser();
971
 
972
        $request    = $this->getRequest();
973
        $id    = $this->params()->fromRoute('id');
974
 
975
        $message_error = '';
976
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
977
        if(!$myCoachAccessControl->hasAccessAnswerQuestion($currentUser->id, $id, $currentNetwork->id, $message_error)) {
978
            return new JsonModel([
979
                'success'   => false,
980
                'data'   => $message_error
981
            ]);
982
        }
983
 
984
 
985
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
986
        $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
987
 
988
        if ($request->isPost()) {
989
 
990
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
991
            $form = new MyCoachAnswerForm();
992
            $form->setData($dataPost);
993
 
994
            if ($form->isValid()) {
6388 efrain 995
 
6521 efrain 996
                $myCoachAnswer = new MyCoachAnswer();
997
                $myCoachAnswer->question_id = $myCoachQuestion->id;
998
                $myCoachAnswer->text        = $dataPost['description'];
999
                $myCoachAnswer->user_id     = $currentUser->id;
1000
 
1001
 
1002
                $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1003
                if($myCoachAnswerMapper->insert($myCoachAnswer)) {
1004
                    $now = $myCoachAnswerMapper->getDatebaseNow();
1005
 
1006
                    $this->logger->info('Se agrego la respuesta ' . $myCoachAnswer->text, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
1007
 
1008
                    $data = [
1009
                        'success'   => true,
1010
                        'data'   => [
1011
                            'answers' => $myCoachAnswerMapper->fetchCountByMyCoachQuestionId($myCoachQuestion->id),
1012
                            'item' => $this->renderAnswer($myCoachAnswer->id, $currentUser->id, $now)
1013
                        ]
1014
                    ];
1015
                } else {
1016
                    $data = [
1017
                        'success'   => false,
1018
                        'data'      => $myCoachQuestionMapper->getError()
1019
                    ];
1020
                }
1021
 
1022
                return new JsonModel($data);
1023
            } else {
1024
                $messages = [];
1025
                $form_messages = (array) $form->getMessages();
1026
                foreach ($form_messages  as $fieldname => $field_messages)
6388 efrain 1027
                {
6521 efrain 1028
                    $messages[$fieldname] = array_values($field_messages);
1029
                }
6388 efrain 1030
 
6521 efrain 1031
                return new JsonModel([
1032
                    'success'   => false,
1033
                    'data'   => $messages
1034
                ]);
1035
            }
1036
 
1037
        } else {
1038
            $data = [
1039
                'success' => false,
1040
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1041
            ];
1042
 
1043
            return new JsonModel($data);
1044
        }
1045
 
1046
 
1047
    }
1048
 
1049
    /*
1050
 
1051
    public function deleteAction()
1052
    {
1053
    $currentUserPlugin = $this->plugin('currentUserPlugin');
1054
    $currentUser    = $currentUserPlugin->getUser();
1055
 
1056
 
1057
    $request    = $this->getRequest();
1058
    $id         = $this->params()->fromRoute('id');
1059
 
1060
 
1061
 
1062
    $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
1063
    $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
1064
    if (!$myCoachQuestion) {
1065
    return new JsonModel([
1066
    'success'   => false,
1067
    'data'   => 'ERROR_RECORD_NOT_FOUND'
1068
    ]);
1069
    }
1070
 
1071
    $ok = false;
1072
    if(!$myCoachQuestion->answers) {
1073
 
1074
    if($currentUser->id == $myCoachQuestion->user_id) {
1075
    $ok = true;
1076
    } else {
1077
    $category_ids_with_edition = [];
1078
 
1079
    $myCoachCategoryUserMapper = MyCoachCategoryUserMapper::getInstance($this->adapter);
1080
    $records = $myCoachCategoryUser = $myCoachCategoryUserMapper->fetchAllByUserId($currentUser->id);
1081
 
1082
    foreach($records as $record)
1083
    {
1084
    array_push($category_ids_with_edition, $record->user_id);
1085
    }
1086
 
1087
 
1088
 
1089
    $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
1090
    $records = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($myCoachQuestion->id);
1091
    foreach($records as $record)
1092
    {
1093
    if (in_array($record->category_id, $category_ids_with_edition) && $myCoachCategoryUser->role == MyCoachCategoryUser::ROLE_EDITOR || $myCoachCategoryUser->role == MyCoachCategoryUser::ROLE_ADMINISTRATOR) {
1094
    $ok = true;
1095
    break;
1096
    }
1097
    }
1098
    }
1099
    }
1100
 
1101
 
1102
    if (!$ok) {
1103
    return new JsonModel([
1104
    'success'   => false,
1105
    'data'   => 'ERROR_KNOWLEDGE_AREA_YOU_DO_NOT_HAVE_PERMISSION'
1106
    ]);
1107
    }
1108
 
1109
    if ($request->isPost()) {
1110
 
1111
    $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
1112
    $myCoachQuestionCategoryMapper->deleteAllByQuestionId($myCoachQuestion->id);
1113
 
1114
    $result =  $myCoachQuestionMapper->delete($myCoachQuestion);
1115
    if ($result) {
1116
    $data = [
1117
    'success' => true,
1118
    'data' => 'LABEL_RECORD_DELETED'
1119
    ];
1120
    } else {
1121
 
1122
    $data = [
1123
    'success'   => false,
1124
    'data'      => $myCoachQuestionMapper->getError()
1125
    ];
1126
 
1127
    return new JsonModel($data);
1128
    }
1129
    } else {
1130
    $data = [
1131
    'success' => false,
1132
    'data' => 'ERROR_METHOD_NOT_ALLOWED'
1133
    ];
1134
 
1135
    return new JsonModel($data);
1136
    }
1137
 
1138
    return new JsonModel($data);
1139
    }
1140
 
1141
 
1142
    public function editAction()
1143
    {
1144
    $currentUserPlugin = $this->plugin('currentUserPlugin');
1145
    $currentUser    = $currentUserPlugin->getUser();
1146
 
1147
    $request    = $this->getRequest();
1148
    $id    = $this->params()->fromRoute('id');
1149
 
1150
    $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
1151
    $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
1152
    if (!$myCoachQuestion) {
1153
    return new JsonModel([
1154
    'success'   => false,
1155
    'data'   => 'ERROR_RECORD_NOT_FOUND'
1156
    ]);
1157
    }
1158
 
1159
    $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
1160
 
1161
    $ok = false;
1162
    if(!$myCoachQuestion->answers) {
1163
 
1164
    if($currentUser->id == $myCoachQuestion->user_id) {
1165
    $ok = true;
1166
    } else {
1167
    $category_ids_with_edition = [];
1168
 
1169
    $myCoachCategoryUserMapper = MyCoachCategoryUserMapper::getInstance($this->adapter);
1170
    $records = $myCoachCategoryUser = $myCoachCategoryUserMapper->fetchAllByUserId($currentUser->id);
1171
 
1172
    foreach($records as $record)
1173
    {
1174
    array_push($category_ids_with_edition, $record->user_id);
1175
    }
1176
 
1177
 
1178
    $records = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($myCoachQuestion->id);
1179
    foreach($records as $record)
1180
    {
1181
    if (in_array($record->category_id, $category_ids_with_edition) && $myCoachCategoryUser->role == MyCoachCategoryUser::ROLE_EDITOR || $myCoachCategoryUser->role == MyCoachCategoryUser::ROLE_ADMINISTRATOR) {
1182
    $ok = true;
1183
    break;
1184
    }
1185
    }
1186
    }
1187
    }
1188
 
1189
 
1190
    if (!$ok) {
1191
    return new JsonModel([
1192
    'success'   => false,
1193
    'data'   => 'ERROR_KNOWLEDGE_AREA_YOU_DO_NOT_HAVE_PERMISSION'
1194
    ]);
1195
    }
1196
 
1197
    if (!$ok) {
1198
    return new JsonModel([
1199
    'success'   => false,
1200
    'data'   => 'ERROR_KNOWLEDGE_AREA_YOU_DO_NOT_HAVE_PERMISSION'
1201
    ]);
1202
    }
1203
 
1204
    if ($request->isGet()) {
1205
 
1206
 
1207
    $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
1208
 
1209
 
1210
 
1211
    $category_ids = [];
1212
 
1213
 
1214
 
1215
    $records = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($myCoachQuestion->id);
1216
    foreach($records as $record)
1217
    {
1218
    $myCoachCategory = $myCoachCategoryMapper->fetchOne($record->category_id);
1219
    if($myCoachCategory) {
1220
    array_push($category_ids,$myCoachCategory->uuid);
1221
    }
1222
    }
1223
 
1224
 
1225
 
1226
    $data = [
1227
    'success' => true,
1228
    'data' => [
1229
    'category_id' => $category_ids,
1230
    'title' => $myCoachQuestion->title,
1231
    'description' => $myCoachQuestion->description,
1232
    ]
1233
    ];
1234
 
1235
    return new JsonModel($data);
1236
    } else if ($request->isPost()) {
1237
    $category_with_edition_ids = [];
1238
    $category_ids = [];
1239
 
1240
 
1241
    $categories = [];
1242
 
1243
 
1244
    $myCoachCategoryUserMapper = MyCoachCategoryUserMapper::getInstance($this->adapter);
1245
    $records =  $myCoachCategoryUserMapper->fetchAllByUserId($currentUser->id);
1246
    foreach ($records as $record) {
1247
    if ($record->role == MyCoachCategoryUser::ROLE_ADMINISTRATOR || $record->role == MyCoachCategoryUser::ROLE_USER) {
1248
 
1249
    array_push($category_with_edition_ids, $record->category_id);
1250
    }
1251
 
1252
    array_push($category_ids, $record->category_id);
1253
    }
1254
 
1255
    $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
1256
 
1257
    if ($category_ids) {
1258
    $records =  $myCoachCategoryMapper->fetchAllByIds($category_ids);
1259
    foreach ($records as $record) {
1260
    if ($record->status == MyCoachCategory::STATUS_ACTIVE) {
1261
 
1262
    $categories[$record->id] = [
1263
    'uuid' => $record->uuid,
1264
    'name' => $record->name,
1265
    ];
1266
    }
1267
    }
1268
    }
1269
 
1270
 
1271
 
1272
    $categories = array_values($categories);
1273
    usort($categories, function ($a, $b) {
1274
    return $a['name'] <=> $b['name'];
1275
    });
1276
 
1277
    $categories_question_available = [];
1278
    foreach($categories as $cartegory)
1279
    {
1280
    $categories_question_available[ $cartegory['uuid'] ] = $cartegory['name'];
1281
    }
1282
 
1283
    $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
1284
    $form = new MyCoachQuestionForm($categories_question_available);
1285
    $form->setData($dataPost);
1286
 
1287
    if ($form->isValid()) {
1288
    $dataPost = (array) $form->getData();
1289
 
1290
 
1291
 
1292
    $myCoachQuestion->title = $dataPost['title'];
1293
    $myCoachQuestion->description = $dataPost['description'];
1294
 
1295
 
1296
    if ($myCoachQuestionMapper->update($myCoachQuestion)) {
1297
 
1298
 
1299
    $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
1300
 
1301
    $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
1302
    $myCoachQuestionCategoryMapper->deleteAllByQuestionId($myCoachQuestion->id);
1303
 
1304
    $category_ids = $dataPost['category_id'];
1305
    foreach($category_ids as $category_id)
1306
    {
1307
    $myCoachCategory = $myCoachCategoryMapper->fetchOneByUuid($category_id);
1308
    if($myCoachCategory) {
1309
    $myCoachQuestionCategory = new MyCoachQuestionCategory();
1310
    $myCoachQuestionCategory->category_id = $myCoachCategory->id;
1311
    $myCoachQuestionCategory->question_id = $myCoachQuestion->id;
1312
 
1313
    $myCoachQuestionCategoryMapper->insert($myCoachQuestionCategory);
1314
    }
1315
    }
1316
 
1317
 
1318
    $this->logger->info('Se edito la pregunta ' . $myCoachQuestion->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
1319
 
1320
    $data = [
1321
    'success'   => true,
1322
    'data'   => 'LABEL_RECORD_UPDATED'
1323
    ];
1324
    } else {
1325
    $data = [
1326
    'success'   => false,
1327
    'data'      => $myCoachQuestionMapper->getError()
1328
    ];
1329
    }
1330
 
1331
    return new JsonModel($data);
1332
    } else {
1333
    $messages = [];
1334
    $form_messages = (array) $form->getMessages();
1335
    foreach ($form_messages  as $fieldname => $field_messages) {
1336
 
1337
    $messages[$fieldname] = array_values($field_messages);
1338
    }
1339
 
1340
    return new JsonModel([
1341
    'success'   => false,
1342
    'data'   => $messages
1343
    ]);
1344
    }
1345
    } else {
1346
    $data = [
1347
    'success' => false,
1348
    'data' => 'ERROR_METHOD_NOT_ALLOWED'
1349
    ];
1350
 
1351
    return new JsonModel($data);
1352
    }
1353
 
1354
    return new JsonModel($data);
1355
    }
1356
 
1357
 
1358
    public function viewAction()
1359
    {
1360
    $currentUserPlugin = $this->plugin('currentUserPlugin');
1361
    $currentUser = $currentUserPlugin->getUser();
1362
 
1363
    $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
1364
    $currentNetwork = $currentNetworkPlugin->getNetwork();
1365
 
1366
    $request    = $this->getRequest();
1367
    $id    = $this->params()->fromRoute('id');
1368
 
1369
    $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
1370
    $myCoachQuestion = $myCoachQuestionMapper->fetchOneByUuid($id);
1371
    if (!$myCoachQuestion) {
1372
    return new JsonModel([
1373
    'success'   => false,
1374
    'data'   => 'ERROR_RECORD_NOT_FOUND'
1375
    ]);
1376
    }
1377
 
1378
 
1379
    $request = $this->getRequest();
1380
    if ($request->isGet()) {
1381
 
1382
 
1383
 
1384
    $category_with_edition_ids = [];
1385
    $category_ids = [];
1386
    $categories = [];
1387
 
1388
 
1389
    $myCoachCategoryUserMapper = MyCoachCategoryUserMapper::getInstance($this->adapter);
1390
    $records =  $myCoachCategoryUserMapper->fetchAllByUserId($currentUser->id);
1391
    foreach ($records as $record) {
1392
    if ($record->role == MyCoachCategoryUser::ROLE_ADMINISTRATOR || $record->role == MyCoachCategoryUser::ROLE_USER) {
1393
 
1394
    array_push($category_with_edition_ids, $record->category_id);
1395
    }
1396
 
1397
    array_push($category_ids, $record->category_id);
1398
    }
1399
 
1400
    $myCoachCategoryMapper = MyCoachCategoryMapper::getInstance($this->adapter);
1401
 
1402
 
1403
 
1404
    if ($category_ids) {
1405
    $records =  $myCoachCategoryMapper->fetchAllByIds($category_ids);
1406
    foreach ($records as $record) {
1407
    $categories[$record->id] = [
1408
    'uuid' => $record->uuid,
1409
    'name' => $record->name,
1410
    ];
1411
    }
1412
    }
1413
 
1414
    $records =  $myCoachCategoryMapper->fetchAllPublicByNetworkId($currentNetwork->id);
1415
    foreach ($records as $record) {
1416
    if (!isset($categories[$record->id])) {
1417
 
1418
    $categories[$record->id] = [
1419
    'uuid' => $record->uuid,
1420
    'name' => $record->name,
1421
    ];
1422
    }
1423
    }
1424
 
1425
 
1426
 
1427
 
1428
 
1429
    $categories = array_values($categories);
1430
    usort($categories, function ($a, $b) {
1431
    return $a['name'] <=> $b['name'];
1432
    });
1433
 
1434
 
1435
    $access = $myCoachQuestion->user_id == $currentUser->id;
1436
 
1437
    $allowDelete = false;
1438
    $allowAnswer = false;
1439
 
1440
    $bags_categories = [];
1441
    $myCoachQuestionCategoryMapper = MyCoachQuestionCategoryMapper::getInstance($this->adapter);
1442
 
1443
    $questionCategories = $myCoachQuestionCategoryMapper->fetchAllByQuestionId($myCoachQuestion->id);
1444
    foreach($questionCategories as $questionCategory)
1445
    {
1446
 
1447
    if(in_array($questionCategory->category_id, $categories)) {
1448
    $access = true;
1449
    }
1450
 
1451
 
1452
    if(in_array($questionCategory->category_id, $category_with_edition_ids)) {
1453
 
1454
    $allowDelete = true;
1455
    $allowAnswer = true;
1456
    }
1457
 
1458
    if (!isset($categories[$questionCategory->category_id])) {
1459
    $category = $myCoachCategoryMapper->fetchOne($questionCategory->category_id);
1460
    if ($category) {
1461
    $categories[$category->id] = [
1462
    'uuid' =>  $category->uuid,
1463
    'name' =>  $category->name,
1464
    ];
1465
    }
1466
    }
1467
 
1468
    array_push($bags_categories,['category' => $categories[ $questionCategory->category_id ]['name'] ]);
1469
    }
1470
 
1471
    $users = [];
1472
    $userMapper = UserMapper::getInstance($this->adapter);
1473
    if(isset($users[$myCoachQuestion->user_id])) {
1474
    $user = $users[$myCoachQuestion->user_id];
1475
    } else {
1476
    $user = $userMapper->fetchOne( $myCoachQuestion->user_id );
1477
    $users[ $myCoachQuestion->user_id ] = $user;
1478
    }
1479
 
1480
 
1481
 
1482
    $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);
1483
    $added_on = $dt->format('d/m/Y H:i a');
1484
 
1485
    $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->updated_on);
1486
    $updated_on = $dt->format('d/m/Y H:i a');
1487
 
1488
 
1489
 
1490
    $data = [
1491
    'user_name' => trim($user->first_name . ' ' . $user->last_name),
1492
    'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]),
1493
    'title' => $myCoachQuestion->title,
1494
    'description' => $myCoachQuestion->description,
1495
    'categories' => $bags_categories,
1496
    'views' => $myCoachQuestion->views,
1497
    'answers' => $myCoachQuestion->answers,
1498
    'reactions' => $myCoachQuestion->reactions,
1499
    'added_on' => $added_on,
1500
    'updated_on' => $updated_on,
1501
    'answers' => [],
1502
    ];
1503
 
1504
 
1505
 
1506
    if($allowDelete || $myCoachQuestion->zuser_id == $currentUser->id) {
1507
    $data['link_delete'] = $this->url()->fromRoute('my-coach/questions/delete', ['id' => $myCoachQuestion->uuid]);
1508
    } else {
1509
    $data['ink_delete'] = '';
1510
    }
1511
 
1512
 
1513
    if ($allowAnswer) {
1514
    $data['link_answers'] = $this->url()->fromRoute('my-coach/questions/answers', ['id' => $myCoachQuestion->uuid]);
1515
    } else {
1516
    $data['link_answers'] = '';
1517
    }
1518
 
1519
    $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1520
    $records =  $myCoachAnswerMapper->fetchAllByQuestionId($myCoachQuestion->id);
1521
    foreach($records as $record)
1522
    {
1523
 
1524
    $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->added_on);
1525
    $added_on = $dt->format('d/m/Y H:i a');
1526
 
1527
    $dt = \DateTime::createFromFormat('Y-m-d H:i:s', $record->updated_on);
1528
    $updated_on = $dt->format('d/m/Y H:i a');
1529
 
1530
    if(isset($users[$record->user_id])) {
1531
    $user = $users[$record->user_id];
1532
    } else {
1533
    $user = $userMapper->fetchOne( $record->user_id );
1534
    $users[ $record->user_id ] = $user;
1535
    }
1536
 
1537
    array_push($data['answers'], [
1538
    'user_name' => trim($user->first_name . ' ' . $user->last_name),
1539
    'image' => $this->url()->fromRoute('storage', ['type' => 'user', 'code' => $user->uuid, 'filename' => $user->image]),
1540
    'text' => $record->text,
1541
    'added_on' => $added_on,
1542
    'updated_on' => $updated_on,
1543
    'link_delete' => $allowAnswer ? $this->url()->fromRoute('my-coach/questions/answer/delete', ['code' => $myCoachQuestion->uuid, 'answer' => $record->uuid]) : '',
1544
    ]);
1545
 
1546
 
1547
 
1548
    }
1549
 
1550
 
1551
 
1552
 
1553
    return new JsonModel([
1554
    'success' => true,
1555
    'data' => $data
1556
    ]);
1557
 
1558
 
1559
    } else {
1560
    return new JsonModel([
1561
    'success' => false,
1562
    'data' => 'ERROR_METHOD_NOT_ALLOWED'
1563
    ]);
1564
    }
1565
 
1566
 
1567
    return new JsonModel($data);
1568
    }
1569
    */
1570
 
1571
 
1572
    public function addCommentAction()
1573
    {
1574
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1575
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1576
 
1577
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1578
        $currentUser        = $currentUserPlugin->getUser();
1579
 
1580
        $request    = $this->getRequest();
1581
        $id    = $this->params()->fromRoute('id');
1582
 
1583
 
1584
        $request = $this->getRequest();
1585
        if ($request->isPost()) {
1586
 
1587
            $message_error = '';
1588
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1589
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1590
                return new JsonModel([
1591
                    'success'   => false,
1592
                    'data'   => $message_error
1593
                ]);
1594
            }
1595
 
1596
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1597
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1598
 
1599
            $dataPost = $request->getPost()->toArray();
1600
            $form = new CommentForm();
1601
            $form->setData($dataPost);
1602
 
1603
            if ($form->isValid()) {
1604
 
1605
 
1606
                $currentUserPlugin = $this->plugin('currentUserPlugin');
1607
                $currentUser = $currentUserPlugin->getUser();
1608
 
1609
                $dataPost = (array) $form->getData();
1610
 
1611
 
1612
 
1613
                $comment = new Comment();
1614
                $comment->network_id = $currentUser->network_id;
1615
                $comment->comment = $dataPost['comment'];
1616
                $comment->user_id = $currentUser->id;
1617
                $comment->my_coach_answer_id = $myCoachAnswer->id;
1618
                $comment->relational = Comment::RELATIONAL_MY_COACH;
1619
 
1620
                $commentMapper = CommentMapper::getInstance($this->adapter);
1621
                if ($commentMapper->insert($comment)) {
1622
                    $now = $commentMapper->getDatebaseNow();
1623
 
1624
                    $response = [
1625
                        'success'           => true,
1626
                        'data'              => [
1627
                            'item'  => $this->renderComment($comment->id, $now),
1628
                            'total_comments_answer' => intval( $commentMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10),
1629
                            'total_comments_question' => intval( $commentMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10),
1630
                        ]
1631
                    ];
1632
 
1633
                    return new JsonModel($response);
1634
                } else {
1635
 
1636
                    $response = [
1637
                        'success'   => false,
1638
                        'data'   => $commentMapper->getError()
1639
                    ];
1640
 
1641
                    return new JsonModel($response);
1642
                }
1643
            } else {
1644
                $message = '';;
1645
                $form_messages = (array) $form->getMessages();
1646
                foreach ($form_messages  as $fieldname => $field_messages) {
1647
                    foreach ($field_messages as $key => $value) {
1648
                        $message = $value;
1649
                    }
1650
                }
1651
 
1652
                $response = [
1653
                    'success'   => false,
1654
                    'data'   => $message
1655
                ];
1656
 
1657
                return new JsonModel($response);
1658
            }
1659
        } else {
1660
            $response = [
1661
                'success' => false,
1662
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1663
            ];
1664
 
1665
            return new JsonModel($response);
1666
        }
1667
    }
1668
 
1669
 
1670
 
1671
    public function deleteCommentAction()
1672
    {
1673
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1674
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1675
 
1676
        $currentUserPlugin      = $this->plugin('currentUserPlugin');
1677
        $currentUser            = $currentUserPlugin->getUser();
1678
 
1679
        $request                = $this->getRequest();
1680
        $id                     = $this->params()->fromRoute('id');
1681
        $comment                = $this->params()->fromRoute('comment');
1682
 
1683
 
1684
        $request = $this->getRequest();
1685
        if ($request->isPost()) {
1686
 
1687
 
1688
 
1689
 
1690
            $message_error = '';
1691
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1692
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1693
                return new JsonModel([
1694
                    'success'   => false,
1695
                    'data'   => $message_error
1696
                ]);
1697
            }
1698
 
1699
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1700
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1701
 
1702
            $commentMapper = CommentMapper::getInstance($this->adapter);
1703
            $comment = $commentMapper->fetchOneByUuid($comment);
1704
 
1705
 
1706
            if ($comment && $comment->my_coach_answer_id == $myCoachAnswer->id && $comment->user_id == $currentUser->id) {
1707
 
1708
                $comment->status = Comment::STATUS_DELETED;
1709
 
1710
                if ($commentMapper->update($comment)) {
6388 efrain 1711
 
6521 efrain 1712
                    $response = [
1713
                        'success' => true,
1714
                        'data' => [
1715
                            'message' => 'LABEL_COMMENT_WAS_DELETED',
1716
                            'total_comments_answer' => intval( $commentMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10),
1717
                            'total_comments_question' => intval( $commentMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10),
1718
                        ]
1719
                    ];
1720
                } else {
1721
                    $response = [
1722
                        'success' => false,
1723
                        'data' => $commentMapper->getError()
1724
                    ];
1725
 
1726
                }
1727
            } else {
1728
                $response = [
1729
                    'success' => false,
1730
                    'data' => 'ERROR_COMMENT_NOT_FOUND'
1731
                ];
1732
            }
1733
        } else {
1734
            $response = [
1735
                'success' => false,
1736
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1737
            ];
1738
        }
1739
 
1740
        return new JsonModel($response);
1741
    }
1742
 
1743
    public function reactionsAction()
1744
    {
1745
        return new JsonModel([
1746
            'success' => false,
1747
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1748
        ]);
6388 efrain 1749
 
6521 efrain 1750
    }
1751
 
1752
 
1753
 
1754
    public function saveReactionAction()
1755
    {
1756
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1757
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1758
 
1759
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1760
        $currentUser        = $currentUserPlugin->getUser();
1761
 
1762
        $request    = $this->getRequest();
1763
 
1764
        $id = $this->params()->fromRoute('id');
1765
        $reaction  = $this->params()->fromPost('reaction');
1766
 
1767
        $request = $this->getRequest();
1768
        if ($request->isPost()) {
1769
 
1770
 
1771
            $message_error = '';
1772
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1773
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1774
                return new JsonModel([
1775
                    'success'   => false,
1776
                    'data'   => $message_error
6388 efrain 1777
                ]);
6521 efrain 1778
            }
1779
 
7108 efrain 1780
            $reactions = [
1781
                ContentReaction::REACTION_RECOMMENDED,
1782
                ContentReaction::REACTION_SUPPORT,
1783
                ContentReaction::REACTION_LOVE,
1784
                ContentReaction::REACTION_INTEREST,
1785
                ContentReaction::REACTION_FUN
1786
 
1787
            ];
1788
            if(!in_array($reaction, $reactions)) {
1789
                $response = [
1790
                    'success' => false,
1791
                    'data' => 'ERROR_REACTION_NOT_FOUND'
1792
                ];
1793
                return new JsonModel($response);
1794
            }
1795
 
6521 efrain 1796
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1797
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1798
 
1799
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
1800
            $contentReaction = $contentReactionMapper->fetchOneByMyCoachAnswerIdAndUserId($myCoachAnswer->id, $currentUser->id);
1801
 
1802
            if ($contentReaction) {
1803
                $contentReaction->reaction = $reaction;
1804
 
1805
                $result = $contentReactionMapper->update($contentReaction);
1806
            } else {
1807
                $contentReaction = new ContentReaction();
1808
                $contentReaction->user_id = $currentUser->id;
1809
                $contentReaction->my_coach_answer_id = $myCoachAnswer->id;
1810
                $contentReaction->relational = ContentReaction::RELATIONAL_MY_COACH;
1811
                $contentReaction->reaction = $reaction;
1812
 
1813
                $result = $contentReactionMapper->insert($contentReaction);
1814
            }
1815
 
1816
 
1817
 
1818
            if ($result) {
1819
 
1820
                $total_reactions_question = intval($contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10);
1821
                $total_reactions_answer = intval($contentReactionMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10);
1822
                $response = [
1823
                    'success' => true,
1824
                    'data' => [
1825
                        'reaction' => $reaction,
1826
                        'total_reactions_question' => $total_reactions_question,
1827
                        'total_reactions_answer' => $total_reactions_answer
1828
                    ]
1829
                ];
1830
            } else {
1831
                $response = [
1832
                    'success' => false,
1833
                    'data' => $contentReactionMapper->getError()
1834
                ];
1835
            }
1836
            return new JsonModel($response);
1837
        }
1838
 
1839
        $response = [
1840
            'success' => false,
1841
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1842
        ];
1843
        return new JsonModel($response);
1844
    }
1845
 
1846
    public function deleteReactionAction()
1847
    {
1848
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1849
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1850
 
1851
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1852
        $currentUser        = $currentUserPlugin->getUser();
1853
 
1854
        $request    = $this->getRequest();
1855
 
1856
        $id = $this->params()->fromRoute('id');
1857
 
1858
        $request = $this->getRequest();
1859
        if ($request->isPost()) {
1860
 
1861
            $message_error = '';
1862
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1863
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1864
                return new JsonModel([
1865
                    'success'   => false,
1866
                    'data'   => $message_error
1867
                ]);
1868
            }
1869
 
1870
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1871
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1872
 
1873
 
1874
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
1875
            $contentReaction = $contentReactionMapper->fetchOneByMyCoachAnswerIdAndUserId($myCoachAnswer->id, $currentUser->id);
1876
 
1877
            if ($contentReaction) {
1878
                if ($contentReactionMapper->deleteByByMyCoachAnswerId($myCoachAnswer->id, $currentUser->id)) {
1879
                    $total_reactions_question = intval($contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id), 10);
1880
                    $total_reactions_answer = intval($contentReactionMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10);
1881
 
1882
                    $response = [
1883
                        'success' => true,
1884
                        'data' => [
1885
                            'total_reactions_question' => $total_reactions_question,
1886
                            'total_reactions_answer' => $total_reactions_answer
1887
                        ]
1888
                    ];
1889
                } else {
1890
                    $response = [
1891
                        'success' => false,
1892
                        'data' => $contentReactionMapper->getError()
1893
                    ];
1894
                }
1895
            } else {
1896
                $total_reactions_question = $contentReactionMapper->fetchCountByMyCoachQuestionId($myCoachAnswer->question_id);
1897
                $total_reactions_answer = $contentReactionMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id);
1898
 
1899
                $response = [
1900
                    'success' => true,
1901
                    'data' => [
1902
                        'total_reactions_question' => $total_reactions_question,
1903
                        'total_reactions_answer' => $total_reactions_answer
1904
                    ]
1905
                ];
1906
 
1907
 
1908
            }
1909
 
1910
 
1911
 
1912
            return new JsonModel($response);
1913
        }
1914
 
1915
        $response = [
1916
            'success' => false,
1917
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1918
        ];
1919
        return new JsonModel($response);
1920
    }
1921
 
1922
    public function commentsAction()
1923
    {
1924
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1925
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1926
 
1927
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
1928
        $currentUser        = $currentUserPlugin->getUser();
1929
 
1930
 
1931
        $id = $this->params()->fromRoute('id');
1932
 
1933
        $request = $this->getRequest();
1934
        if ($request->isGet()) {
1935
            $message_error = '';
1936
            $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1937
            if(!$myCoachAccessControl->hasAccessViewAnswer($currentUser->id, $id, $currentNetwork->id, $message_error)) {
1938
                return new JsonModel([
1939
                    'success'   => false,
1940
                    'data'   => $message_error
1941
                ]);
1942
            }
1943
 
1944
            $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1945
            $myCoachAnswer = $myCoachAnswerMapper->fetchOneByUuid($id);
1946
            $now = $myCoachAnswerMapper->getDatebaseNow();
1947
 
1948
            $commentMapper = CommentMapper::getInstance($this->adapter);
1949
            $records = $commentMapper->fetchAllPublishedByMyCoachAnswerId($myCoachAnswer->id);
1950
 
1951
            $comments = [];
1952
            foreach ($records as $record) {
1953
                $comment = $this->renderComment($record->id, $now);
1954
                array_push($comments, $comment);
1955
            }
1956
 
1957
            $response = [
1958
                'success' => true,
1959
                'data' => $comments
1960
            ];
1961
 
1962
            return new JsonModel($response);
5050 efrain 1963
        } else {
6521 efrain 1964
 
1965
 
1966
 
1967
            $response = [
5050 efrain 1968
                'success' => false,
1969
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
6521 efrain 1970
            ];
1971
 
1972
 
1973
            return new JsonModel($response);
5050 efrain 1974
        }
1975
    }
6521 efrain 1976
 
1977
 
1978
    private function renderAnswer($answer_id, $current_user_id, $now)
1979
    {
6547 efrain 1980
        $currentNetworkPlugin  = $this->plugin('currentNetworkPlugin');
1981
        $currentNetwork        = $currentNetworkPlugin->getNetwork();
1982
        $message_error = '';
6521 efrain 1983
 
1984
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
1985
        $myCoachAnswer =  $myCoachAnswerMapper->fetchOne($answer_id);
6547 efrain 1986
 
1987
        $myCoachQuestionMapper = MyCoachQuestionMapper::getInstance($this->adapter);
1988
        $myCoachQuestion = $myCoachQuestionMapper->fetchOne($myCoachAnswer->question_id);
6521 efrain 1989
 
1990
 
6547 efrain 1991
        $myCoachAccessControl = MyCoachAccessControl::getInstance($this->adapter);
1992
        $hasAccessEditOrDeleteAnswer = $myCoachAccessControl->hasAccessEditOrDeleteAnswer($current_user_id, $answer_id, $currentNetwork->id, $message_error);
1993
        if($hasAccessEditOrDeleteAnswer) {
1994
 
1995
 
1996
            $link_edit = $this->url()->fromRoute('my-coach/questions/answers/edit',['id' => $myCoachQuestion->uuid, 'answer' => $myCoachAnswer->uuid]);
1997
            $link_delete = $this->url()->fromRoute('my-coach/questions/answers/delete',['id' => $myCoachQuestion->uuid, 'answer' => $myCoachAnswer->uuid]);
1998
 
1999
        } else {
2000
            $link_edit = '';
2001
            $link_delete = '';
2002
        }
2003
 
6521 efrain 2004
        $userMapper = UserMapper::getInstance($this->adapter);
2005
        $user = $userMapper->fetchOne($myCoachAnswer->user_id);
2006
 
2007
        $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
2008
        $contentReaction = $contentReactionMapper->fetchOneByMyCoachAnswerIdAndUserId($myCoachAnswer->id, $current_user_id);
6547 efrain 2009
        $total_reactions = intval($contentReactionMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id), 10);
6521 efrain 2010
 
2011
 
2012
 
2013
 
2014
        $comments = [];
2015
        $commentMapper = CommentMapper::getInstance($this->adapter);
2016
        $total_comments = $commentMapper->fetchCountByMyCoachAnswerId($myCoachAnswer->id);
2017
        $records = $commentMapper->fetchAllPublishedByMyCoachAnswerId($myCoachAnswer->id);
2018
        foreach($records as $record)
2019
        {
2020
            $comments[] = $this->renderComment($record->id, $now);
2021
        }
2022
 
2023
 
2024
        $item = [
2025
            'unique' => uniqid(),
2026
            'uuid' => $myCoachAnswer->uuid,
6547 efrain 2027
            'question_uuid' => $myCoachQuestion->uuid,
6521 efrain 2028
            'user_image' => $this->url()->fromRoute('storage', ['type' => 'user',  'code' => $user->uuid, 'filename' =>  $user->image]),
2029
            'user_url' => $this->url()->fromRoute('profile/view', ['id' => $user->uuid]),
2030
            'user_name' => $user->first_name . ' ' . $user->last_name,
2031
            'time_elapsed' => Functions::timeAgo($myCoachAnswer->added_on, $now),
2032
            'text' => $myCoachAnswer->text,
2033
            'reaction' => $contentReaction ? $contentReaction->reaction : '',
2034
            'total_comments' => $total_comments,
2035
            'total_reactions' => $total_reactions,
2036
            'comments' => $comments,
6547 efrain 2037
            'link_edit' => $link_edit,
2038
            'link_delete' => $link_delete,
6521 efrain 2039
            'link_reaction_delete' => $this->url()->fromRoute('my-coach/questions/reaction/delete', ['id' => $myCoachAnswer->uuid]),
2040
            'link_save_reaction' => $this->url()->fromRoute('my-coach/questions/reaction/save', ['id' => $myCoachAnswer->uuid]),
2041
            'link_add_comment' => $this->url()->fromRoute('my-coach/questions/comments/add', ['id' => $myCoachAnswer->uuid]),
2042
        ];
6388 efrain 2043
 
6521 efrain 2044
        return $item;
2045
 
2046
 
2047
 
2048
    }
2049
 
2050
 
2051
 
2052
    private function renderComment($comment_id, $now)
2053
    {
2054
        $item = [];
2055
 
2056
        $commentMapper = CommentMapper::getInstance($this->adapter);
2057
        $record = $commentMapper->fetchOne($comment_id);
2058
 
2059
        $myCoachAnswerMapper = MyCoachAnswerMapper::getInstance($this->adapter);
2060
        $myCoachAnswer = $myCoachAnswerMapper->fetchOne($record->my_coach_answer_id);
2061
 
2062
 
2063
        if ($record) {
2064
            $userMapper = UserMapper::getInstance($this->adapter);
2065
 
2066
            $user = $userMapper->fetchOne($record->user_id);
2067
 
2068
            $item['unique'] = uniqid();
2069
            $item['answer_uuid'] = $myCoachAnswer->uuid;
2070
            $item['user_image'] = $this->url()->fromRoute('storage', ['type' => 'user',  'code' => $user->uuid, 'filename' =>  $user->image]);
2071
            $item['user_url'] = $this->url()->fromRoute('profile/view', ['id' => $user->uuid]);
2072
            $item['user_name'] = $user->first_name . ' ' . $user->last_name;
2073
            $item['time_elapsed'] = Functions::timeAgo($record->added_on, $now);
2074
            $item['comment'] = $record->comment;
2075
            $item['link_delete'] = $this->url()->fromRoute('my-coach/questions/comments/delete', ['id' => $myCoachAnswer->uuid, 'comment' => $record->uuid]);
2076
        }
2077
        return $item;
2078
    }
2079
 
5050 efrain 2080
}