Proyectos de Subversion LeadersLinked - Backend

Rev

Rev 13309 | Autoría | Ultima modificación | Ver Log |

<?php

declare(strict_types=1);

namespace LeadersLinked\Controller;

use Laminas\Db\Adapter\AdapterInterface;
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\Log\LoggerInterface;
use Laminas\View\Model\ViewModel;
use Laminas\View\Model\JsonModel;
use LeadersLinked\Library\Functions;
use LeadersLinked\Mapper\FeedMapper;
use LeadersLinked\Mapper\TopicMapper;
use LeadersLinked\Mapper\QueryMapper;
use Laminas\Paginator\Adapter\DbSelect;
use Laminas\Paginator\Paginator;
use LeadersLinked\Form\CreateFeedForm;
use LeadersLinked\Form\TopicForm;
use Laminas\Hydrator\ArraySerializableHydrator;
use Laminas\Db\ResultSet\HydratingResultSet;
use LeadersLinked\Model\Feed;
use LeadersLinked\Model\Topic;
use LeadersLinked\Mapper\CompanyMapper;
use LeadersLinked\Model\Company;
use LeadersLinked\Hydrator\ObjectPropertyHydrator;

class DevelopmentContentController extends AbstractActionController {

    /**
     *
     * @var AdapterInterface
     */
    private $adapter;

    /**
     *
     * @var AbstractAdapter
     */
    private $cache;

    /**
     *
     * @var  LoggerInterface
     */
    private $logger;

    /**
     *
     * @var array
     */
    private $config;

    /**
     *
     * @param AdapterInterface $adapter
     * @param AbstractAdapter $cache
     * @param LoggerInterface $logger
     * @param array $config
     */
    public function __construct($adapter, $cache, $logger, $config) {
        $this->adapter = $adapter;
        $this->cache = $cache;
        $this->logger = $logger;
        $this->config = $config;
    }

    public function indexAction() {
        $request = $this->getRequest();
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentCompany = $currentUserPlugin->getCompany();
        $currentUser = $currentUserPlugin->getUser();

        try{
        $request = $this->getRequest();
        if ($request->isGet()) {

            $headers = $request->getHeaders();

            $isJson = false;
            if ($headers->has('Accept')) {
                $accept = $headers->get('Accept');

                $prioritized = $accept->getPrioritized();

                foreach ($prioritized as $key => $value) {
                    $raw = trim($value->getRaw());

                    if (!$isJson) {
                        $isJson = strpos($raw, 'json');
                    }
                }
            }

            if ($isJson) {
                $search = $this->params()->fromQuery('search', []);
                $search = empty($search['value']) ? '' : filter_var($search['value'], FILTER_SANITIZE_STRING);

                $page = intval($this->params()->fromQuery('start', 1), 10);
                $records_x_page = intval($this->params()->fromQuery('length', 10), 10);
                $order = $this->params()->fromQuery('order', []);
                $order_field = empty($order[0]['column']) ? 99 : intval($order[0]['column'], 10);
                $order_direction = empty($order[0]['dir']) ? 'ASC' : strtoupper(filter_var($order[0]['dir'], FILTER_SANITIZE_STRING));

                $fields = ['title'];
                $order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'title';

                if (!in_array($order_direction, ['ASC', 'DESC'])) {
                    $order_direction = 'ASC';
                }

                $acl = $this->getEvent()->getViewModel()->getVariable('acl');
             
                $items = [];
                $feedMapper = FeedMapper::getInstance($this->adapter);
                
                $paginator = $feedMapper->fetchAllByDevelop();
                
              
                foreach ($paginator as $record) {
                    
                    $item = [
                        'id' => $record->id,
                        'title' => $record->title,
                        'description' => $record->description,
                        'status' => $record->status,
                       
                    ];

                    array_push($items, $item);
                }

                return new JsonModel([
                    'success' => true,
                    'data' => [
                        'items' => $items,
                    ]
                ]);
            } else {

                $form = new CreateFeedForm($this->adapter, $currentCompany->id);

                $this->layout()->setTemplate('layout/layout-backend');
                $viewModel = new ViewModel();
                $viewModel->setTemplate('leaders-linked/development-content/index.phtml');
                $viewModel->setVariable('form', $form);
                return $viewModel;
            }
        } else {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    } catch (\Throwable $e) {
            $e->getMessage();
            return new JsonModel([
                'success' => false,
                'data' => $e
            ]);
        }
    }

    public function addAction() { 
        $currentUserPlugin  = $this->plugin('currentUserPlugin');
        $currentCompany     = $currentUserPlugin->getCompany(); 
        $currentUser        = $currentUserPlugin->getUser();
        
        $id =  $this->params()->fromRoute('id');
        $uncuratedMapper = FeedMapper::getInstance($this->adapter);
        $uncurated = $uncuratedMapper->fetchOneByUuid($id);
        $request    = $this->getRequest();     
        try{
        if($request->isPost()) {
            $form = new  CreateFeedForm($this->adapter);
            
            $dataPost = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
            $categoriesId = $dataPost['category_id'] ?? [];
            $dataPost['category_id'] = null;
            $form->setData($dataPost);
            
            if($form->isValid()) {
               
                $dataPost = (array) $form->getData();
                $hydrator = new ObjectPropertyHydrator();
                $feed = new Feed();
                $hydrator->hydrate($dataPost, $feed);
               
                $feed->user_id = $currentUser->id;
                $feed->company_id = $currentCompany->id;
                $feed->user_id          = $currentUser->id;
                $feed->status        = Feed::STATUS_SAVED;
                $feed->type             = Feed::TYPE_DC;
                $feed->posted_or_shared = Feed::POSTED;
                $feed->shared_with      = Feed::SHARE_WITH_PUBLIC;
                $feed->related_feed = $uncurated->id;

                $feed->total_comments   = 0;
                $feed->total_shared     = 0;
                
                
                $files = $this->getRequest()->getFiles()->toArray();
                $file_type = '';
                if(isset($files['file']) && empty($files['file']['error'])) {
                    $feed_tmp_filename  = $files['file']['tmp_name'];
                    $feed_filename      = $this->normalizeString($files['file']['name']);
                    
                    $mime_type = mime_content_type($feed_tmp_filename);
                    if($mime_type == 'image/jpg' || $mime_type == 'image/jpeg' || $mime_type == 'image/png') {
                        $file_type = Feed::FILE_TYPE_IMAGE;
                    } else if($mime_type == 'video/webm' || $mime_type == 'video/mpeg' || $mime_type == 'video/mpg' || $mime_type == 'video/mp4') {
                        $file_type = Feed::FILE_TYPE_VIDEO;
                    } else if($mime_type == 'application/pdf') {
                        $file_type = Feed::FILE_TYPE_DOCUMENT;
                    }
                }

                $feedMapper = FeedMapper::getInstance($this->adapter);

                if($feedMapper->insert($feed)) {
                    $feed = $feedMapper->fetchOne($feed->id);                        
                    $category = new FeedTopic();                  
                    $feedMapper->update($feed);

                    
                        $feed = $feedMapper->fetchOne($feed->id);

                        if(!empty($categoriesId)){ 
                            // print_r($dataPost['job_description_id']);
     
                             $categoriesMapper = TopicMapper::getInstance($this->adapter);
                             $feedTopicMapper = FeedTopicMapper::getInstance($this->adapter);
     
                             $ok = true;
     
                             foreach($categoriesId as $category_id) {
                             
                                // echo '$jobDescriptionUuid = ' . $jobDescriptionUuid ; 
     
     
                                 $category = $categoriesMapper->fetchOneByUuidOrTitle($category_id);
                                 if(!$category){
                                     $category = new Topic;
                                     $category->title = $category_id;
                                     $category->type='dc';
                                     $categoriesMapper->insert($category);
                                 }
     
                                 $record = new FeedTopic();
                                 $record->topic_id = $category->id;
                                 $record->feed_id = $feed->id;
                                 $result = $feedTopicMapper->insert($record);
                                 $ok = $ok && $result;
                             }
                        }
                        
                        if( $file_type == Feed::FILE_TYPE_DOCUMENT) {
                            try {
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
                                if(!file_exists($target_path)) {
                                    mkdir($target_path, 0755);
                                }
                                
                                $full_filename = $target_path  . DIRECTORY_SEPARATOR .$feed_filename;
                                $result = move_uploaded_file($feed_tmp_filename , $full_filename);
                                if($result) {
                                    
                                    $feed->file_type = $file_type;
                                    $feed->file_name = basename($feed_filename);
                                    $feedMapper->update($feed);
                                } else {
                                    error_log('no se pudo mover o renombrar el documento : ' . $feed_tmp_filename . ' al directorio : ' . $full_filename );
                                }
                            } catch(\Throwable $e) {
                                error_log($e->getTraceAsString());
                            }
                        }
                        if( $file_type == Feed::FILE_TYPE_IMAGE) {
                            try {
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
                                if(!file_exists($target_path)) {
                                    mkdir($target_path, 0755);
                                }
                                
                                list($target_width, $target_height) = explode('x', $this->config['leaderslinked.image_sizes.feed_image_size']);
                                
                                $feed_filename = substr($feed_filename, 0, strrpos($feed_filename, '.'))  . '.png';
                                $crop_to_dimensions = false;
                                if(Image::uploadImage($feed_tmp_filename, $target_path, $feed_filename, $target_width, $target_height, $crop_to_dimensions )) {
                                    $feed->file_type = $file_type;
                                    $feed->file_name = basename($feed_filename);
                                    $feedMapper->update($feed);
                                }
                            } catch(\Throwable $e) {
                                error_log($e->getTraceAsString());
                            }
                        }
                        if( $file_type == Feed::FILE_TYPE_VIDEO) {
                            try {
                                $target_path = $this->config['leaderslinked.fullpath.feed'] . $feed->uuid;
                                if(!file_exists($target_path)) {
                                    mkdir($target_path, 0755);
                                }
                                
                                $full_filename = $target_path  . DIRECTORY_SEPARATOR . $feed_filename;
                                
                                $result = move_uploaded_file($feed_tmp_filename , $full_filename);
                                if($result) {
                                    
                                    $size = $this->config['leaderslinked.image_sizes.feed_image_size'];
                                    $getFromSecound = 2;
                                    
                                    //extracción del cover
                                    $generateFileName = substr($feed_filename, 0, strrpos($feed_filename, '.'));
                                    $generateFile =  $target_path  . DIRECTORY_SEPARATOR . $generateFileName .  '.png';
                                    $cmd            = "/usr/bin/ffmpeg -i $full_filename -an -ss $getFromSecound -s $size $generateFile";
                                    exec($cmd);
                                    
                                    
                                    $feed->file_type = $file_type;
                                    $feed->file_name = basename($feed_filename);
                                    $feed->file_image_preview = basename($generateFile);
                                    $feedMapper->update($feed);
                                    
                                    $videoConvert = new VideoConvert();
                                    $videoConvert->filename = $full_filename;
                                    $videoConvert->type = VideoConvert::TYPE_FEED;
                                    
                                    $videoConvertMapper = VideoConvertMapper::getInstance($this->adapter);
                                    $videoConvertMapper->insert($videoConvert);
                                } else {
                                    error_log('no se pudo mover o renombrar el documento : ' . $feed_tmp_filename . ' al directorio : ' . $full_filename );
                                }
                            } catch(\Throwable $e) {
                                error_log($e->getTraceAsString());
                            }
                        }
                        
                        
                        $response = [
                            'success'   => true,
                            'data'   => 'success'
                        ];
                } else {
                    $messages = [];
                    $form_messages = (array) $form->getMessages();
                    foreach($form_messages  as $fieldname => $field_messages)
                    {
                        $messages[$fieldname] = array_values($field_messages);
                    }
                    
                }
                
            } else {
                $response = [
                    'success' => false,
                    'data' => 'ERROR_METHOD_NOT_ALLOWED'
                ];
            }
            
            return new JsonModel($response);
        }
        
    } catch (\Throwable $e) {
        $e->getMessage();
        return new JsonModel([
            'success' => false,
            'data' => $e
        ]); 
    }
}

    public function deleteAction() {
        $currentUserPlugin = $this->plugin('currentUserPlugin');
        $currentUser = $currentUserPlugin->getUser();
        $currentCompany = $currentUserPlugin->getCompany();
        
        $request = $this->getRequest();
        if($request->isPost()) {

            
            $id =  $this->params()->fromRoute('id');
            
            $feedMapper = FeedMapper::getInstance($this->adapter);
            $feed = $feedMapper->fetchOneByUuid($id);
            if(!$feed) {
                $response = [
                    'success' => false,
                    'data' => 'ERROR_POST_NOT_FOUND'
                ];
                return new JsonModel($response);
            }
            
            if($feed->company_id != $currentCompany->id) {
                $response = [
                    'success' => false,
                    'data' => 'ERROR_UNAUTHORIZED'
                ];
                return new JsonModel($response);
            }
            
            $feedMapper = FeedMapper::getInstance($this->adapter);
            $feed->status = Feed::STATUS_DELETED;
            if($feedMapper->update($feed)) {
                $response = [
                    'success' => true,
                    'data' => 'LABEL_FEED_WAS_DELETED'
                ];
                
            } else {
                $response = [
                    'success' => false,
                    'data' => $feedMapper->getError()
                ];
            }

            
            return new JsonModel($response);
            
        } else {
            $response = [
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ];
        }
        
        return new JsonModel($response);
    
    }
}