Proyectos de Subversion LeadersLinked - Backend

Rev

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

<?php
declare(strict_types=1);

namespace LeadersLinked\Controller;

use Laminas\Authentication\AuthenticationService;
use Laminas\Authentication\Result as AuthResult;
use Laminas\Db\Adapter\AdapterInterface;
use Laminas\Cache\Storage\Adapter\AbstractAdapter;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\Mvc\I18n\Translator;
use Laminas\Log\LoggerInterface;
use Laminas\View\Model\ViewModel;
use Laminas\View\Model\JsonModel;
use LeadersLinked\Hydrator\ObjectPropertyHydrator;
use LeadersLinked\Mapper\MyTrainerQuestionsMapper;
use LeadersLinked\Mapper\FeedTopicMapper;
use LeadersLinked\Mapper\FeedMapper;
use LeadersLinked\Form\MyTrainerQuestionForm;
use LeadersLinked\Model\MyTrainerQuestions;

use LeadersLinked\Model\Feed;
use LeadersLinked\Model\FeedTopic;
use LeadersLinked\Form\CreateFeedForm;
use LeadersLinked\Form\TopicForm;

use LeadersLinked\Mapper\UserMapper;

class MyTrainerAnswerController 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()) {
                $myt_id =  $this->params()->fromRoute('id');
                $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');
                        }

                    }
                }

                    $acl = $this->getEvent()->getViewModel()->getVariable('acl');
                    $allowAdd = $acl->isAllowed($currentUser->usertype_id, 'my-trainer/answer/add');
                    $allowEdit = $acl->isAllowed($currentUser->usertype_id, 'my-trainer/answer/edit');
                    $allowDelete = $acl->isAllowed($currentUser->usertype_id, 'my-trainer/answer/delete');
            
                    $form = new CreateFeedForm($this->adapter);
                    $questionsMapper = FeedMapper::getInstance($this->adapter);
                    $question = $questionsMapper->fetchOneByUuid($myt_id);

                    $lasts = $questionsMapper->fetchAllByMytAnswerComented();
                    $questions = [];
                    foreach ($lasts as $last) {
                        $comented = $questionsMapper->fetchOne($last->myt_id);
                        $questions []= [
                            'uuid' => $comented->uuid,
                            'title' => $comented->title,
                            'description' => $comented->description,
                        ];
                    }

                    $answer = $questionsMapper->fetchAllByMytAnswer($question->myt_id);
            
                    // $posts;
            
                    $viewModel = new ViewModel();
                    $this->layout()->setTemplate('layout/layout-backend');
                    $viewModel->setTemplate('leaders-linked/my-trainer-answer/index.phtml');
                    $viewModel->setVariables([
                        'form' => $form,
                        'id' => $myt_id,
                        'question_title' => $question->title,
                        'question_description' => $question->description,
                        'questions' => $questions,
                    ]);
                    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();
        
        $myt_id =  $this->params()->fromRoute('id');
        $questionsMapper = FeedMapper::getInstance($this->adapter);
        $question = $questionsMapper->fetchOneByUuid($myt_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->type             = Feed::TYPE_MYT_ANSWER;
                $feed->posted_or_shared = Feed::POSTED;
                $feed->shared_with      = Feed::SHARE_WITH_PUBLIC;
                $feed->related_feed = $question->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( $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
        ]);
    }
    }
   
    
}