Proyectos de Subversion LeadersLinked - Backend

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
9350 eleazar 1
<?php
2
 
3
declare(strict_types=1);
4
 
5
namespace LeadersLinked\Controller;
6
 
7
use Laminas\Db\Adapter\AdapterInterface;
8
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
9
use Laminas\Mvc\Controller\AbstractActionController;
10
use Laminas\Log\LoggerInterface;
11
use Laminas\View\Model\ViewModel;
12
use Laminas\View\Model\JsonModel;
13
use LeadersLinked\Library\Functions;
14
use LeadersLinked\Mapper\MyTrainerCategoriesMapper;
10117 eleazar 15
use LeadersLinked\Mapper\TopicMapper;
9356 eleazar 16
use LeadersLinked\Mapper\MyTrainerQuestionsMapper;
10893 eleazar 17
use LeadersLinked\Mapper\FeedMapper;
9350 eleazar 18
use LeadersLinked\Form\MyTrainerQuestionForm;
10893 eleazar 19
use LeadersLinked\Form\CreateFeedForm;
9369 eleazar 20
use LeadersLinked\Model\MyTrainerQuestions;
10893 eleazar 21
use LeadersLinked\Model\Feed;
9350 eleazar 22
use LeadersLinked\Mapper\CompanyMapper;
23
use LeadersLinked\Model\Company;
24
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
25
 
26
class MyTrainerQuestionController extends AbstractActionController {
27
 
28
    /**
29
     *
30
     * @var AdapterInterface
31
     */
32
    private $adapter;
33
 
34
    /**
35
     *
36
     * @var AbstractAdapter
37
     */
38
    private $cache;
39
 
40
    /**
41
     *
42
     * @var  LoggerInterface
43
     */
44
    private $logger;
45
 
46
    /**
47
     *
48
     * @var array
49
     */
50
    private $config;
51
 
52
    /**
53
     *
54
     * @param AdapterInterface $adapter
55
     * @param AbstractAdapter $cache
56
     * @param LoggerInterface $logger
57
     * @param array $config
58
     */
59
    public function __construct($adapter, $cache, $logger, $config) {
60
        $this->adapter = $adapter;
61
        $this->cache = $cache;
62
        $this->logger = $logger;
63
        $this->config = $config;
64
    }
65
 
66
    public function indexAction() {
67
        $request = $this->getRequest();
68
        $currentUserPlugin = $this->plugin('currentUserPlugin');
69
        $currentCompany = $currentUserPlugin->getCompany();
70
        $currentUser = $currentUserPlugin->getUser();
71
 
72
        try{
73
        $request = $this->getRequest();
74
        if ($request->isGet()) {
75
 
76
            $headers = $request->getHeaders();
77
 
78
            $isJson = false;
79
            if ($headers->has('Accept')) {
80
                $accept = $headers->get('Accept');
81
 
82
                $prioritized = $accept->getPrioritized();
83
 
84
                foreach ($prioritized as $key => $value) {
85
                    $raw = trim($value->getRaw());
86
 
87
                    if (!$isJson) {
88
                        $isJson = strpos($raw, 'json');
89
                    }
90
                }
91
            }
92
 
93
            if ($isJson) {
94
                $search = $this->params()->fromQuery('search', []);
95
                $search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);
96
 
97
                $page = intval($this->params()->fromQuery('start', 1), 10);
98
                $records_x_page = intval($this->params()->fromQuery('length', 10), 10);
99
                $order = $this->params()->fromQuery('order', []);
100
                $order_field = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);
101
                $order_direction = empty($order[0]['dir']) ? 'ASC' : strtoupper(filter_var($order[0]['dir'], FILTER_SANITIZE_STRING));
102
 
103
                $fields = ['title'];
104
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'title';
105
 
106
                if (!in_array($order_direction, ['ASC', 'DESC'])) {
107
                    $order_direction = 'ASC';
108
                }
109
 
110
                $acl = $this->getEvent()->getViewModel()->getVariable('acl');
111
                $allowAdd = $acl->isAllowed($currentUser->usertype_id, 'my-trainer/question/add');
112
                $allowEdit = $acl->isAllowed($currentUser->usertype_id, 'my-trainer/question/edit');
113
                $allowDelete = $acl->isAllowed($currentUser->usertype_id, 'my-trainer/question/delete');
114
 
10912 eleazar 115
                $questionsMapper = FeedMapper::getInstance($this->adapter);
9350 eleazar 116
                $paginator = $questionsMapper->fetchAllDataTableByCompanyId($currentCompany->id, $search, $page, $records_x_page, $order_field, $order_direction);
117
 
118
                $items = [];
119
                $records = $paginator->getCurrentItems();
10929 eleazar 120
 
9350 eleazar 121
                foreach ($records as $record) {
10774 eleazar 122
                    $topicMapper = TopicMapper::getInstance($this->adapter);
10913 eleazar 123
                    $topic = $topicMapper->fetchOne($record->topic_id);
9350 eleazar 124
                    $item = [
10557 eleazar 125
                        'id' => $record->uuid,
9350 eleazar 126
                        'title' => $record->title,
10773 eleazar 127
                        'category' => $topic->title,
10916 eleazar 128
                        'text' => $record->description,
9350 eleazar 129
                        'actions' => [
130
                            'link_edit' => $this->url()->fromRoute('my-trainer/question/edit', ['id' => $record->uuid]),
10759 eleazar 131
                            'link_delete' => $this->url()->fromRoute('my-trainer/question/delete', ['id' => $record->uuid]),
10818 eleazar 132
                            'link_answer' => $this->url()->fromRoute('my-trainer/answer', ['myt_id' => $record->uuid])
9350 eleazar 133
                        ]
134
                    ];
135
 
136
                    array_push($items, $item);
137
                }
138
 
139
                return new JsonModel([
140
                    'success' => true,
141
                    'data' => [
142
                        'items' => $items,
143
                        'total' => $paginator->getTotalItemCount(),
144
                    ]
145
                ]);
146
            } else {
147
 
10901 eleazar 148
                $form = new CreateFeedForm($this->adapter);
9350 eleazar 149
 
150
                $this->layout()->setTemplate('layout/layout-backend');
151
                $viewModel = new ViewModel();
152
                $viewModel->setTemplate('leaders-linked/my-trainer-question/index.phtml');
153
                $viewModel->setVariable('form', $form);
154
                return $viewModel;
155
            }
156
        } else {
157
            return new JsonModel([
158
                'success' => false,
159
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
160
            ]);
161
        }
162
    } catch (\Throwable $e) {
163
            $e->getMessage();
164
            return new JsonModel([
165
                'success' => false,
166
                'data' => $e
167
            ]);
168
        }
169
    }
170
 
171
    public function addAction() {
172
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
173
        $currentCompany     = $currentUserPlugin->getCompany();
174
        $currentUser        = $currentUserPlugin->getUser();
175
 
10180 eleazar 176
        $request    = $this->getRequest();
10238 eleazar 177
        try{
9350 eleazar 178
        if($request->isPost()) {
10892 eleazar 179
            $form = new  CreateFeedForm($this->adapter);
9365 eleazar 180
            $dataPost = $request->getPost()->toArray();
9373 eleazar 181
            $form->setData($dataPost);
10909 eleazar 182
 
9350 eleazar 183
            if($form->isValid()) {
10198 eleazar 184
 
10908 eleazar 185
                $dataPost = (array) $form->getData();
10899 eleazar 186
                $hydrator = new ObjectPropertyHydrator();
187
                $feed = new Feed();
188
                $hydrator->hydrate($dataPost, $feed);
189
 
10892 eleazar 190
                $feed->user_id = $currentUser->id;
191
                $feed->company_id = $currentCompany->id;
192
                $feed->user_id          = $currentUser->id;
11001 eleazar 193
                $feed->type             = Feed::TYPE_MYT_QUESTION;
10892 eleazar 194
                $feed->posted_or_shared = Feed::POSTED;
195
                $feed->shared_with      = Feed::SHARE_WITH_PUBLIC;
196
                $feed->total_comments   = 0;
197
                $feed->total_shared     = 0;
9377 eleazar 198
 
10117 eleazar 199
                $categoriesMapper = TopicMapper::getInstance($this->adapter);
9363 eleazar 200
                $category = $categoriesMapper->fetchOneByUuid($dataPost['category_id']);
10892 eleazar 201
                $feed->topic_id = $category->id;
9363 eleazar 202
 
10892 eleazar 203
                $feedMapper = FeedMapper::getInstance($this->adapter);
9350 eleazar 204
 
10892 eleazar 205
                if($feedMapper->insert($feed)) {
206
                     $feed = $feedMapper->fetchOne($feed->id);
9350 eleazar 207
 
10892 eleazar 208
                     $feed->myt_id = $feed->id;
209
                     $feed->related_feed = $feed->id;
210
                     $feedMapper->update($feed);
211
                    $this->logger->info('Se agrego la pregunta ' . $feed->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
9350 eleazar 212
 
213
                    $data = [
214
                        'success'   => true,
215
                        'data'   => 'LABEL_RECORD_ADDED'
216
                    ];
217
                } else {
218
                    $data = [
219
                        'success'   => false,
10892 eleazar 220
                        'data'      => $feedMapper->getError()
9350 eleazar 221
                    ];
222
 
223
                }
224
 
225
                return new JsonModel($data);
226
 
227
            } else {
228
                $messages = [];
229
                $form_messages = (array) $form->getMessages();
230
                foreach($form_messages  as $fieldname => $field_messages)
231
                {
232
 
233
                    $messages[$fieldname] = array_values($field_messages);
234
                }
235
 
236
            }
237
 
238
        } else {
239
            $data = [
240
                'success' => false,
241
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
242
            ];
243
 
244
            return new JsonModel($data);
245
        }
246
 
10238 eleazar 247
    } catch (\Throwable $e) {
10892 eleazar 248
        $e->getMessage();
249
        return new JsonModel([
250
            'success' => false,
251
            'data' => $e
252
        ]);
9350 eleazar 253
    }
10238 eleazar 254
    }
9350 eleazar 255
 
256
    public function editAction() {
257
        $request = $this->getRequest();
258
        $currentUserPlugin = $this->plugin('currentUserPlugin');
259
        $currentCompany = $currentUserPlugin->getCompany();
260
        $currentUser = $currentUserPlugin->getUser();
261
 
262
        $request = $this->getRequest();
11014 eleazar 263
        $myt_id = $this->params()->fromRoute('id');
9350 eleazar 264
        try{
11015 eleazar 265
        if (!$myt_id) {
9350 eleazar 266
            $data = [
267
                'success' => false,
268
                'data' => 'ERROR_INVALID_PARAMETER'
269
            ];
270
 
271
            return new JsonModel($data);
272
        }
273
 
11014 eleazar 274
        $feedMapper = FeedMapper::getInstance($this->adapter);
11016 eleazar 275
        $feed = $feedMapper->fetchOneByUuid($myt_id);
9350 eleazar 276
 
11014 eleazar 277
        if (!$feed) {
9350 eleazar 278
            $data = [
279
                'success' => false,
280
                'data' => 'ERROR_RECORD_NOT_FOUND'
281
            ];
282
 
283
            return new JsonModel($data);
284
        }
285
 
11014 eleazar 286
        if ($feed->company_id != $currentCompany->id) {
9350 eleazar 287
            return new JsonModel([
288
                'success' => false,
289
                'data' => 'ERROR_UNAUTHORIZED'
290
            ]);
291
        }
292
 
293
 
294
        if ($request->isPost()) {
11014 eleazar 295
            $form = new CreateFeedForm($this->adapter);
9350 eleazar 296
            $dataPost = $request->getPost()->toArray();
297
 
298
            $form->setData($dataPost);
299
 
300
            if ($form->isValid()) {
301
                $dataPost = (array) $form->getData();
302
 
303
                $hydrator = new ObjectPropertyHydrator();
11018 eleazar 304
                $hydrator->hydrate($dataPost, $feed);
10250 eleazar 305
                $categoriesMapper = TopicMapper::getInstance($this->adapter);
306
                $category = $categoriesMapper->fetchOneByUuid($dataPost['category_id']);
11014 eleazar 307
                $feed->topic_id = $category->id;
9350 eleazar 308
 
11014 eleazar 309
                if($feedMapper->update($feed)) {
310
                    $feed = $feedMapper->fetchOne($feed->id);
9350 eleazar 311
 
11014 eleazar 312
                   $this->logger->info('Se modifico la pregunta ' . $feed->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
9350 eleazar 313
 
314
                   $data = [
315
                       'success'   => true,
316
                       'data'   => 'LABEL_RECORD_UPDATED'
317
                   ];
318
               } else {
319
                   $data = [
320
                       'success'   => false,
11014 eleazar 321
                       'data'      => $feedMapper->getError()
9350 eleazar 322
                   ];
323
 
324
               }
325
 
326
                return new JsonModel($data);
327
            } else {
328
                $messages = [];
329
                $form_messages = (array) $form->getMessages();
330
                foreach ($form_messages as $fieldname => $field_messages) {
331
                    $messages[$fieldname] = array_values($field_messages);
332
                }
333
 
334
                return new JsonModel([
335
                    'success' => false,
336
                    'data' => $messages
337
                ]);
338
            }
339
        } else if ($request->isGet()) {
340
 
341
            $hydrator = new ObjectPropertyHydrator();
10252 eleazar 342
            $categoriesMapper = TopicMapper::getInstance($this->adapter);
11014 eleazar 343
            $category = $categoriesMapper->fetchOne($feed->topic_id);
9350 eleazar 344
 
345
            $data = [
346
                'success' => true,
347
                'data' => [
11014 eleazar 348
                    'id' => $feed->uuid,
10252 eleazar 349
                    'category_id' => $category->uuid,
11014 eleazar 350
                    'title' => $feed->title,
11017 eleazar 351
                    'description' => $feed->description,
9350 eleazar 352
                ]
353
            ];
354
 
355
            return new JsonModel($data);
356
        } else {
357
            $data = [
358
                'success' => false,
359
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
360
            ];
361
 
362
            return new JsonModel($data);
363
        }
364
 
365
        return new JsonModel($data);
366
    } catch (\Throwable $e) {
367
        $e->getMessage();
368
        return new JsonModel([
369
            'success' => false,
370
            'data' => $e
371
        ]);
372
    }
373
    }
374
 
375
    public function deleteAction() {
376
        $request = $this->getRequest();
377
        $currentUserPlugin = $this->plugin('currentUserPlugin');
378
        $currentCompany = $currentUserPlugin->getCompany();
379
        $currentUser = $currentUserPlugin->getUser();
380
 
381
        $request = $this->getRequest();
382
        $uuid = $this->params()->fromRoute('id');
383
 
384
        if (!$uuid) {
385
            $data = [
386
                'success' => false,
387
                'data' => 'ERROR_INVALID_PARAMETER'
388
            ];
389
 
390
            return new JsonModel($data);
391
        }
392
 
11019 eleazar 393
        $feedMapper = FeedMapper::getInstance($this->adapter);
394
        $feed = $feedMapper->fetchOneByUuid($uuid);
395
        if (!$feed) {
9350 eleazar 396
            $data = [
397
                'success' => false,
398
                'data' => 'ERROR_RECORD_NOT_FOUND'
399
            ];
400
 
401
            return new JsonModel($data);
402
        }
403
 
11019 eleazar 404
        if ($feed->company_id != $currentCompany->id) {
9350 eleazar 405
            return new JsonModel([
406
                'success' => false,
407
                'data' => 'ERROR_UNAUTHORIZED'
408
            ]);
409
        }
410
 
411
        if ($request->isPost()) {
412
 
413
 
11019 eleazar 414
            $result = $feedMapper->delete($feed->id);
9350 eleazar 415
            if ($result) {
11019 eleazar 416
                $this->logger->info('Se borro la pregunta ' . $feed->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
9350 eleazar 417
 
418
                $data = [
419
                    'success' => true,
420
                    'data' => 'LABEL_RECORD_DELETED'
421
                ];
422
            } else {
423
 
424
                $data = [
425
                    'success' => false,
11019 eleazar 426
                    'data' => $feedMapper->getError()
9350 eleazar 427
                ];
428
 
429
                return new JsonModel($data);
430
            }
431
        } else {
432
            $data = [
433
                'success' => false,
434
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
435
            ];
436
 
437
            return new JsonModel($data);
438
        }
439
 
440
        return new JsonModel($data);
441
    }
442
}