Proyectos de Subversion LeadersLinked - Antes de SPA

Rev

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