Proyectos de Subversion LeadersLinked - Backend

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
13304 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\FeedMapper;
15
use LeadersLinked\Mapper\TopicMapper;
16
use LeadersLinked\Mapper\QueryMapper;
17
use Laminas\Paginator\Adapter\DbSelect;
18
use Laminas\Paginator\Paginator;
19
use LeadersLinked\Form\CreateFeedForm;
20
use LeadersLinked\Form\TopicForm;
21
use Laminas\Hydrator\ArraySerializableHydrator;
22
use Laminas\Db\ResultSet\HydratingResultSet;
23
use LeadersLinked\Model\Feed;
24
use LeadersLinked\Model\Topic;
25
use LeadersLinked\Mapper\CompanyMapper;
26
use LeadersLinked\Model\Company;
27
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
28
 
29
class DevelopmentContentController extends AbstractActionController {
30
 
31
    /**
32
     *
33
     * @var AdapterInterface
34
     */
35
    private $adapter;
36
 
37
    /**
38
     *
39
     * @var AbstractAdapter
40
     */
41
    private $cache;
42
 
43
    /**
44
     *
45
     * @var  LoggerInterface
46
     */
47
    private $logger;
48
 
49
    /**
50
     *
51
     * @var array
52
     */
53
    private $config;
54
 
55
    /**
56
     *
57
     * @param AdapterInterface $adapter
58
     * @param AbstractAdapter $cache
59
     * @param LoggerInterface $logger
60
     * @param array $config
61
     */
62
    public function __construct($adapter, $cache, $logger, $config) {
63
        $this->adapter = $adapter;
64
        $this->cache = $cache;
65
        $this->logger = $logger;
66
        $this->config = $config;
67
    }
68
 
69
    public function indexAction() {
70
        $request = $this->getRequest();
71
        $currentUserPlugin = $this->plugin('currentUserPlugin');
72
        $currentCompany = $currentUserPlugin->getCompany();
73
        $currentUser = $currentUserPlugin->getUser();
74
 
75
        try{
76
        $request = $this->getRequest();
77
        if ($request->isGet()) {
78
 
79
            $headers = $request->getHeaders();
80
 
81
            $isJson = false;
82
            if ($headers->has('Accept')) {
83
                $accept = $headers->get('Accept');
84
 
85
                $prioritized = $accept->getPrioritized();
86
 
87
                foreach ($prioritized as $key => $value) {
88
                    $raw = trim($value->getRaw());
89
 
90
                    if (!$isJson) {
91
                        $isJson = strpos($raw, 'json');
92
                    }
93
                }
94
            }
95
 
96
            if ($isJson) {
97
                $search = $this->params()->fromQuery('search', []);
98
                $search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);
99
 
100
                $page = intval($this->params()->fromQuery('start', 1), 10);
101
                $records_x_page = intval($this->params()->fromQuery('length', 10), 10);
102
                $order = $this->params()->fromQuery('order', []);
103
                $order_field = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);
104
                $order_direction = empty($order[0]['dir']) ? 'ASC' : strtoupper(filter_var($order[0]['dir'], FILTER_SANITIZE_STRING));
105
 
106
                $fields = ['title'];
107
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'title';
108
 
109
                if (!in_array($order_direction, ['ASC', 'DESC'])) {
110
                    $order_direction = 'ASC';
111
                }
112
 
113
                $acl = $this->getEvent()->getViewModel()->getVariable('acl');
13472 eleazar 114
 
13304 eleazar 115
                $items = [];
116
                $feedMapper = FeedMapper::getInstance($this->adapter);
117
 
118
                $paginator = $feedMapper->fetchAllByDevelop();
119
 
120
 
121
                foreach ($paginator as $record) {
14605 kerby 122
                        $preview = ($record->file_image_preview != null && $record->file_image_preview != '') ? $this->url()->fromRoute('storage', ['code' => $record->uuid, 'type' => 'feed', 'filename' => $record->file_image_preview]) : null;
13304 eleazar 123
                    $item = [
124
                        'id' => $record->id,
125
                        'title' => $record->title,
14605 kerby 126
                        'added_on' => $record->added_on,
13304 eleazar 127
                        'description' => $record->description,
128
                        'status' => $record->status,
14605 kerby 129
                        'preview' => $preview,
14604 kerby 130
                        'file' => $record->file_type ? $record->file_type : '',
131
                        'link_media' => $record->link_media ? $record->link_media : '',
132
                        'link_name' => $record->link_name,
133
                        'file_name' => $record->file_name ? $record->file_name : '',
134
                        'link_file' => $this->url()->fromRoute('storage', ['code' => $record->uuid, 'type' => 'feed', 'filename' => $record->file_name]),
13472 eleazar 135
 
13304 eleazar 136
                    ];
137
 
138
                    array_push($items, $item);
139
                }
140
 
141
                return new JsonModel([
142
                    'success' => true,
143
                    'data' => [
144
                        'items' => $items,
145
                    ]
146
                ]);
147
            } else {
148
 
149
                $form = new CreateFeedForm($this->adapter, $currentCompany->id);
150
 
151
                $this->layout()->setTemplate('layout/layout-backend');
152
                $viewModel = new ViewModel();
13309 eleazar 153
                $viewModel->setTemplate('leaders-linked/development-content/index.phtml');
13304 eleazar 154
                $viewModel->setVariable('form', $form);
155
                return $viewModel;
156
            }
157
        } else {
158
            return new JsonModel([
159
                'success' => false,
160
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
161
            ]);
162
        }
163
    } catch (\Throwable $e) {
164
            $e->getMessage();
165
            return new JsonModel([
166
                'success' => false,
167
                'data' => $e
168
            ]);
169
        }
170
    }
171
 
172
    public function addAction() {
173
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
174
        $currentCompany     = $currentUserPlugin->getCompany();
175
        $currentUser        = $currentUserPlugin->getUser();
176
 
177
        $id =  $this->params()->fromRoute('id');
178
        $uncuratedMapper = FeedMapper::getInstance($this->adapter);
179
        $uncurated = $uncuratedMapper->fetchOneByUuid($id);
180
        $request    = $this->getRequest();
181
        try{
182
        if($request->isPost()) {
183
            $form = new  CreateFeedForm($this->adapter);
184
 
185
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
186
            $categoriesId = $dataPost['category_id'] ?? [];
187
            $dataPost['category_id'] = null;
188
            $form->setData($dataPost);
189
 
190
            if($form->isValid()) {
191
 
192
                $dataPost = (array) $form->getData();
193
                $hydrator = new ObjectPropertyHydrator();
194
                $feed = new Feed();
195
                $hydrator->hydrate($dataPost, $feed);
196
 
197
                $feed->user_id = $currentUser->id;
198
                $feed->company_id = $currentCompany->id;
199
                $feed->user_id          = $currentUser->id;
200
                $feed->status        = Feed::STATUS_SAVED;
201
                $feed->type             = Feed::TYPE_DC;
202
                $feed->posted_or_shared = Feed::POSTED;
203
                $feed->shared_with      = Feed::SHARE_WITH_PUBLIC;
204
                $feed->related_feed = $uncurated->id;
205
 
206
                $feed->total_comments   = 0;
207
                $feed->total_shared     = 0;
208
 
209
 
210
                $files = $this->getRequest()->getFiles()->toArray();
211
                $file_type = '';
212
                if(isset($files['file']) && empty($files['file']['error'])) {
213
                    $feed_tmp_filename  = $files['file']['tmp_name'];
214
                    $feed_filename      = $this->normalizeString($files['file']['name']);
215
 
216
                    $mime_type = mime_content_type($feed_tmp_filename);
217
                    if($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {
218
                        $file_type = Feed::FILE_TYPE_IMAGE;
219
                    } else if($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {
220
                        $file_type = Feed::FILE_TYPE_VIDEO;
221
                    } else if($mime_type == 'application/pdf') {
222
                        $file_type = Feed::FILE_TYPE_DOCUMENT;
223
                    }
224
                }
225
 
226
                $feedMapper = FeedMapper::getInstance($this->adapter);
227
 
228
                if($feedMapper->insert($feed)) {
229
                    $feed = $feedMapper->fetchOne($feed->id);
230
                    $category = new FeedTopic();
231
                    $feedMapper->update($feed);
232
 
233
 
234
                        $feed = $feedMapper->fetchOne($feed->id);
235
 
236
                        if(!empty($categoriesId)){
237
                            // print_r($dataPost['job_description_id']);
238
 
239
                             $categoriesMapper = TopicMapper::getInstance($this->adapter);
240
                             $feedTopicMapper = FeedTopicMapper::getInstance($this->adapter);
241
 
242
                             $ok = true;
243
 
244
                             foreach($categoriesId as $category_id) {
245
 
246
                                // echo '$jobDescriptionUuid = ' . $jobDescriptionUuid ;
247
 
248
 
249
                                 $category = $categoriesMapper->fetchOneByUuidOrTitle($category_id);
250
                                 if(!$category){
251
                                     $category = new Topic;
252
                                     $category->title = $category_id;
253
                                     $category->type='dc';
254
                                     $categoriesMapper->insert($category);
255
                                 }
256
 
257
                                 $record = new FeedTopic();
258
                                 $record->topic_id = $category->id;
259
                                 $record->feed_id = $feed->id;
260
                                 $result = $feedTopicMapper->insert($record);
261
                                 $ok = $ok && $result;
262
                             }
263
                        }
264
 
265
                        if( $file_type == Feed::FILE_TYPE_DOCUMENT) {
266
                            try {
267
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
268
                                if(!file_exists($target_path)) {
269
                                    mkdir($target_path, 0755);
270
                                }
271
 
272
                                $full_filename = $target_path  . DIRECTORY_SEPARATOR .$feed_filename;
273
                                $result = move_uploaded_file($feed_tmp_filename , $full_filename);
274
                                if($result) {
275
 
276
                                    $feed->file_type = $file_type;
277
                                    $feed->file_name = basename($feed_filename);
278
                                    $feedMapper->update($feed);
279
                                } else {
280
                                    error_log('no se pudo mover o renombrar el documento : ' . $feed_tmp_filename . ' al directorio : ' . $full_filename );
281
                                }
282
                            } catch(\Throwable $e) {
283
                                error_log($e->getTraceAsString());
284
                            }
285
                        }
286
                        if( $file_type == Feed::FILE_TYPE_IMAGE) {
287
                            try {
288
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
289
                                if(!file_exists($target_path)) {
290
                                    mkdir($target_path, 0755);
291
                                }
292
 
293
                                list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.feed_image_size']);
294
 
295
                                $feed_filename = substr($feed_filename, 0, strrpos($feed_filename, '.'))  . '.png';
296
                                $crop_to_dimensions = false;
297
                                if(Image::uploadImage($feed_tmp_filename, $target_path, $feed_filename, $target_width, $target_height, $crop_to_dimensions )) {
298
                                    $feed->file_type = $file_type;
299
                                    $feed->file_name = basename($feed_filename);
300
                                    $feedMapper->update($feed);
301
                                }
302
                            } catch(\Throwable $e) {
303
                                error_log($e->getTraceAsString());
304
                            }
305
                        }
306
                        if( $file_type == Feed::FILE_TYPE_VIDEO) {
307
                            try {
308
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
309
                                if(!file_exists($target_path)) {
310
                                    mkdir($target_path, 0755);
311
                                }
312
 
313
                                $full_filename = $target_path  . DIRECTORY_SEPARATOR . $feed_filename;
314
 
315
                                $result = move_uploaded_file($feed_tmp_filename , $full_filename);
316
                                if($result) {
317
 
318
                                    $size = $this->config['leaderslinked.image_sizes.feed_image_size'];
319
                                    $getFromSecound = 2;
320
 
321
                                    //extracción del cover
322
                                    $generateFileName = substr($feed_filename, 0, strrpos($feed_filename, '.'));
323
                                    $generateFile =  $target_path  . DIRECTORY_SEPARATOR . $generateFileName .  '.png';
324
                                    $cmd            = "/usr/bin/ffmpeg -i $full_filename -an -ss $getFromSecound -s $size $generateFile";
325
                                    exec($cmd);
326
 
327
 
328
                                    $feed->file_type = $file_type;
329
                                    $feed->file_name = basename($feed_filename);
330
                                    $feed->file_image_preview = basename($generateFile);
331
                                    $feedMapper->update($feed);
332
 
333
                                    $videoConvert = new VideoConvert();
334
                                    $videoConvert->filename = $full_filename;
335
                                    $videoConvert->type = VideoConvert::TYPE_FEED;
336
 
337
                                    $videoConvertMapper = VideoConvertMapper::getInstance($this->adapter);
338
                                    $videoConvertMapper->insert($videoConvert);
339
                                } else {
340
                                    error_log('no se pudo mover o renombrar el documento : ' . $feed_tmp_filename . ' al directorio : ' . $full_filename );
341
                                }
342
                            } catch(\Throwable $e) {
343
                                error_log($e->getTraceAsString());
344
                            }
345
                        }
346
 
347
 
348
                        $response = [
349
                            'success'   => true,
350
                            'data'   => 'success'
351
                        ];
352
                } else {
353
                    $messages = [];
354
                    $form_messages = (array) $form->getMessages();
355
                    foreach($form_messages  as $fieldname => $field_messages)
356
                    {
357
                        $messages[$fieldname] = array_values($field_messages);
358
                    }
359
 
360
                }
361
 
362
            } else {
363
                $response = [
364
                    'success' => false,
365
                    'data' => 'ERROR_METHOD_NOT_ALLOWED'
366
                ];
367
            }
368
 
369
            return new JsonModel($response);
370
        }
371
 
372
    } catch (\Throwable $e) {
373
        $e->getMessage();
374
        return new JsonModel([
375
            'success' => false,
376
            'data' => $e
377
        ]);
378
    }
379
}
380
 
381
    public function deleteAction() {
382
        $currentUserPlugin = $this->plugin('currentUserPlugin');
383
        $currentUser = $currentUserPlugin->getUser();
384
        $currentCompany = $currentUserPlugin->getCompany();
385
 
386
        $request = $this->getRequest();
387
        if($request->isPost()) {
388
 
389
 
390
            $id =  $this->params()->fromRoute('id');
391
 
392
            $feedMapper = FeedMapper::getInstance($this->adapter);
393
            $feed = $feedMapper->fetchOneByUuid($id);
394
            if(!$feed) {
395
                $response = [
396
                    'success' => false,
397
                    'data' => 'ERROR_POST_NOT_FOUND'
398
                ];
399
                return new JsonModel($response);
400
            }
401
 
402
            if($feed->company_id != $currentCompany->id) {
403
                $response = [
404
                    'success' => false,
405
                    'data' => 'ERROR_UNAUTHORIZED'
406
                ];
407
                return new JsonModel($response);
408
            }
409
 
410
            $feedMapper = FeedMapper::getInstance($this->adapter);
411
            $feed->status = Feed::STATUS_DELETED;
412
            if($feedMapper->update($feed)) {
413
                $response = [
414
                    'success' => true,
415
                    'data' => 'LABEL_FEED_WAS_DELETED'
416
                ];
417
 
418
            } else {
419
                $response = [
420
                    'success' => false,
421
                    'data' => $feedMapper->getError()
422
                ];
423
            }
424
 
425
 
426
            return new JsonModel($response);
427
 
428
        } else {
429
            $response = [
430
                'success' => false,
431
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
432
            ];
433
        }
434
 
435
        return new JsonModel($response);
436
 
437
    }
438
}