Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 17253 | | Comparar con el anterior | Ultima modificación | Ver Log |

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