Proyectos de Subversion LeadersLinked - Services

Rev

Rev 724 | Rev 726 | 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
 
3
/**
4
 *
5
 * Controlador: Mis Perfiles
6
 *
7
 */
8
 
9
declare(strict_types=1);
10
 
11
namespace LeadersLinked\Controller;
12
 
13
use Laminas\Db\Adapter\AdapterInterface;
14
 
15
use Laminas\Mvc\Controller\AbstractActionController;
16
use Laminas\Log\LoggerInterface;
17
use Laminas\View\Model\ViewModel;
18
use Laminas\View\Model\JsonModel;
19
use LeadersLinked\Library\Functions;
20
use LeadersLinked\Mapper\KnowledgeAreaCategoryMapper;
21
use LeadersLinked\Mapper\KnowledgeAreaCategoryUserMapper;
22
use LeadersLinked\Mapper\UserMapper;
23
use LeadersLinked\Model\KnowledgeAreaCategory;
24
use LeadersLinked\Model\KnowledgeAreaCategoryUser;
25
use LeadersLinked\Form\KnowledgeArea\KnowledgeAreaCreateForm;
26
use LeadersLinked\Mapper\KnowledgeAreaContentMapper;
27
use LeadersLinked\Model\KnowledgeAreaContent;
28
use LeadersLinked\Form\KnowledgeArea\KnowledgeAreaEditForm;
29
use LeadersLinked\Mapper\CommentMapper;
30
use LeadersLinked\Form\KnowledgeArea\CommentForm;
31
use LeadersLinked\Model\Comment;
32
use LeadersLinked\Mapper\ContentReactionMapper;
33
use LeadersLinked\Model\ContentReaction;
34
use LeadersLinked\Mapper\KnowledgeAreaCategoryJobDescriptionMapper;
35
use LeadersLinked\Mapper\OrganizationPositionMapper;
242 efrain 36
use LeadersLinked\Model\User;
283 www 37
use LeadersLinked\Library\Storage;
1 efrain 38
 
39
class KnowledgeAreaController extends AbstractActionController
40
{
41
    /**
42
     *
43
     * @var \Laminas\Db\Adapter\AdapterInterface
44
     */
45
    private $adapter;
46
 
47
    /**
48
     *
49
     * @var \LeadersLinked\Cache\CacheInterface
50
     */
51
    private $cache;
52
 
53
 
54
    /**
55
     *
56
     * @var \Laminas\Log\LoggerInterface
57
     */
58
    private $logger;
59
 
60
    /**
61
     *
62
     * @var array
63
     */
64
    private $config;
65
 
66
 
67
    /**
68
     *
69
     * @var \Laminas\Mvc\I18n\Translator
70
     */
71
    private $translator;
72
 
73
 
74
    /**
75
     *
76
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
77
     * @param \LeadersLinked\Cache\CacheInterface $cache
78
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
79
     * @param array $config
80
     * @param \Laminas\Mvc\I18n\Translator $translator
81
     */
82
    public function __construct($adapter, $cache, $logger, $config, $translator)
83
    {
84
        $this->adapter      = $adapter;
85
        $this->cache        = $cache;
86
        $this->logger       = $logger;
87
        $this->config       = $config;
88
        $this->translator   = $translator;
89
    }
90
 
91
    /**
92
     *
562 stevensc 93
     * Handles the display of the knowledge area content listing.
94
     * Fetches knowledge areas based on user permissions, network settings, and filters.
95
     * Returns a JSON response suitable for a data table or list view.
1 efrain 96
     * {@inheritDoc}
97
     * @see \Laminas\Mvc\Controller\AbstractActionController::indexAction()
98
     */
99
    public function indexAction()
100
    {
721 stevensc 101
        $request = $this->getRequest();
102
        if (!$request->isGet()) {
103
            return new JsonModel([
104
                'success' => false,
105
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
106
            ]);
107
        }
108
 
562 stevensc 109
        // Get current user and network information from plugins.
1 efrain 110
        $currentUserPlugin = $this->plugin('currentUserPlugin');
111
        $currentUser = $currentUserPlugin->getUser();
112
 
113
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
114
        $currentNetwork = $currentNetworkPlugin->getNetwork();
115
 
721 stevensc 116
        // --- Query Parameters ---
117
        $category_filter_id = Functions::sanitizeFilterString($this->params()->fromQuery('category_id'));
118
        $search             = Functions::sanitizeFilterString($this->params()->fromQuery('search'));
119
        $page               = intval($this->params()->fromQuery('start', 1), 10);
120
        $order_field        = 'added_on'; // Default order field
121
        $order_direction    = 'asc';      // Default order direction
122
        $records_x_page     = 12;         // Default records per page
123
 
124
        // --- Get accessible categories and filter by category if needed ---
125
        $categoryData = $this->getAccessibleCategories($currentUser, $currentNetwork);
126
        $category_ids_to_filter = $this->filterCategoriesByRequest($categoryData, $category_filter_id);
127
 
128
        // --- Content Fetching ---
129
        $storage = Storage::getInstance($this->config, $this->adapter);
130
        $path = $storage->getPathKnowledgeArea();
131
 
132
        $knowledgeAreaContentMapper = KnowledgeAreaContentMapper::getInstance($this->adapter);
133
        $paginator = $knowledgeAreaContentMapper->fetchAllDataTableByCategoryIds(
134
            $category_ids_to_filter,
135
            $search,
136
            $page,
137
            $records_x_page,
138
            $order_field,
139
            $order_direction
140
        );
141
 
142
        // --- Response Item Construction ---
143
        $items = $this->buildContentItems($paginator, $categoryData, $storage, $path);
144
 
145
        // --- JSON Response ---
146
        $image_size = $this->config['leaderslinked.image_sizes.knowledge_area'];
147
 
148
        return new JsonModel([
149
            'success' => true,
150
            'data' => [
151
                'current' => [
152
                    'items' => $items,
153
                    'page' => $paginator->getCurrentPageNumber(),
154
                    'count' => $paginator->getCurrentItemCount(),
155
                ],
156
                'total' => [
157
                    'count' => $paginator->getTotalItemCount(),
158
                    'pages' => $paginator->getPages()->pageCount,
159
                ],
160
                'categories' => array_values($categoryData['categories']),
161
                'categories_with_edition' => $categoryData['categories_with_edition_uuids'],
162
                'link_add' => $categoryData['allow_add'] ? $this->url()->fromRoute('knowledge-area/add') : '',
163
                'image_size' => $image_size,
164
                'content_edit' => count($categoryData['category_with_edition_ids']) > 0,
165
            ]
166
        ]);
167
    }
168
 
169
    /**
170
     * Get metadata for knowledge area (categories, permissions, etc.)
171
     * This endpoint can be called separately to get UI configuration data
172
     */
173
    public function metadataAction()
174
    {
1 efrain 175
        $request = $this->getRequest();
721 stevensc 176
        if (!$request->isGet()) {
177
            return new JsonModel([
178
                'success' => false,
179
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
180
            ]);
181
        }
1 efrain 182
 
721 stevensc 183
        $currentUserPlugin = $this->plugin('currentUserPlugin');
184
        $currentUser = $currentUserPlugin->getUser();
1 efrain 185
 
721 stevensc 186
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
187
        $currentNetwork = $currentNetworkPlugin->getNetwork();
1 efrain 188
 
721 stevensc 189
        $categoryData = $this->getAccessibleCategories($currentUser, $currentNetwork);
190
        $image_size = $this->config['leaderslinked.image_sizes.knowledge_area'];
1 efrain 191
 
721 stevensc 192
        return new JsonModel([
193
            'success' => true,
194
            'data' => [
195
                'categories' => array_values($categoryData['categories']),
196
                'categories_with_edition' => $categoryData['categories_with_edition_uuids'],
197
                'link_add' => $categoryData['allow_add'] ? $this->url()->fromRoute('knowledge-area/add') : '',
198
                'image_size' => $image_size,
199
                'content_edit' => count($categoryData['category_with_edition_ids']) > 0,
200
            ]
201
        ]);
202
    }
1 efrain 203
 
721 stevensc 204
    /**
205
     * Get only the content listing without metadata
206
     * This endpoint can be called for pagination/filtering without reloading metadata
207
     */
208
    public function listAction()
209
    {
210
        $request = $this->getRequest();
211
        if (!$request->isGet()) {
212
            return new JsonModel([
213
                'success' => false,
214
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
215
            ]);
216
        }
217
 
218
        $currentUserPlugin = $this->plugin('currentUserPlugin');
219
        $currentUser = $currentUserPlugin->getUser();
220
 
221
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
222
        $currentNetwork = $currentNetworkPlugin->getNetwork();
223
 
224
        // --- Query Parameters ---
225
        $category_filter_id = Functions::sanitizeFilterString($this->params()->fromQuery('category_id'));
226
        $search             = Functions::sanitizeFilterString($this->params()->fromQuery('search'));
227
        $page               = intval($this->params()->fromQuery('start', 1), 10);
228
        $order_field        = 'added_on';
229
        $order_direction    = 'asc';
230
        $records_x_page     = 12;
231
 
232
        // --- Get accessible categories and filter ---
233
        $categoryData = $this->getAccessibleCategories($currentUser, $currentNetwork);
234
        $category_ids_to_filter = $this->filterCategoriesByRequest($categoryData, $category_filter_id);
235
 
236
        // --- Content Fetching ---
237
        $storage = Storage::getInstance($this->config, $this->adapter);
238
        $path = $storage->getPathKnowledgeArea();
239
 
240
        $knowledgeAreaContentMapper = KnowledgeAreaContentMapper::getInstance($this->adapter);
241
        $paginator = $knowledgeAreaContentMapper->fetchAllDataTableByCategoryIds(
242
            $category_ids_to_filter,
243
            $search,
244
            $page,
245
            $records_x_page,
246
            $order_field,
247
            $order_direction
248
        );
249
 
250
        // --- Response Item Construction ---
251
        $items = $this->buildContentItems($paginator, $categoryData, $storage, $path);
252
 
253
        return new JsonModel([
254
            'success' => true,
255
            'data' => [
256
                'current' => [
257
                    'items' => $items,
258
                    'page' => $paginator->getCurrentPageNumber(),
259
                    'count' => $paginator->getCurrentItemCount(),
260
                ],
261
                'total' => [
262
                    'count' => $paginator->getTotalItemCount(),
263
                    'pages' => $paginator->getPages()->pageCount,
264
                ],
265
            ]
266
        ]);
267
    }
268
 
269
    /**
270
     * Get accessible categories for the current user and network
271
     *
272
     * @param object $currentUser
273
     * @param object $currentNetwork
274
     * @return array
275
     */
276
    private function getAccessibleCategories($currentUser, $currentNetwork)
277
    {
278
        // --- ACL Permissions ---
279
        $acl = $this->getEvent()->getViewModel()->getVariable('acl');
280
        $allowAdd       = $acl->isAllowed($currentUser->usertype_id, 'knowledge-area/add') ? 1 : 0;
281
        $allowEdit      = $acl->isAllowed($currentUser->usertype_id, 'knowledge-area/edit');
282
        $allowDelete    = $acl->isAllowed($currentUser->usertype_id, 'knowledge-area/delete');
283
        $allowView      = $acl->isAllowed($currentUser->usertype_id, 'knowledge-area/view');
284
 
285
        // --- Category Fetching and Processing ---
286
        $category_with_edition_ids = [];
287
        $category_with_edition_uuids = [];
288
        $user_accessible_category_ids = [];
289
        $categories = [];
290
 
291
        // Instantiate mappers.
292
        $knowledgeAreaCategoryMapper = KnowledgeAreaCategoryMapper::getInstance($this->adapter);
293
        $knowledgeAreaCategoryUserMapper = KnowledgeAreaCategoryUserMapper::getInstance($this->adapter);
294
 
295
        // 1. Fetch categories based on user's direct permissions
296
        $userCategoryRecords = $knowledgeAreaCategoryUserMapper->fetchAllByUserId($currentUser->id);
297
        foreach ($userCategoryRecords as $record) {
298
            if ($record->role == KnowledgeAreaCategoryUser::ROLE_ADMINISTRATOR || $record->role == KnowledgeAreaCategoryUser::ROLE_USER) {
299
                array_push($category_with_edition_ids, $record->category_id);
300
                $categoryDetails = $knowledgeAreaCategoryMapper->fetchOne($record->category_id);
301
                if($categoryDetails) {
302
                    array_push($category_with_edition_uuids, $categoryDetails->uuid);
1 efrain 303
                }
562 stevensc 304
            }
721 stevensc 305
            array_push($user_accessible_category_ids, $record->category_id);
306
        }
1 efrain 307
 
721 stevensc 308
        // 2. Fetch details for all directly accessible categories
309
        if (!empty($user_accessible_category_ids)) {
310
            $detailedUserCategories = $knowledgeAreaCategoryMapper->fetchAllByIds($user_accessible_category_ids);
311
            foreach ($detailedUserCategories as $record) {
312
                if (!isset($categories[$record->id])) {
562 stevensc 313
                    $categories[$record->id] = [
314
                        'uuid' => $record->uuid,
315
                        'name' => $record->name,
316
                    ];
317
                }
318
            }
721 stevensc 319
        }
562 stevensc 320
 
721 stevensc 321
        // 3. Fetch all public categories within the current network
322
        $publicCategories = $knowledgeAreaCategoryMapper->fetchAllPublicByNetworkId($currentNetwork->id);
323
        foreach ($publicCategories as $record) {
324
            if (!isset($categories[$record->id])) {
325
                $categories[$record->id] = [
326
                    'uuid' => $record->uuid,
327
                    'name' => $record->name,
328
                ];
329
            }
330
        }
331
 
332
        // Sort all collected categories alphabetically by name
333
        uasort($categories, function ($a, $b) {
334
            return $a['name'] <=> $b['name'];
335
        });
1 efrain 336
 
721 stevensc 337
        return [
338
            'categories' => $categories,
339
            'category_with_edition_ids' => $category_with_edition_ids,
340
            'categories_with_edition_uuids' => $category_with_edition_uuids,
341
            'allow_add' => $allowAdd,
342
            'allow_edit' => $allowEdit,
343
            'allow_delete' => $allowDelete,
344
            'allow_view' => $allowView,
345
        ];
346
    }
347
 
348
    /**
349
     * Filter categories based on request parameter
350
     *
351
     * @param array $categoryData
352
     * @param string $category_filter_id
353
     * @return array
354
     */
355
    private function filterCategoriesByRequest($categoryData, $category_filter_id)
356
    {
357
        $category_ids_to_filter = array_keys($categoryData['categories']);
358
 
359
        if ($category_filter_id) {
360
            $knowledgeAreaCategoryMapper = KnowledgeAreaCategoryMapper::getInstance($this->adapter);
361
            $categoryFilter = $knowledgeAreaCategoryMapper->fetchOneByUuid($category_filter_id);
362
            if ($categoryFilter && isset($categoryData['categories'][$categoryFilter->id])) {
363
                $category_ids_to_filter = [$categoryFilter->id];
364
            } else {
365
                $category_ids_to_filter = [];
366
            }
367
        }
368
 
369
        return $category_ids_to_filter;
370
    }
371
 
372
    /**
373
     * Build content items for response
374
     *
375
     * @param object $paginator
376
     * @param array $categoryData
377
     * @param object $storage
378
     * @param string $path
379
     * @return array
380
     */
381
    private function buildContentItems($paginator, $categoryData, $storage, $path)
382
    {
383
        $items = [];
384
        $contentRecords = $paginator->getCurrentItems();
385
        $knowledgeAreaCategoryMapper = KnowledgeAreaCategoryMapper::getInstance($this->adapter);
386
 
387
        foreach ($contentRecords as $record) {
388
            // Ensure category details are available for the current content item
389
            if (!isset($categoryData['categories'][$record->category_id])) {
390
                $category = $knowledgeAreaCategoryMapper->fetchOne($record->category_id);
391
                if ($category) {
392
                    $categoryData['categories'][$category->id] = [
393
                        'uuid' => $category->uuid,
394
                        'name' => $category->name,
395
                    ];
562 stevensc 396
                } else {
721 stevensc 397
                    $categoryData['categories'][$record->category_id] = ['uuid' => null, 'name' => 'Unknown Category'];
562 stevensc 398
                }
399
            }
400
 
721 stevensc 401
            // Strip HTML tags and truncate description for display
402
            $description = strip_tags($record->description);
403
            if (strlen($description) > 120) {
404
                $description = substr($description, 0, 120) . '...';
405
            }
1 efrain 406
 
721 stevensc 407
            // Construct the item for the JSON response
408
            $item = [
724 stevensc 409
                'image' => $storage->getGenericImage($path, $record->uuid, $record->image),
721 stevensc 410
                'title' => $record->title,
411
                'description' => $description,
412
                'category' => $categoryData['categories'][$record->category_id]['name'],
413
                'link_view' => $categoryData['allow_view'] ? $this->url()->fromRoute('knowledge-area/view', ['id' => $record->uuid]) : '',
414
            ];
1 efrain 415
 
721 stevensc 416
            // Add edit/delete links if user has permission for the content's category
417
            if (in_array($record->category_id, $categoryData['category_with_edition_ids'])) {
418
                $item['link_edit'] = $categoryData['allow_edit'] ? $this->url()->fromRoute('knowledge-area/edit', ['id' => $record->uuid]) : '';
419
                $item['link_delete'] = $categoryData['allow_delete'] ? $this->url()->fromRoute('knowledge-area/delete', ['id' => $record->uuid]) : '';
562 stevensc 420
            }
721 stevensc 421
            array_push($items, $item);
1 efrain 422
        }
721 stevensc 423
 
424
        return $items;
1 efrain 425
    }
426
 
427
    public function addAction()
428
    {
429
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
430
        $currentUser        = $currentUserPlugin->getUser();
431
 
432
        $request            = $this->getRequest();
433
 
434
        if ($request->isPost()) {
435
            $category_with_edition_ids = [];
436
            $category_ids = [];
437
 
438
 
439
            $categories = [];
440
 
441
 
442
            $knowledgeAreaCategoryUserMapper = KnowledgeAreaCategoryUserMapper::getInstance($this->adapter);
443
            $records =  $knowledgeAreaCategoryUserMapper->fetchAllByUserId($currentUser->id);
444
            foreach ($records as $record) {
445
                if ($record->role == KnowledgeAreaCategoryUser::ROLE_ADMINISTRATOR || $record->role == KnowledgeAreaCategoryUser::ROLE_USER) {
446
 
447
                    array_push($category_with_edition_ids, $record->category_id);
448
                }
449
 
450
                array_push($category_ids, $record->category_id);
451
            }
452
 
453
            $knowledgeAreaCategoryMapper = KnowledgeAreaCategoryMapper::getInstance($this->adapter);
454
 
455
            if ($category_ids) {
456
                $records =  $knowledgeAreaCategoryMapper->fetchAllByIds($category_ids);
457
                foreach ($records as $record) {
458
                    if ($record->status == KnowledgeAreaCategory::STATUS_ACTIVE) {
459
 
460
                        $categories[$record->id] = [
461
                            'uuid' => $record->uuid,
462
                            'name' => $record->name,
463
                        ];
464
                    }
465
                }
466
            }
467
 
468
 
469
 
470
            $categories = array_values($categories);
471
            usort($categories, function ($a, $b) {
472
                return $a['name'] <=> $b['name'];
473
            });
474
 
475
 
476
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
477
            $form = new KnowledgeAreaCreateForm($this->adapter, $category_with_edition_ids);
478
 
479
            $form->setData($dataPost);
480
 
481
            if ($form->isValid()) {
482
                $dataPost = (array) $form->getData();
483
 
484
                $knowledgeAreaCategoryMapper = KnowledgeAreaCategoryMapper::getInstance($this->adapter);
485
                $knowledgeAreaCategory = $knowledgeAreaCategoryMapper->fetchOneByUuid($dataPost['category_id']);
486
 
487
 
488
                $knowledgeAreaContent = new KnowledgeAreaContent();
489
                $knowledgeAreaContent->network_id = $knowledgeAreaCategory->network_id;
490
                $knowledgeAreaContent->company_id = $knowledgeAreaCategory->company_id;
491
                $knowledgeAreaContent->category_id = $knowledgeAreaCategory->id;
492
                $knowledgeAreaContent->user_id = $currentUser->id;
493
                $knowledgeAreaContent->title = $dataPost['title'];
494
                $knowledgeAreaContent->description = $dataPost['description'];
495
                $knowledgeAreaContent->link = $dataPost['link'];
496
 
497
                $knowledgeAreaContentMapper = KnowledgeAreaContentMapper::getInstance($this->adapter);
498
                if ($knowledgeAreaContentMapper->insert($knowledgeAreaContent)) {
499
                    $knowledgeAreaContent = $knowledgeAreaContentMapper->fetchOne($knowledgeAreaContent->id);
500
 
561 stevensc 501
                    // Se instancia la clase Storage para manejar el almacenamiento de archivos.
502
                    // La clase Image fue eliminada debido a que no se encontraba o estaba obsoleta.
334 www 503
                    $storage = Storage::getInstance($this->config, $this->adapter);
561 stevensc 504
                    // Obtiene la ruta base para los archivos del área de conocimiento.
505
                    // $target_path = $storage->getPathKnowledgeArea(); // No longer needed directly here, composePathTo methods use storagePath internally
1 efrain 506
 
721 stevensc 507
                    $storage->setFiles($request->getFiles()->toArray());
1 efrain 508
 
721 stevensc 509
                    if($storage->setCurrentFilename('image')) {
510
                        $tmp_filename = $storage->getTmpFilename();
511
                        $filename = 'knowledge_image_' . $knowledgeAreaContent->uuid  . '.' . $storage->getExtension();
725 stevensc 512
                        $storage->composePathToFilename(Storage::TYPE_KNOWLEDGE_AREA, $knowledgeAreaContent->uuid, $filename);
721 stevensc 513
 
561 stevensc 514
                        list($target_width_str, $target_height_str) = explode('x', $this->config['leaderslinked.image_sizes.knowledge_area']);
515
                        $target_width = (int)$target_width_str;
516
                        $target_height = (int)$target_height_str;
517
 
721 stevensc 518
                        if (!$storage->uploadImageResize($tmp_filename, $filename, $target_width, $target_height)) {
519
                            return new JsonModel([
520
                                'success'   => false,
521
                                'data'      => 'ERROR_IMAGE_UPLOAD'
522
                            ]);
560 stevensc 523
                        }
334 www 524
 
721 stevensc 525
                        $knowledgeAreaContent->image = $filename;
1 efrain 526
                    }
527
 
721 stevensc 528
                    if($storage->setCurrentFilename('attachment')) {
529
                        $tmp_filename = $storage->getTmpFilename();
530
                        $filename = 'knowledge_attachment_' . $knowledgeAreaContent->uuid  . '.' . $storage->getExtension();
531
                        $storage->composePathToFilename(Storage::TYPE_KNOWLEDGE_AREA, $knowledgeAreaCategory->uuid, $filename);
532
 
533
                        if (!$storage->moveUploadedFile($tmp_filename, $filename)) {
534
                            return new JsonModel([
535
                                'success'   => false,
536
                                'data'      => 'ERROR_IMAGE_UPLOAD'
537
                            ]);
560 stevensc 538
                        }
539
 
721 stevensc 540
                        $knowledgeAreaContent->attachment = $filename;
1 efrain 541
                    }
542
 
721 stevensc 543
                    if(!$knowledgeAreaContentMapper->update($knowledgeAreaContent)) {
544
                        return new JsonModel([
545
                            'success'   => false,
546
                            'data'      => $knowledgeAreaContentMapper->getError()
547
                        ]);
548
                    }
549
 
1 efrain 550
                    $this->logger->info('Se agrego el contenido ' . $knowledgeAreaContent->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
551
 
552
                    $data = [
553
                        'success'   => true,
721 stevensc 554
                        'data'      => [
555
                            'message' => 'LABEL_RECORD_ADDED',
556
                            'knowledge'    => $knowledgeAreaContent
557
                        ]
1 efrain 558
                    ];
559
                } else {
560
                    $data = [
561
                        'success'   => false,
562
                        'data'      => $knowledgeAreaContentMapper->getError()
563
                    ];
564
                }
565
 
566
                return new JsonModel($data);
567
            } else {
568
                $messages = [];
569
                $form_messages = (array) $form->getMessages();
570
                foreach ($form_messages  as $fieldname => $field_messages) {
571
 
572
                    $messages[$fieldname] = array_values($field_messages);
573
                }
574
 
575
                return new JsonModel([
576
                    'success'   => false,
577
                    'data'   => $messages
578
                ]);
579
            }
580
        } else {
581
            $data = [
582
                'success' => false,
583
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
584
            ];
585
 
586
            return new JsonModel($data);
587
        }
588
 
589
        return new JsonModel($data);
590
    }
591
 
592
    public function deleteAction()
593
    {
594
        $currentUserPlugin = $this->plugin('currentUserPlugin');
595
        $currentUser    = $currentUserPlugin->getUser();
596
 
597
 
598
        $request    = $this->getRequest();
599
        $id         = $this->params()->fromRoute('id');
600
 
601
 
602
 
603
        $knowledgeAreaContentMapper = KnowledgeAreaContentMapper::getInstance($this->adapter);
604
        $knowledgeAreaContent = $knowledgeAreaContentMapper->fetchOneByUuid($id);
605
        if (!$knowledgeAreaContent) {
606
            return new JsonModel([
607
                'success'   => false,
608
                'data'   => 'ERROR_RECORD_NOT_FOUND'
609
            ]);
610
        }
611
 
612
 
613
 
614
        $knowledgeAreaCategoryUserMapper = KnowledgeAreaCategoryUserMapper::getInstance($this->adapter);
615
        $knowledgeAreaCategoryUser = $knowledgeAreaCategoryUserMapper->fetchOneByCategoryIdAndUserId($knowledgeAreaContent->category_id, $currentUser->id);
616
 
617
        $ok = false;
618
        if ($knowledgeAreaCategoryUser) {
619
 
620
            if ($knowledgeAreaCategoryUser->role == KnowledgeAreaCategoryUser::ROLE_EDITOR) {
621
                $ok = $knowledgeAreaContent->user_id == $currentUser->id;
622
            }
623
 
624
            if ($knowledgeAreaCategoryUser->role == KnowledgeAreaCategoryUser::ROLE_ADMINISTRATOR) {
625
                $ok = true;
626
            }
627
        }
628
 
629
        if (!$ok) {
630
            return new JsonModel([
631
                'success'   => false,
632
                'data'   => 'ERROR_KNOWLEDGE_AREA_YOU_DO_NOT_HAVE_PERMISSION'
633
            ]);
634
        }
635
 
636
        if ($request->isPost()) {
637
 
638
            $result =  $knowledgeAreaContentMapper->delete($knowledgeAreaContent);
639
            if ($result) {
640
                $this->logger->info('Se borro el cotenido : ' .  $knowledgeAreaContent->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
641
 
283 www 642
 
333 www 643
                $storage = Storage::getInstance($this->config, $this->adapter);
283 www 644
                $target_path = $storage->getPathKnowledgeArea();
645
 
646
 
647
                if($knowledgeAreaContent->attachment) {
648
                    $storage->deleteFile($target_path, $knowledgeAreaContent->uuid, $knowledgeAreaContent->attachment);
649
                }
650
 
651
 
652
 
1 efrain 653
                if ($knowledgeAreaContent->image) {
283 www 654
                    $storage->deleteFile($target_path, $knowledgeAreaContent->uuid, $knowledgeAreaContent->image);
1 efrain 655
                }
656
 
657
                $data = [
658
                    'success' => true,
659
                    'data' => 'LABEL_RECORD_DELETED'
660
                ];
661
            } else {
662
 
663
                $data = [
664
                    'success'   => false,
665
                    'data'      => $knowledgeAreaContentMapper->getError()
666
                ];
667
 
668
                return new JsonModel($data);
669
            }
670
        } else {
671
            $data = [
672
                'success' => false,
673
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
674
            ];
675
 
676
            return new JsonModel($data);
677
        }
678
 
679
        return new JsonModel($data);
680
    }
681
 
682
 
683
    public function editAction()
684
    {
685
        $currentUserPlugin = $this->plugin('currentUserPlugin');
686
        $currentUser    = $currentUserPlugin->getUser();
687
 
688
        $request    = $this->getRequest();
689
        $id    = $this->params()->fromRoute('id');
690
 
691
        $knowledgeAreaContentMapper = KnowledgeAreaContentMapper::getInstance($this->adapter);
692
        $knowledgeAreaContent = $knowledgeAreaContentMapper->fetchOneByUuid($id);
693
        if (!$knowledgeAreaContent) {
694
            return new JsonModel([
695
                'success'   => false,
696
                'data'   => 'ERROR_RECORD_NOT_FOUND'
697
            ]);
698
        }
699
 
700
 
701
 
702
        $knowledgeAreaCategoryUserMapper = KnowledgeAreaCategoryUserMapper::getInstance($this->adapter);
703
        $knowledgeAreaCategoryUser = $knowledgeAreaCategoryUserMapper->fetchOneByCategoryIdAndUserId($knowledgeAreaContent->category_id, $currentUser->id);
704
 
705
        $ok = false;
706
        if ($knowledgeAreaCategoryUser) {
707
 
708
            if ($knowledgeAreaCategoryUser->role == KnowledgeAreaCategoryUser::ROLE_EDITOR) {
709
                $ok = $knowledgeAreaContent->user_id == $currentUser->id;
710
            }
711
 
712
            if ($knowledgeAreaCategoryUser->role == KnowledgeAreaCategoryUser::ROLE_ADMINISTRATOR) {
713
                $ok = true;
714
            }
715
        }
716
 
717
        if (!$ok) {
718
            return new JsonModel([
719
                'success'   => false,
720
                'data'   => 'ERROR_KNOWLEDGE_AREA_YOU_DO_NOT_HAVE_PERMISSION'
721
            ]);
722
        }
723
 
724
        if ($request->isGet()) {
725
 
726
 
727
            $knowledgeAreaCategoryMapper = KnowledgeAreaCategoryMapper::getInstance($this->adapter);
728
            $knowledgeAreaCategory = $knowledgeAreaCategoryMapper->fetchOne($knowledgeAreaContent->category_id);
729
 
730
 
731
 
732
            $data = [
733
                'success' => true,
734
                'data' => [
735
                    'category_id' => $knowledgeAreaCategory->uuid,
736
                    'title' => $knowledgeAreaContent->title,
737
                    'description' => $knowledgeAreaContent->description,
738
                    'link' => $knowledgeAreaContent->link,
739
                ]
740
            ];
741
 
742
            return new JsonModel($data);
743
        } else if ($request->isPost()) {
744
            $category_with_edition_ids = [];
745
            $category_ids = [];
746
 
747
 
748
            $categories = [];
749
 
750
 
751
            $knowledgeAreaCategoryUserMapper = KnowledgeAreaCategoryUserMapper::getInstance($this->adapter);
752
            $records =  $knowledgeAreaCategoryUserMapper->fetchAllByUserId($currentUser->id);
753
            foreach ($records as $record) {
754
                if ($record->role == KnowledgeAreaCategoryUser::ROLE_ADMINISTRATOR || $record->role == KnowledgeAreaCategoryUser::ROLE_USER) {
755
 
756
                    array_push($category_with_edition_ids, $record->category_id);
757
                }
758
 
759
                array_push($category_ids, $record->category_id);
760
            }
761
 
762
            $knowledgeAreaCategoryMapper = KnowledgeAreaCategoryMapper::getInstance($this->adapter);
763
 
764
            if ($category_ids) {
765
                $records =  $knowledgeAreaCategoryMapper->fetchAllByIds($category_ids);
766
                foreach ($records as $record) {
767
                    if ($record->status == KnowledgeAreaCategory::STATUS_ACTIVE) {
768
 
769
                        $categories[$record->id] = [
770
                            'uuid' => $record->uuid,
771
                            'name' => $record->name,
772
                        ];
773
                    }
774
                }
775
            }
776
 
777
 
778
 
779
            $categories = array_values($categories);
780
            usort($categories, function ($a, $b) {
781
                return $a['name'] <=> $b['name'];
782
            });
783
 
784
 
785
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
786
            $form = new KnowledgeAreaEditForm($this->adapter, $category_with_edition_ids);
787
            $form->setData($dataPost);
788
 
789
            if ($form->isValid()) {
790
                $dataPost = (array) $form->getData();
791
 
792
 
793
                $knowledgeAreaCategoryMapper = KnowledgeAreaCategoryMapper::getInstance($this->adapter);
794
                $knowledgeAreaCategory = $knowledgeAreaCategoryMapper->fetchOneByUuid($dataPost['category_id']);
795
 
796
 
797
 
798
                $knowledgeAreaContent->category_id = $knowledgeAreaCategory->id;
799
                $knowledgeAreaContent->title = $dataPost['title'];
800
                $knowledgeAreaContent->description = $dataPost['description'];
801
 
802
 
803
                if ($knowledgeAreaContentMapper->update($knowledgeAreaContent)) {
804
 
561 stevensc 805
                    // Se instancia la clase Storage para manejar el almacenamiento de archivos.
334 www 806
                    $storage = Storage::getInstance($this->config, $this->adapter);
561 stevensc 807
                    // Obtiene la ruta base para los archivos del área de conocimiento.
808
                    // $target_path = $storage->getPathKnowledgeArea(); // No longer needed directly here, composePathTo methods use storagePath internally
1 efrain 809
 
810
                    $files = $this->getRequest()->getFiles()->toArray();
811
 
561 stevensc 812
                    // Manejo de la actualización de la imagen principal.
1 efrain 813
                    if (isset($files['image']) && empty($files['image']['error'])) {
283 www 814
 
561 stevensc 815
                        // Si existe una imagen previa, se elimina.
1 efrain 816
                        if ($knowledgeAreaContent->image) {
560 stevensc 817
                            $storage->deleteFile($target_path, $knowledgeAreaContent->uuid, $knowledgeAreaContent->image);
1 efrain 818
                        }
819
 
560 stevensc 820
                        $tmp_image_name  = $files['image']['tmp_name'];
821
                        $original_image_name_parts = explode('.',  $files['image']['name']);
561 stevensc 822
                        // Genera un nombre de archivo único y normalizado para la nueva imagen, forzando .png.
560 stevensc 823
                        $final_image_filename = Functions::normalizeString(uniqid() . '-' . $original_image_name_parts[0] . '.png');
334 www 824
 
561 stevensc 825
                        // Obtener dimensiones para el redimensionamiento de la imagen del área de conocimiento.
826
                        list($target_width_str, $target_height_str) = explode('x', $this->config['leaderslinked.image_sizes.knowledge_area']);
827
                        $target_width = (int)$target_width_str;
828
                        $target_height = (int)$target_height_str;
829
 
830
                        $uuid_path_segment = $knowledgeAreaCategory->uuid;
283 www 831
 
561 stevensc 832
                        // Construye la ruta completa del directorio de destino.
833
                        $full_target_dir = $storage->composePathToDirectory(Storage::TYPE_KNOWLEDGE_AREA, $uuid_path_segment);
834
                        // Crea el directorio si no existe.
835
                        if (!is_dir($full_target_dir)) {
836
                            mkdir($full_target_dir, 0775, true);
560 stevensc 837
                        }
561 stevensc 838
                        $full_target_path_for_image = $storage->composePathToFilename(Storage::TYPE_KNOWLEDGE_AREA, $uuid_path_segment, $final_image_filename);
334 www 839
 
561 stevensc 840
                        // Sube y redimensiona la imagen.
841
                        if ($storage->uploadImageResize($tmp_image_name, $full_target_path_for_image, $target_width, $target_height)) {
560 stevensc 842
                            $knowledgeAreaContent->image = $final_image_filename;
843
                            $knowledgeAreaContentMapper->update($knowledgeAreaContent);
1 efrain 844
                        }
334 www 845
 
1 efrain 846
                    }
847
 
561 stevensc 848
                    // Manejo de la actualización del archivo adjunto.
1 efrain 849
                    if (isset($files['attachment']) && empty($files['attachment']['error'])) {
560 stevensc 850
                        $tmp_attachment_name   = $files['attachment']['tmp_name'];
561 stevensc 851
                        // Normaliza el nombre del nuevo archivo adjunto.
560 stevensc 852
                        $final_attachment_filename = Functions::normalizeString($files['attachment']['name']);
283 www 853
 
561 stevensc 854
                        // Si existe un adjunto previo, se elimina.
1 efrain 855
                        if ($knowledgeAreaContent->attachment) {
560 stevensc 856
                            $storage->deleteFile($target_path, $knowledgeAreaContent->uuid, $knowledgeAreaContent->attachment);
1 efrain 857
                        }
561 stevensc 858
 
859
                        // Construye la ruta completa del directorio de destino para el adjunto.
860
                        $uuid_path_segment = $knowledgeAreaCategory->uuid; // Similar al comentario de la imagen.
560 stevensc 861
                        $full_target_dir_for_attachment = $target_path . DIRECTORY_SEPARATOR . $uuid_path_segment;
862
                        if (!is_dir($full_target_dir_for_attachment)) {
863
                            mkdir($full_target_dir_for_attachment, 0775, true);
864
                        }
865
                        $full_target_path_for_attachment = $full_target_dir_for_attachment . DIRECTORY_SEPARATOR . $final_attachment_filename;
866
 
561 stevensc 867
                        // Mueve el nuevo archivo adjunto a su ubicación final.
560 stevensc 868
                        if ($storage->moveUploadedFile($tmp_attachment_name, $full_target_path_for_attachment)) {
869
                            $knowledgeAreaContent->attachment = $final_attachment_filename;
1 efrain 870
                            $knowledgeAreaContentMapper->update($knowledgeAreaContent);
871
                        }
872
                    }
873
 
874
                    $this->logger->info('Se edito el contenido ' . $knowledgeAreaContent->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
875
 
876
                    $data = [
877
                        'success'   => true,
878
                        'data'   => 'LABEL_RECORD_UPDATED'
879
                    ];
880
                } else {
881
                    $data = [
882
                        'success'   => false,
883
                        'data'      => $knowledgeAreaContentMapper->getError()
884
                    ];
885
                }
886
 
887
                return new JsonModel($data);
888
            } else {
889
                $messages = [];
890
                $form_messages = (array) $form->getMessages();
891
                foreach ($form_messages  as $fieldname => $field_messages) {
892
 
893
                    $messages[$fieldname] = array_values($field_messages);
894
                }
895
 
896
                return new JsonModel([
897
                    'success'   => false,
898
                    'data'   => $messages
899
                ]);
900
            }
901
        } else {
902
            $data = [
903
                'success' => false,
904
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
905
            ];
906
 
907
            return new JsonModel($data);
908
        }
909
 
910
        return new JsonModel($data);
911
    }
912
 
913
 
914
    public function viewAction()
915
    {
916
        $currentUserPlugin = $this->plugin('currentUserPlugin');
917
        $currentUser    = $currentUserPlugin->getUser();
918
 
919
        $request    = $this->getRequest();
920
        $id    = $this->params()->fromRoute('id');
921
 
922
        $knowledgeAreaContentMapper = KnowledgeAreaContentMapper::getInstance($this->adapter);
923
        $knowledgeAreaContent = $knowledgeAreaContentMapper->fetchOneByUuid($id);
924
        if (!$knowledgeAreaContent) {
925
            return new JsonModel([
926
                'success'   => false,
927
                'data'   => 'ERROR_RECORD_NOT_FOUND'
928
            ]);
929
        }
930
 
931
 
932
 
933
        $request = $this->getRequest();
934
        if ($request->isGet()) {
935
 
936
 
937
            $knowledgeAreaCategoryMapper = KnowledgeAreaCategoryMapper::getInstance($this->adapter);
938
            $knowledgeAreaCategory = $knowledgeAreaCategoryMapper->fetchOne($knowledgeAreaContent->category_id);
939
 
940
 
941
 
942
            $ok = false;
943
            if ($knowledgeAreaCategory->privacy == KnowledgeAreaCategory::PRIVACY_COMPANY) {
944
 
945
                $knowledgeAreaCategoryUserMapper = KnowledgeAreaCategoryUserMapper::getInstance($this->adapter);
946
                $knowledgeAreaCategoryUser = $knowledgeAreaCategoryUserMapper->fetchOneByCategoryIdAndUserId($knowledgeAreaContent->category_id, $currentUser->id);
947
 
948
 
949
                if ($knowledgeAreaCategoryUser) {
950
                    $ok = true;
951
                }
952
            }
953
            if ($knowledgeAreaCategory->privacy == KnowledgeAreaCategory::PRIVACY_PUBLIC) {
954
                $ok = true;
955
            }
956
 
957
            if (!$ok) {
958
                return new JsonModel([
959
                    'success'   => false,
960
                    'data'   => 'ERROR_KNOWLEDGE_AREA_YOU_DO_NOT_HAVE_PERMISSION'
961
                ]);
962
            }
963
 
964
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
965
            $contentReaction = $contentReactionMapper->fetchOneByKnowledgeAreaIdAndUserId($knowledgeAreaContent->id, $currentUser->id);
966
 
967
 
333 www 968
            $storage = Storage::getInstance($this->config, $this->adapter);
283 www 969
            $path = $storage->getPathKnowledgeArea();
1 efrain 970
 
971
                return new JsonModel([
972
                    'success' => true,
973
                    'data' => [
974
                        'category' => $knowledgeAreaCategory->name,
975
                        'title' => $knowledgeAreaContent->title,
976
                        'description' => $knowledgeAreaContent->description,
977
                        'link' => $knowledgeAreaContent->link,
283 www 978
                        'image' =>  $storage->getGenericImage($path, $knowledgeAreaContent->uuid,  $knowledgeAreaContent->image),
979
                        'attachment' =>  $knowledgeAreaContent->attachment ? $storage->getGenericFile($path, $knowledgeAreaContent->uuid,  $knowledgeAreaContent->attachment) : '',
1 efrain 980
                        'reaction' => $contentReaction ? $contentReaction->reaction : '',
242 efrain 981
                        'routeComments' => $this->url()->fromRoute('knowledge-area/comments', ['id' => $knowledgeAreaContent->uuid],['force_canonical' => true]),
982
                        'routeCommentAdd' => $this->url()->fromRoute('knowledge-area/comments/add', ['id' => $knowledgeAreaContent->uuid],['force_canonical' => true]),
983
                        'routeSaveReaction' => $this->url()->fromRoute('knowledge-area/save-reaction', ['id' => $knowledgeAreaContent->uuid],['force_canonical' => true]),
984
                        'routeDeleteReaction' => $this->url()->fromRoute('knowledge-area/delete-reaction', ['id' => $knowledgeAreaContent->uuid],['force_canonical' => true]),
985
                        'routeReactions' => $this->url()->fromRoute('knowledge-area/reactions', ['id' => $knowledgeAreaContent->uuid],['force_canonical' => true]),
1 efrain 986
                    ]
987
                ]);
988
 
989
        } else {
990
            $data = [
991
                'success' => false,
992
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
993
            ];
994
 
995
            return new JsonModel($data);
996
        }
997
 
998
        return new JsonModel($data);
999
    }
242 efrain 1000
 
1001
    public function reactionsAction()
1002
    {
1003
        $id = $this->params()->fromRoute('id');
1004
 
1005
        $request = $this->getRequest();
1006
        $request = $this->getRequest();
1007
        if ($request->isGet()) {
1008
 
1009
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1010
            $currentUser = $currentUserPlugin->getUser();
1011
 
1012
            $knowledgeAreaContentMapper = KnowledgeAreaContentMapper::getInstance($this->adapter);
1013
            $knowledgeAreaContent = $knowledgeAreaContentMapper->fetchOneByUuid($id);
1014
            if (!$knowledgeAreaContent || $knowledgeAreaContent->network_id != $currentUser->network_id) {
1015
                return new JsonModel([
1016
                    'success'   => false,
1017
                    'data'   => 'ERROR_RECORD_NOT_FOUND'
1018
                ]);
1019
            }
1020
 
1021
 
1022
 
1023
            $userMapper = UserMapper::getInstance($this->adapter);
1024
 
1025
            $items = [];
1026
 
333 www 1027
            $storage = Storage::getInstance($this->config, $this->adapter);
283 www 1028
            $path = $storage->getPathKnowledgeArea();
1029
 
242 efrain 1030
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
1031
            $records = $contentReactionMapper->fetchAllByKnowledgeAreaId($knowledgeAreaContent->id);
1032
 
1033
            foreach($records as $record)
1034
            {
1035
                $user = $userMapper->fetchOne($record->user_id);
1036
                if($user && $user->status == User::STATUS_ACTIVE) {
1037
 
1038
                    array_push($items, [
1039
                        'first_name' => $user->first_name,
1040
                        'last_name' => $user->last_name,
1041
                        'email' => $user->email,
283 www 1042
                        'image' => $storage->getGenericImage($path, $user->uuid, $user->image),
242 efrain 1043
                        'reaction' => $record->reaction,
1044
                    ]);
1045
                }
1046
            }
1047
 
1048
            $response = [
1049
                'success' => true,
1050
                'data' => $items
1051
            ];
1052
 
1053
            return new JsonModel($response);
1054
 
1055
 
1056
 
1057
 
1058
        } else {
1059
            $response = [
1060
                'success' => false,
1061
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1062
            ];
1063
 
1064
            return new JsonModel($response);
1065
        }
1066
    }
1 efrain 1067
 
1068
 
1069
    public function addCommentAction()
1070
    {
1071
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1072
        $currentUser    = $currentUserPlugin->getUser();
1073
 
1074
        $id = $this->params()->fromRoute('id');
1075
 
1076
        $request = $this->getRequest();
1077
        if ($request->isPost()) {
1078
 
1079
            $knowledgeAreaContentMapper = KnowledgeAreaContentMapper::getInstance($this->adapter);
1080
            $knowledgeAreaContent = $knowledgeAreaContentMapper->fetchOneByUuid($id);
1081
            if (!$knowledgeAreaContent || $knowledgeAreaContent->network_id != $currentUser->network_id) {
1082
                return new JsonModel([
1083
                    'success'   => false,
1084
                    'data'   => 'ERROR_RECORD_NOT_FOUND'
1085
                ]);
1086
            }
1087
 
1088
 
1089
 
1090
 
1091
            $dataPost = $request->getPost()->toArray();
1092
            $form = new CommentForm();
1093
            $form->setData($dataPost);
1094
 
1095
            if ($form->isValid()) {
242 efrain 1096
 
1 efrain 1097
                $dataPost = (array) $form->getData();
1098
 
1099
                $comment = new Comment();
1100
                $comment->network_id = $currentUser->network_id;
1101
                $comment->comment = $dataPost['comment'];
1102
                $comment->user_id = $currentUser->id;
1103
                $comment->knowledge_area_id = $knowledgeAreaContent->id;
1104
                $comment->relational = Comment::RELATIONAL_KNOWLEDGE_AREA;
1105
 
1106
                $commentMapper = CommentMapper::getInstance($this->adapter);
1107
                $now = $commentMapper->getDatebaseNow();
1108
 
1109
                if ($commentMapper->insert($comment)) {
1110
 
1111
                    $total_comments = $commentMapper->fetchCountCommentByKnowledgeAreaId($comment->knowledge_area_id);
1112
 
1113
                    $knowledgeAreaContent->total_comments = $total_comments;
1114
                    $knowledgeAreaContentMapper->update($knowledgeAreaContent);
1115
 
1116
                    $response = [
1117
                        'success'   => true,
1118
                        'data'   => $this->renderComment($comment->id, $now),
1119
                        'total_comments' => $total_comments
1120
                    ];
1121
 
1122
                    return new JsonModel($response);
1123
                } else {
1124
 
1125
                    $response = [
1126
                        'success'   => false,
1127
                        'data'   => $commentMapper->getError()
1128
                    ];
1129
 
1130
                    return new JsonModel($response);
1131
                }
1132
            } else {
1133
                $message = '';;
1134
                $form_messages = (array) $form->getMessages();
1135
                foreach ($form_messages  as $fieldname => $field_messages) {
1136
                    foreach ($field_messages as $key => $value) {
1137
                        $message = $value;
1138
                    }
1139
                }
1140
 
1141
                $response = [
1142
                    'success'   => false,
1143
                    'data'   => $message
1144
                ];
1145
 
1146
                return new JsonModel($response);
1147
            }
1148
        } else {
1149
            $response = [
1150
                'success' => false,
1151
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1152
            ];
1153
 
1154
            return new JsonModel($response);
1155
        }
1156
    }
1157
 
1158
 
1159
 
1160
    public function deleteCommentAction()
1161
    {
1162
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1163
        $currentUser    = $currentUserPlugin->getUser();
1164
 
1165
        $request = $this->getRequest();
1166
        if ($request->isPost()) {
1167
 
1168
            $id = $this->params()->fromRoute('id');
1169
            $comment = $this->params()->fromRoute('comment');
1170
 
1171
 
1172
            $knowledgeAreaContentMapper = KnowledgeAreaContentMapper::getInstance($this->adapter);
1173
            $knowledgeAreaContent = $knowledgeAreaContentMapper->fetchOneByUuid($id);
1174
 
1175
 
1176
 
1177
            if ($knowledgeAreaContent && $knowledgeAreaContent->network_id == $currentUser->network_id) {
1178
 
1179
                $commentMapper = CommentMapper::getInstance($this->adapter);
1180
                $comment = $commentMapper->fetchOneByUuid($comment);
1181
 
1182
 
1183
                if ($comment && $comment->knowledge_area_id == $knowledgeAreaContent->id && $comment->user_id == $currentUser->id) {
1184
 
1185
                    $comment->status = Comment::STATUS_DELETED;
1186
 
1187
                    if ($commentMapper->update($comment)) {
1188
 
1189
                        $total_comments = $commentMapper->fetchCountCommentByKnowledgeAreaId($knowledgeAreaContent->id);
1190
                        $knowledgeAreaContent->total_comments = $total_comments;
1191
                        $knowledgeAreaContentMapper->update($knowledgeAreaContent);
1192
 
1193
                        $response = [
1194
                            'success' => true,
1195
                            'data' => 'LABEL_COMMENT_WAS_DELETED',
1196
                            'total_comments' => $total_comments
1197
                        ];
1198
                    } else {
1199
                        $response = [
1200
                            'success' => false,
1201
                            'data' => $commentMapper->getError()
1202
                        ];
1203
                    }
1204
                } else {
1205
                    $response = [
1206
                        'success' => false,
1207
                        'data' => 'ERROR_COMMENT_NOT_FOUND'
1208
                    ];
1209
                }
1210
            } else {
1211
                $response = [
1212
                    'success' => false,
1213
                    'data' => 'ERROR_COMMENT_NOT_FOUND'
1214
                ];
1215
            }
1216
        } else {
1217
            $response = [
1218
                'success' => false,
1219
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1220
            ];
1221
        }
1222
 
1223
        return new JsonModel($response);
1224
    }
1225
 
1226
 
1227
 
1228
    public function saveReactionAction()
1229
    {
1230
 
1231
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1232
        $currentUser    = $currentUserPlugin->getUser();
1233
 
1234
        $id = $this->params()->fromRoute('id');
1235
        $reaction  = $this->params()->fromPost('reaction');
1236
 
1237
        $request = $this->getRequest();
1238
        if ($request->isPost()) {
1239
 
1240
            $knowledgeAreaContentMapper = KnowledgeAreaContentMapper::getInstance($this->adapter);
1241
            $knowledgeAreaContent = $knowledgeAreaContentMapper->fetchOneByUuid($id);
1242
            if (!$knowledgeAreaContent || $knowledgeAreaContent->network_id != $currentUser->network_id) {
1243
                return new JsonModel([
1244
                    'success'   => false,
1245
                    'data'   => 'ERROR_RECORD_NOT_FOUND'
1246
                ]);
1247
            }
1248
 
1249
            $reactions = [
1250
                ContentReaction::REACTION_RECOMMENDED,
1251
                ContentReaction::REACTION_SUPPORT,
1252
                ContentReaction::REACTION_LOVE,
1253
                ContentReaction::REACTION_INTEREST,
1254
                ContentReaction::REACTION_FUN
1255
 
1256
            ];
1257
            if(!in_array($reaction, $reactions)) {
1258
                $response = [
1259
                    'success' => false,
1260
                    'data' => 'ERROR_REACTION_NOT_FOUND'
1261
                ];
1262
                return new JsonModel($response);
1263
            }
1264
 
1265
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
1266
            $contentReaction = $contentReactionMapper->fetchOneByKnowledgeAreaIdAndUserId($knowledgeAreaContent->id, $currentUser->id);
1267
 
1268
            if ($contentReaction) {
1269
                $contentReaction->reaction = $reaction;
1270
 
1271
                $result = $contentReactionMapper->update($contentReaction);
1272
            } else {
1273
                $contentReaction = new ContentReaction();
1274
                $contentReaction->user_id = $currentUser->id;
1275
                $contentReaction->knowledge_area_id = $knowledgeAreaContent->id;
1276
                $contentReaction->relational = ContentReaction::RELATIONAL_KNOWLEDGE_AREA;
1277
                $contentReaction->reaction = $reaction;
1278
 
1279
                $result = $contentReactionMapper->insert($contentReaction);
1280
            }
1281
 
1282
 
1283
 
1284
            if ($result) {
1285
 
1286
                $reactions = $contentReactionMapper->fetchCountByKnowledgeAreaId($knowledgeAreaContent->id);
1287
                $response = [
1288
                    'success' => true,
1289
                    'data' => [
1290
                        'reactions' => $reactions
1291
                    ]
1292
                ];
1293
            } else {
1294
                $response = [
1295
                    'success' => false,
1296
                    'data' => $contentReactionMapper->getError()
1297
                ];
1298
            }
1299
            return new JsonModel($response);
1300
        }
1301
 
1302
        $response = [
1303
            'success' => false,
1304
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1305
        ];
1306
        return new JsonModel($response);
1307
    }
1308
 
1309
    public function deleteReactionAction()
1310
    {
1311
        $currentUserPlugin = $this->plugin('currentUserPlugin');
1312
        $currentUser    = $currentUserPlugin->getUser();
1313
 
1314
        $id = $this->params()->fromRoute('id');
1315
 
1316
        $request = $this->getRequest();
1317
        if ($request->isPost()) {
1318
 
1319
 
1320
            $knowledgeAreaContentMapper = KnowledgeAreaContentMapper::getInstance($this->adapter);
1321
            $knowledgeAreaContent = $knowledgeAreaContentMapper->fetchOneByUuid($id);
1322
            if (!$knowledgeAreaContent || $knowledgeAreaContent->network_id != $currentUser->network_id) {
1323
                return new JsonModel([
1324
                    'success'   => false,
1325
                    'data'   => 'ERROR_RECORD_NOT_FOUND'
1326
                ]);
1327
            }
1328
 
1329
            $contentReactionMapper = ContentReactionMapper::getInstance($this->adapter);
1330
            $contentReaction = $contentReactionMapper->fetchOneByKnowledgeAreaIdAndUserId($knowledgeAreaContent->id, $currentUser->id);
1331
 
1332
            if (!$contentReaction) {
1333
                $response = [
1334
                    'success' => false,
1335
                    'data' => 'ERROR_DUPLICATE_ACTION'
1336
                ];
1337
                return new JsonModel($response);
1338
            }
1339
 
1340
            if ($contentReactionMapper->deleteByKnowledgeAreaIdAndUserId($knowledgeAreaContent->id, $currentUser->id)) {
1341
                $reactions = $contentReactionMapper->fetchCountByKnowledgeAreaId($knowledgeAreaContent->id);
1342
 
1343
                $response = [
1344
                    'success' => true,
1345
                    'data' => [
1346
                        'reactions' => $reactions
1347
                    ]
1348
                ];
1349
            } else {
1350
                $response = [
1351
                    'success' => false,
1352
                    'data' => $contentReactionMapper->getError()
1353
                ];
1354
            }
1355
            return new JsonModel($response);
1356
        }
1357
 
1358
        $response = [
1359
            'success' => false,
1360
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
1361
        ];
1362
        return new JsonModel($response);
1363
    }
1364
 
1365
    public function commentsAction()
1366
    {
1367
        $id = $this->params()->fromRoute('id');
1368
 
1369
        $request = $this->getRequest();
1370
        if ($request->isGet()) {
1371
            $currentUserPlugin = $this->plugin('currentUserPlugin');
1372
            $currentUser = $currentUserPlugin->getUser();
1373
 
1374
            $knowledgeAreaContentMapper = KnowledgeAreaContentMapper::getInstance($this->adapter);
1375
            $now = $knowledgeAreaContentMapper->getDatebaseNow();
1376
 
1377
            $knowledgeAreaContent = $knowledgeAreaContentMapper->fetchOneByUuid($id);
1378
            if (!$knowledgeAreaContent || $knowledgeAreaContent->network_id != $currentUser->network_id) {
1379
                return new JsonModel([
1380
                    'success'   => false,
1381
                    'data'   => 'ERROR_RECORD_NOT_FOUND'
1382
                ]);
1383
            }
1384
 
1385
            $commentMapper = CommentMapper::getInstance($this->adapter);
1386
            $records = $commentMapper->fetchAllPublishedByKnowledgeAreaId($knowledgeAreaContent->id);
1387
 
1388
            $comments = [];
1389
            foreach ($records as $record) {
1390
                $comment = $this->renderComment($record->id, $now);
1391
                array_push($comments, $comment);
1392
            }
1393
 
1394
            $response = [
1395
                'success' => true,
1396
                'data' => $comments
1397
            ];
1398
 
1399
            return new JsonModel($response);
1400
        } else {
1401
 
1402
 
1403
 
1404
            $response = [
1405
                'success' => false,
1406
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
1407
            ];
1408
 
1409
 
1410
            return new JsonModel($response);
1411
        }
1412
    }
1413
 
1414
 
1415
 
1416
 
1417
    private function renderComment($comment_id, $now)
1418
    {
1419
        $item = [];
1420
 
1421
        $commentMapper = CommentMapper::getInstance($this->adapter);
1422
        $record = $commentMapper->fetchOne($comment_id);
1423
 
1424
        $knowledgeAreaContentMapper = KnowledgeAreaContentMapper::getInstance($this->adapter);
1425
        $knowledgeAreaContent = $knowledgeAreaContentMapper->fetchOne($record->knowledge_area_id);
1426
 
283 www 1427
 
1428
 
1 efrain 1429
        if ($record) {
333 www 1430
            $storage = Storage::getInstance($this->config, $this->adapter);
283 www 1431
 
1432
 
1 efrain 1433
            $userMapper = UserMapper::getInstance($this->adapter);
1434
 
1435
            $user = $userMapper->fetchOne($record->user_id);
1436
 
1437
            $item['unique'] = uniqid();
283 www 1438
            $item['user_image'] = $storage->getUserImage($user);
1 efrain 1439
            $item['user_url'] = $this->url()->fromRoute('profile/view', ['id' => $user->uuid]);
1440
            $item['user_name'] = $user->first_name . ' ' . $user->last_name;
1441
            $item['time_elapsed'] = Functions::timeAgo($record->added_on, $now);
1442
            $item['comment'] = $record->comment;
1443
            $item['link_delete'] = $this->url()->fromRoute('knowledge-area/comments/delete', ['id' => $knowledgeAreaContent->uuid, 'comment' => $record->uuid]);
1444
        }
1445
        return $item;
1446
    }
1447
}