Proyectos de Subversion LeadersLinked - Services

Rev

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

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