Proyectos de Subversion LeadersLinked - Backend

Rev

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

Rev Autor Línea Nro. Línea
1 www 1
<?php
15559 anderson 2
 
1 www 3
declare(strict_types=1);
4
 
5
namespace LeadersLinked\Controller;
6
 
7
use Laminas\Db\Adapter\AdapterInterface;
16768 efrain 8
 
1 www 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\PostMapper;
17002 efrain 15
use LeadersLinked\Form\Post\PostCreateForm;
16
use LeadersLinked\Form\Post\PostEditForm;
1 www 17
use LeadersLinked\Model\Post;
18
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
17274 stevensc 19
use LeadersLinked\Library\Storage;
1 www 20
 
21
class PostController extends AbstractActionController
22
{
23
    /**
24
     *
16769 efrain 25
     * @var \Laminas\Db\Adapter\AdapterInterface
1 www 26
     */
27
    private $adapter;
16768 efrain 28
 
1 www 29
    /**
30
     *
16769 efrain 31
     * @var \LeadersLinked\Cache\CacheInterface
1 www 32
     */
16769 efrain 33
    private $cache;
34
 
35
 
36
    /**
37
     *
38
     * @var \Laminas\Log\LoggerInterface
39
     */
1 www 40
    private $logger;
16768 efrain 41
 
1 www 42
    /**
43
     *
44
     * @var array
45
     */
46
    private $config;
16768 efrain 47
 
16769 efrain 48
 
1 www 49
    /**
50
     *
16769 efrain 51
     * @var \Laminas\Mvc\I18n\Translator
52
     */
53
    private $translator;
54
 
55
 
56
    /**
57
     *
58
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
59
     * @param \LeadersLinked\Cache\CacheInterface $cache
60
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
1 www 61
     * @param array $config
16769 efrain 62
     * @param \Laminas\Mvc\I18n\Translator $translator
1 www 63
     */
16769 efrain 64
    public function __construct($adapter, $cache, $logger, $config, $translator)
1 www 65
    {
16769 efrain 66
        $this->adapter      = $adapter;
67
        $this->cache        = $cache;
68
        $this->logger       = $logger;
69
        $this->config       = $config;
70
        $this->translator   = $translator;
1 www 71
    }
15559 anderson 72
 
1 www 73
    public function indexAction()
74
    {
15347 efrain 75
        $currentUserPlugin = $this->plugin('currentUserPlugin');
76
        $currentUser = $currentUserPlugin->getUser();
15559 anderson 77
 
15351 efrain 78
        $currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
79
        $network = $currentNetworkPlugin->getNetwork();
15559 anderson 80
 
1 www 81
        $request = $this->getRequest();
15559 anderson 82
        if ($request->isGet()) {
83
 
84
 
1 www 85
            $headers  = $request->getHeaders();
15559 anderson 86
 
1 www 87
            $isJson = false;
15559 anderson 88
            if ($headers->has('Accept')) {
1 www 89
                $accept = $headers->get('Accept');
15559 anderson 90
 
1 www 91
                $prioritized = $accept->getPrioritized();
15559 anderson 92
 
93
                foreach ($prioritized as $key => $value) {
1 www 94
                    $raw = trim($value->getRaw());
15559 anderson 95
 
96
                    if (!$isJson) {
1 www 97
                        $isJson = strpos($raw, 'json');
98
                    }
99
                }
100
            }
101
 
15559 anderson 102
            if ($isJson) {
103
 
104
 
1 www 105
                $search = $this->params()->fromQuery('search', []);
16766 efrain 106
                $search = empty($search['value']) ? '' :  Functions::sanitizeFilterString($search['value']);
15559 anderson 107
 
1 www 108
                $page               = intval($this->params()->fromQuery('start', 1), 10);
109
                $records_x_page     = intval($this->params()->fromQuery('length', 10), 10);
110
                $order =  $this->params()->fromQuery('order', []);
111
                $order_field        = empty($order[0]['column']) ? 99 :  intval($order[0]['column'], 10);
16766 efrain 112
                $order_direction    = empty($order[0]['dir']) ? 'ASC' : Functions::sanitizeFilterString(filter_var($order[0]['dir']));
15559 anderson 113
 
1 www 114
                $fields =  ['title', 'date'];
115
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'title';
15559 anderson 116
 
117
                if (!in_array($order_direction, ['ASC', 'DESC'])) {
1 www 118
                    $order_direction = 'ASC';
119
                }
15559 anderson 120
 
1 www 121
                $postMapper = PostMapper::getInstance($this->adapter);
15347 efrain 122
                $paginator = $postMapper->fetchAllDataTable($search, $currentUser->network_id, $page, $records_x_page, $order_field, $order_direction);
15559 anderson 123
 
1 www 124
                $items = [];
125
                $records = $paginator->getCurrentItems();
15559 anderson 126
                foreach ($records as $record) {
1 www 127
                    $dt = \DateTime::createFromFormat('Y-m-d', $record->date);
15559 anderson 128
 
1 www 129
                    $item = [
130
                        'title' => $record->title,
15559 anderson 131
                        'active' => $record->status,
1 www 132
                        'date' => $dt->format('d/m/Y'),
133
                        'actions' => [
15559 anderson 134
                            'link_edit' => $this->url()->fromRoute('publications/posts/edit', ['id' => $record->uuid]),
135
                            'link_delete' => $this->url()->fromRoute('publications/posts/delete', ['id' => $record->uuid]),
136
                            'link_view' => 'https://' . $network->main_hostname . '/post/' . $record->uuid,
137
                        ]
1 www 138
                    ];
15559 anderson 139
 
1 www 140
                    array_push($items, $item);
141
                }
15559 anderson 142
 
1 www 143
                return new JsonModel([
144
                    'success' => true,
145
                    'data' => [
146
                        'items' => $items,
147
                        'total' => $paginator->getTotalItemCount(),
148
                    ]
149
                ]);
15559 anderson 150
            } else {
1 www 151
                $image_size = $this->config['leaderslinked.image_sizes.post'];
15559 anderson 152
 
1 www 153
                $formAdd = new PostCreateForm();
154
                $formEdit = new PostEditForm();
15559 anderson 155
 
1 www 156
                $this->layout()->setTemplate('layout/layout-backend');
157
                $viewModel = new ViewModel();
158
                $viewModel->setTemplate('leaders-linked/posts/index.phtml');
159
                $viewModel->setVariables([
160
                    'formAdd' => $formAdd,
15559 anderson 161
                    'formEdit' => $formEdit,
1 www 162
                    'image_size' => $image_size,
15559 anderson 163
 
1 www 164
                ]);
15559 anderson 165
                return $viewModel;
1 www 166
            }
167
        } else {
168
            return new JsonModel([
169
                'success' => false,
170
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
171
            ]);;
172
        }
173
    }
15559 anderson 174
 
175
 
176
 
1 www 177
    public function addAction()
178
    {
17274 stevensc 179
        try {
180
            $request    = $this->getRequest();
181
 
182
            $currentUserPlugin = $this->plugin('currentUserPlugin');
183
            $currentUser = $currentUserPlugin->getUser();
184
 
185
            if (!$request->isPost()) {
186
                return new JsonModel([
187
                    'success' => false,
188
                    'data' => 'ERROR_METHOD_NOT_ALLOWED'
189
                ]);
190
            }
191
 
1 www 192
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
193
            $dataPost['status'] = empty($dataPost['status']) ? Post::STATUS_INACTIVE : $dataPost['status'];
17274 stevensc 194
 
1 www 195
            $form = new PostCreateForm();
196
            $form->setData($dataPost);
17274 stevensc 197
 
198
            if (!$form->isValid()) {
1 www 199
                $messages = [];
200
                $form_messages = (array) $form->getMessages();
17274 stevensc 201
                foreach ($form_messages  as $fieldname => $field_messages)
202
                {
1 www 203
                    $messages[$fieldname] = array_values($field_messages);
204
                }
205
                return new JsonModel([
206
                    'success'   => false,
207
                    'data'   => $messages
208
                ]);
209
            }
17274 stevensc 210
 
211
            $dataPost = (array) $form->getData();
212
 
213
            $hydrator = new ObjectPropertyHydrator();
214
            $post = new Post();
215
            $hydrator->hydrate($dataPost, $post);
216
 
217
            $dt = \DateTime::createFromFormat('d/m/Y', $post->date);
218
            $post->date = $dt->format('Y-m-d');
219
            $post->network_id = $currentUser->network_id;
220
            $post->image = '';
221
            $post->file  = '';
222
            $post->user_id = $currentUser->id;
223
 
224
            $postMapper = PostMapper::getInstance($this->adapter);
225
 
226
            if (!$postMapper->insert($post)) {
227
                return new JsonModel([
228
                    'success'   => false,
229
                    'data'   => $postMapper->getError()
230
                ]);
231
            }
232
 
233
            $storage = Storage::getInstance($this->config, $this->adapter);
234
 
235
            $storage->setFiles($request->getFiles()->toArray());
236
 
237
            if(!$storage->setCurrentFile('file')) {
238
                return new JsonModel([
239
                    'success'   => false,
240
                    'data'   => 'ERROR_FILE_NOT_FOUND'
241
                ]);
242
            }
243
 
244
            $tmp_filename =  $storage->getTmpFilename();
245
            $filename = 'post-' . uniqid() . '.' . $storage->getExtension();
246
            $target_filename = $storage->composePathToFilename(
247
                Storage::TYPE_POST,
248
                $post->uuid,
249
                $filename
250
            );
251
 
252
            if(!$storage->putFile($tmp_filename, $target_filename)) {
253
                return new JsonModel([
254
                    'success'   => false,
255
                    'data'   => 'ERROR_UPLOAD_FILE'
256
                ]);
257
            }
258
 
259
            if(!$storage->setCurrentFile('image')) {
260
                return new JsonModel([
261
                    'success'   => false,
262
                    'data'   => 'ERROR_FILE_NOT_FOUND'
263
                ]);
264
            }
265
 
266
 
267
            $tmp_filename  = $storage->getTmpFilename();
268
            $filename = 'post-image-' . uniqid() . '.png';
269
            $target_filename = $storage->composePathToFilename(
270
                Storage::TYPE_POST,
271
                $post->uuid,
272
                $filename
273
            );
274
 
275
            $post->file = $filename;
276
 
277
            if(!$storage->uploadImageWithOutChangeSize($tmp_filename, $target_filename)) {
278
                return new JsonModel([
279
                    'success'   => false,
280
                    'data'   => 'ERROR_UPLOAD_IMAGE'
281
                ]);
282
            }
283
 
284
            $post->image = $filename;
285
 
286
            if(!$postMapper->update($post)) {
287
                return new JsonModel([
288
                    'success'   => false,
289
                    'data'   => $postMapper->getError()
290
                ]);
291
            }
292
 
293
            $this->logger->info('Se agrego la noticia ' . $post->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
294
 
295
            return new JsonModel([
296
                'success' => true,
297
                'data'   => 'LABEL_RECORD_ADDED'
298
            ]);
299
        } catch (\Throwable $e) {
300
            $this->logger->error('Error al agregar la noticia ' . $post->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP(), 'error' => $e->getTraceAsString()]);
301
            return new JsonModel([
302
                'success'   => false,
303
                'data'   => $e->getMessage()
304
            ]);
1 www 305
        }
306
    }
15559 anderson 307
 
1 www 308
    /**
309
     *
310
     * Borrar un perfil excepto el público
311
     * @return \Laminas\View\Model\JsonModel
312
     */
313
    public function deleteAction()
314
    {
17274 stevensc 315
        try {
316
            $request    = $this->getRequest();
317
 
318
            $currentUserPlugin = $this->plugin('currentUserPlugin');
319
            $currentUser = $currentUserPlugin->getUser();
15559 anderson 320
 
17274 stevensc 321
            $id = $this->params()->fromRoute('id');
15559 anderson 322
 
17274 stevensc 323
            if (!$request->isPost()) {
324
                return new JsonModel([
325
                    'success' => false,
326
                    'data' => 'ERROR_METHOD_NOT_ALLOWED'
327
                ]);
328
            }
15559 anderson 329
 
17274 stevensc 330
            $postMapper = PostMapper::getInstance($this->adapter);
331
            $post = $postMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
15559 anderson 332
 
17274 stevensc 333
            if (!$post) {
334
                return new JsonModel([
335
                    'success' => false,
336
                    'data' => 'ERROR_POST_NOT_FOUND'
337
                ]);
338
            }
15559 anderson 339
 
1 www 340
            $post->status = Post::STATUS_DELETE;
15559 anderson 341
 
17274 stevensc 342
            $storage = Storage::getInstance($this->config, $this->adapter);
343
            $post_path = $storage->getPathPost();
15559 anderson 344
 
17274 stevensc 345
            if($post->file) {
346
                $storage->deleteFile($post_path, $post->uuid, $post->file);
347
            }
348
            if($post->image) {
349
                $storage->deleteFile($post_path, $post->uuid, $post->image);
350
            }
15559 anderson 351
 
17274 stevensc 352
            if(!$postMapper->update($post)) {
353
                return new JsonModel([
1 www 354
                    'success'   => false,
17274 stevensc 355
                    'data'   => $postMapper->getError()
356
                ]);
357
            }
15559 anderson 358
 
17274 stevensc 359
            $this->logger->info('Se borro la noticia : ' .  $post->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
15559 anderson 360
 
17274 stevensc 361
            return new JsonModel([
362
                'success' => true,
363
                'data' => 'LABEL_POST_DELETED'
364
            ]);
365
        } catch (\Throwable $th) {
366
            $this->logger->error('Error al borrar la noticia ' . $post->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP(), 'error' => $th->getTraceAsString()]);
367
            return new JsonModel([
368
                'success'   => false,
369
                'data'   => $th->getMessage()
370
            ]);
1 www 371
        }
372
    }
15559 anderson 373
 
374
 
1 www 375
    public function editAction()
376
    {
17274 stevensc 377
        try {
378
            $request    = $this->getRequest();
15559 anderson 379
 
17274 stevensc 380
            $currentUserPlugin = $this->plugin('currentUserPlugin');
381
            $currentUser = $currentUserPlugin->getUser();
15559 anderson 382
 
17274 stevensc 383
            $id = $this->params()->fromRoute('id');
15559 anderson 384
 
17274 stevensc 385
            if (!$request->isPost() && !$request->isGet()) {
386
                return new JsonModel([
387
                    'success' => false,
388
                    'data' => 'ERROR_METHOD_NOT_ALLOWED'
389
                ]);
390
            }
15559 anderson 391
 
17274 stevensc 392
            $postMapper = PostMapper::getInstance($this->adapter);
393
            $post = $postMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
15559 anderson 394
 
17274 stevensc 395
            if (!$post) {
396
                return new JsonModel([
397
                    'success' => false,
398
                    'data' => 'ERROR_POST_NOT_FOUND'
399
                ]);
400
            }
15559 anderson 401
 
402
 
17274 stevensc 403
            if ($request->isGet()) {
404
                $dt = \DateTime::createFromFormat('Y-m-d', $post->date);
405
                return new JsonModel([
406
                    'success' => true,
407
                    'data' => [
408
                        'title' => $post->title,
409
                        'status' => $post->status,
410
                        'description' => $post->description,
411
                        'url' => $post->url,
412
                        'date' => $dt->format('d/m/Y'),
413
                    ]
414
                ]);
415
            }
416
 
417
            if ($request->isPost()) {
418
                $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
419
                $dataPost['status'] = empty($dataPost['status']) ? Post::STATUS_INACTIVE : $dataPost['status'];
15559 anderson 420
 
17274 stevensc 421
                $form = new PostEditForm();
422
                $form->setData($dataPost);
15559 anderson 423
 
17274 stevensc 424
                if (!$form->isValid()) {
425
                    $messages = [];
426
                    $form_messages = (array) $form->getMessages();
427
                    foreach ($form_messages  as $fieldname => $field_messages)
428
                    {
429
                        $messages[$fieldname] = array_values($field_messages);
430
                    }
431
                    return new JsonModel([
432
                        'success'   => false,
433
                        'data'   => $messages
434
                    ]);
435
                }
436
 
1 www 437
                $dataPost = (array) $form->getData();
15078 efrain 438
 
439
                $post->title        = $dataPost['title'];
440
                $post->description  = $dataPost['description'];
441
                $post->url          = isset($dataPost['url']) ? $dataPost['url'] : '';
442
                $post->status       = isset($dataPost['status']) ? $dataPost['status'] : Post::STATUS_INACTIVE;
15559 anderson 443
 
444
                $dt = \DateTime::createFromFormat('d/m/Y', $dataPost['date']);
1 www 445
                $post->date = $dt->format('Y-m-d');
15559 anderson 446
 
17274 stevensc 447
                $storage = Storage::getInstance($this->config, $this->adapter);
448
                $post_path = $storage->getPathPost();
15559 anderson 449
 
17274 stevensc 450
                $storage->setFiles($request->getFiles()->toArray());
15559 anderson 451
 
17274 stevensc 452
                if($storage->setCurrentFile('file')) {
453
                    $tmp_filename =  $storage->getTmpFilename();
454
                    $filename = 'post-' . uniqid() . '.' . $storage->getExtension();
455
                    $target_filename = $storage->composePathToFilename(
456
                        Storage::TYPE_POST,
457
                        $post->uuid,
458
                        $filename
459
                    );
15559 anderson 460
 
17274 stevensc 461
                    if($post->file) {
462
                        $storage->deleteFile($post_path, $post->uuid, $post->file);
463
                    }
15559 anderson 464
 
17274 stevensc 465
                    if(!$storage->putFile($tmp_filename, $target_filename)) {
466
                        return new JsonModel([
467
                            'success'   => false,
468
                            'data'   => 'ERROR_UPLOAD_FILE'
469
                        ]);
1 www 470
                    }
15559 anderson 471
 
17274 stevensc 472
                    $post->file = $filename;
1 www 473
                }
15559 anderson 474
 
17274 stevensc 475
                if($storage->setCurrentFile('image')) {
476
                    $tmp_filename =  $storage->getTmpFilename();
477
                    $filename = 'post-image-' . uniqid() . '.png';
478
                    $target_filename = $storage->composePathToFilename(
479
                        Storage::TYPE_POST,
480
                        $post->uuid,
481
                        $filename
482
                    );
15559 anderson 483
 
484
                    if ($post->image) {
17274 stevensc 485
                        $storage->deleteFile($post_path, $post->uuid, $post->image);
1 www 486
                    }
15559 anderson 487
 
17274 stevensc 488
                    if(!$storage->uploadImageWithOutChangeSize($tmp_filename, $target_filename)) {
489
                        return new JsonModel([
490
                            'success'   => false,
491
                            'data'   => 'ERROR_UPLOAD_IMAGE'
492
                        ]);
493
                    }
15559 anderson 494
 
17274 stevensc 495
                    $post->image = $filename;
15559 anderson 496
                }
15078 efrain 497
 
17274 stevensc 498
                if(!$postMapper->update($post)) {
499
                    return new JsonModel([
1 www 500
                        'success'   => false,
17274 stevensc 501
                        'data'   => $postMapper->getError()
502
                    ]);
1 www 503
                }
15559 anderson 504
 
17274 stevensc 505
                $this->logger->info('Se edito la noticia ' . $post->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
15559 anderson 506
 
1 www 507
                return new JsonModel([
17274 stevensc 508
                    'success'   => true,
509
                    'data'   => 'LABEL_RECORD_UPDATED'
1 www 510
                ]);
511
            }
17274 stevensc 512
        } catch (\Throwable $th) {
513
            $this->logger->error('Error al editar la noticia ' . $post->title, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP(), 'error' => $th->getTraceAsString()]);
514
            return new JsonModel([
515
                'success'   => false,
516
                'data'   => $th->getMessage()
517
            ]);
1 www 518
        }
519
    }
520
}