Proyectos de Subversion LeadersLinked - Services

Rev

Rev 268 | Rev 289 | Ir a la última revisión | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

<?php

declare(strict_types=1);

namespace LeadersLinked\Controller;

use Laminas\Db\Adapter\AdapterInterface;

use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\Log\LoggerInterface;
use Laminas\View\Model\ViewModel;

use LeadersLinked\Library\Functions;
use LeadersLinked\Mapper\UserMapper;

use LeadersLinked\Model\User;

use LeadersLinked\Mapper\UserBlockedMapper;

use LeadersLinked\Mapper\CompanyMapper;
use LeadersLinked\Mapper\CompanyUserMapper;
use LeadersLinked\Library\Image;
use Laminas\View\Model\JsonModel;
use Laminas\Mvc\I18n\Translator;
use LeadersLinked\Mapper\AbuseReportMapper;
use LeadersLinked\Model\AbuseReport;
use LeadersLinked\Library\ExternalCredentials;
use LeadersLinked\Library\Storage;
use LeadersLinked\Form\InMail\SendForm;
use Eden\Mail\File;



class InMailController extends AbstractActionController
{
    const _SIZE_PAGE = 10;
 
    
    /**
     *
     * @var \Laminas\Db\Adapter\AdapterInterface
     */
    private $adapter;
    
    /**
     *
     * @var \LeadersLinked\Cache\CacheInterface
     */
    private $cache;
    
    
    /**
     *
     * @var \Laminas\Log\LoggerInterface
     */
    private $logger;
    
    /**
     *
     * @var array
     */
    private $config;
    
    
    /**
     *
     * @var \Laminas\Mvc\I18n\Translator
     */
    private $translator;
    
    
    /**
     *
     * @param \Laminas\Db\Adapter\AdapterInterface $adapter
     * @param \LeadersLinked\Cache\CacheInterface $cache
     * @param \Laminas\Log\LoggerInterface LoggerInterface $logger
     * @param array $config
     * @param \Laminas\Mvc\I18n\Translator $translator
     */
    public function __construct($adapter, $cache, $logger, $config, $translator)
    {
        $this->adapter      = $adapter;
        $this->cache        = $cache;
        $this->logger       = $logger;
        $this->config       = $config;
        $this->translator   = $translator;
    }

    /**
     * 
     * Generación del listado de conversationes
     * 
     * [
     *  success: true,
     *  data:[
     *    messages : 
     *    [
     *       uuid: uuid con quien se tiene la conversación,
     *       name: nombre de con quien se tiene la conversacion,
     *       image: imagen de con quien se tiene la conversación,
     *       subject: asunto del mensaje
     *       date: fecha del ultimo mensaje,
     *       seen: true|false,
     *       send_link: url para enviar el mensaje,
     *       open_link : url para leer el mensaje,
     *       delete_link : url para leer el mensaje,
     *     ],
     *     'total_messages' : total de mensajes,
     *     'total_pages' : total de páginas 10 en 10,
     *     'current_page' : página actual 
     *  ]
     * 
     * 
     * @return \Laminas\View\Model\JsonModel
     */
    public function indexAction()
    {
        $request = $this->getRequest();
        if ($request->isGet()) {
            $currentUserPlugin = $this->plugin('currentUserPlugin');
            $currentUser = $currentUserPlugin->getUser();
            
            $page = intval($this->params()->fromQuery('page', 0), 10);
            
            $storage = Storage::getInstance($this->config);
            
            $externalCredentials = ExternalCredentials::getInstancia($this->config, $this->adapter);
            $externalCredentials->getUserBy($currentUser->id);
            
            $host       = trim($this->config['leaderslinked.inmail.host']);
            $port       = intval($this->config['leaderslinked.inmail.port_imap'], 10);
            $mailbox    = trim($this->config['leaderslinked.inmail.mailbox']);
            

            $username   = $externalCredentials->getUsernameInmail();
            $password   =  $externalCredentials->getPasswordInmail();
            
            $userMapper = \LeadersLinked\Mapper\UserMapper::getInstance($this->adapter);

            try { 
                \Eden\Core\Control::i();
                $client = eden('mail')->imap(
                    $host,
                    $username,
                    $password,
                    $port,
                    false);
                
                $client->setActiveMailbox($mailbox);
                 
                //$emails = $imap->getEmails(0, 3);
                $maxMessages = $client->getEmailTotal(); 

                if($maxMessages > self::_SIZE_PAGE) {
                    
                
                    $maxPages = (int)  $maxMessages / self::_SIZE_PAGE;
                    if(($maxPages * self::_SIZE_PAGE) <  $maxMessages) {
                        $maxPages++;
                    }
                } else {
                    $maxPages = 1; 
                    $page = 1;
                }
                 
                $page = $page > 0 ? $page : 1;
                $page = $page > $maxPages ? $maxPages : $page;
                 
                if($page == 1) {
                    $low = 0;
                    $high = self::_SIZE_PAGE - 1;
                } else {
                    $low = ($page - 1) * self::_SIZE_PAGE;
                    $high = $low + ( self::_SIZE_PAGE - 1); 
                }
      
                $users = [];
                $messages = [];
                if( $maxMessages ) {
                    $emails = $client->getEmails($low, $high);
                    foreach($emails as $email)
                    {
                        
                      
                     
                        $from = $email['from']['email'];
             
                        if(isset($users[ $from ])) {
                            $user = $users[ $from ];
                        } else {
                            $user = $userMapper->fetchOneByUsernameInmailAndNetworkId($from, $currentUser->network_id);
                            $users[ $from ] = $user;
                        }
                        
             
                        $seen = false;
                        if(is_array($email['flags'])) {
                            foreach($email['flags'] as $flag)
                            {
                                if($flag == 'seen') {
                                    $seen = 1;
                                    break;
                                }
                            }
                        }
                        
                 
                        
                        $message =  [
                            'uuid' => $user->uuid,
                            'name' => $user->first_name . ' ' . $user->last_name,
                            'image' => $storage->getUserImage($user), 
                            'subject' => $email['subject'],
                            'date' => date('Y-m-d h:i a', $email['date']),
                            'seen' => $seen,
                            'email_id' => $email['uid'],
                            'block_link' => $this->url()->fromRoute('inmail/user/block',[ 'id' => $user->uuid ], ['force_canonical' => true]),
                            'send_link' => $this->url()->fromRoute('inmail/message/send',[ 'id' => $user->uuid ], ['force_canonical' => true]),
                            'get_link' =>  $this->url()->fromRoute('inmail/message/get',[ 'id' => $email['uid'] ], ['force_canonical' => true]),
                            'delete_link'=>    $this->url()->fromRoute('inmail/message/delete',[ 'id' => $email['uid'] ], ['force_canonical' => true]),
                       ];
                        
         
                        array_push($messages, $message);
                        
                    }
                     
                }
                 
                $client->disconnect(); 
                 
                $data = [
                    'success' => true, 
                    'data' => [
                        'messages'          => $messages,  
                        'total_messages'    => $maxMessages,
                        'total_pages'       => $maxPages,
                        'current_page'      => $page,
                    ]
                ];
                     
                     
                return new JsonModel($data);   
                     
            } catch (\Exception $e) {
                
                return new JsonModel([
                    'success' => false, 
                    'data' => 'ERROR_INMAIL_MESSAGE_LIST_UNAVAILABLE' 
                ]);
            }
             
           /*
            * 
            * (
    [0] => Array
        (
            [id] => <6f27ed6a-d554-4f0b-b9ee-7c708cca8b33@inmail.leaderslinked.com>
            [parent] => 
            [topic] => Test 1
            [mailbox] => INBOX
            [uid] => 8
            [date] => 1721906994
            [subject] => Test 1
            [from] => Array
                (
                    [name] => Efrain Yanez
                    [email] => efrain.yanez@inmail.leaderslinked.com
                )

            [flags] => Array
                (
                    [0] => seen
                )

            [to] => Array
                (
                    [0] => Array
                        (
                            [name] => 
                            [email] => santiago.olivera@inmail.leaderslinked.com
                        )

                )

            [cc] => Array
                (
                )

            [bcc] => Array
                (
                )

            [attachment] => 1
            
        )
        (
    [id] => <6f27ed6a-d554-4f0b-b9ee-7c708cca8b33@inmail.leaderslinked.com>
    [parent] =>
    [topic] => Test 1
    [mailbox] => INBOX
    [uid] => 8
    [date] => 1721906994
    [subject] => Test 1
    [from] => Array
        (
            [name] => Efrain Yanez
            [email] => efrain.yanez@inmail.leaderslinked.com
        )

    [flags] => Array
        (
            [0] => seen
        )

    [to] => Array
        (
            [0] => Array
                (
                    [name] =>
                    [email] => santiago.olivera@inmail.leaderslinked.com
                )

        )

    [cc] => Array
        (
        )

    [bcc] => Array
        (
        )
[body] => 'esto es una pryeba',
    [attachment] => Array
        (
            [POST 1080X1080-03-37.png] => Array
                (
                    [image/png] => �PNG


 



        [futbol-720p-230714 - Copy (1).mp4] => Array
                (
                    [video/mp4]
        
            * 
            * 
            Array
(
    [0] => __construct
    [1] => connect
    [2] => disconnect
    [3] => getActiveMailbox
    [4] => getEmails
    [5] => getEmailTotal
    [6] => getNextUid
    [7] => getMailboxes
    [8] => getUniqueEmails
    [9] => move
    [10] => copy
    [11] => remove
    [12] => expunge
    [13] => search
    [14] => searchTotal
    [15] => setActiveMailbox
    [16] => i
    [17] => __call
    [18] => __invoke
    [19] => __toString
    [20] => addMethod
    [21] => callArray
    [22] => inspect
    [23] => loadState
    [24] => loop
    [25] => off
    [26] => on
    [27] => saveState
    [28] => trigger
    [29] => when
)
            */
     
        } else {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    }
    
    public function getAttachmentAction()
    {
        $request = $this->getRequest();
        if ($request->isGet()) {
            $currentUserPlugin = $this->plugin('currentUserPlugin');
            $currentUser = $currentUserPlugin->getUser();
            
            $id = intval($this->params()->fromRoute('id'), 10);
            $attachment = intval($this->params()->fromRoute('attachment'), 10);
            
            $externalCredentials = ExternalCredentials::getInstancia($this->config, $this->adapter);
            $externalCredentials->getUserBy($currentUser->id);
            
            $host       = trim($this->config['leaderslinked.inmail.host']);
            $port       = intval($this->config['leaderslinked.inmail.port_imap'], 10);
            $mailbox    = trim($this->config['leaderslinked.inmail.mailbox']);
            
            
            $username   = $externalCredentials->getUsernameInmail();
            $password   =  $externalCredentials->getPasswordInmail();
            
           
            
 
            try {
                \Eden\Core\Control::i();
                $client = eden('mail')->imap(
                    $host,
                    $username,
                    $password,
                    $port,
                    false);
                
                $client->setActiveMailbox($mailbox);
      
                $email = $client->getUniqueEmails($id, true);
                $client->disconnect();
                
                if($email['uid']) {
                    
                    
                    $base64         = '';
                    $contentType    = '';
                    $filename       = '';
                  
                    if(!empty($email['attachment']) &&  is_array($email['attachment'])) {
                        
                       
                        
                        foreach($email['attachment'] as $filename => $data)
                        {
                         
                            $i = 0;
                            foreach($data as $contentType => $value)
                            {
                                if($i == $attachment) {
                                    $base64 = base64_encode($value);
                                    break;
                                }
                                $i++;
                            }
                        }
                    }
                    
                    if($base64) {
                        return new JsonModel([
                            'success' => true,
                            'data' => [
                                'filename' => $filename, 
                                'mime-type' => $contentType,
                                'base64' =>  $base64,
                            ]
                        ]);
                    } else {
                        return new JsonModel([
                            'success' => false,
                            'data' =>  'ERROR_INMAIL_MESSAGE_ATTACHMENT_NOT_FOUND'
                        ]);
                    }
                    
                    
                   
                   
                   

                    
                } else {
                    return new JsonModel([
                        'success' => false,
                        'data' => 'ERROR_INMAIL_MESSAGE_NOT_FOUND'
                    ]);
                }
          
                
            } catch (\Exception $e) {
                
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_INMAIL_MESSAGE_LIST_UNAVAILABLE'
                ]);
            }
            
          
            
        } else {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    }
    
    public function getMessageAction()
    {
        $request = $this->getRequest();
        if ($request->isGet()) {
            $currentUserPlugin = $this->plugin('currentUserPlugin');
            $currentUser = $currentUserPlugin->getUser();
            
            $id = intval($this->params()->fromRoute('id'), 10);
            
            $storage = Storage::getInstance($this->config);
            
            $externalCredentials = ExternalCredentials::getInstancia($this->config, $this->adapter);
            $externalCredentials->getUserBy($currentUser->id);
            
            $host       = trim($this->config['leaderslinked.inmail.host']);
            $port       = intval($this->config['leaderslinked.inmail.port_imap'], 10);
            $mailbox    = trim($this->config['leaderslinked.inmail.mailbox']);
            
            
            $username   = $externalCredentials->getUsernameInmail();
            $password   =  $externalCredentials->getPasswordInmail();
            
            
            
            
            try {
                \Eden\Core\Control::i();
                $client = eden('mail')->imap(
                    $host,
                    $username,
                    $password,
                    $port,
                    false);
                
                $client->setActiveMailbox($mailbox);
                
                $email = $client->getUniqueEmails($id, true);
                $client->disconnect();
                
                if($email['uid']) {
                    $from = $email['from']['email'];
                    $subject = $email['subject'];
                    $body   = empty($email['body']['text/html']) ?  $email['body']['text/plain'] : $email['body']['text/html'];
                    
                    
                    $userMapper = \LeadersLinked\Mapper\UserMapper::getInstance($this->adapter);
                    $user = $userMapper->fetchOneByUsernameInmailAndNetworkId($from, $currentUser->network_id);
                    
                    
                    $seen = false;
                    if(is_array($email['flags'])) {
                        foreach($email['flags'] as $flag)
                        {
                            if($flag == 'seen') {
                                $seen = 1;
                                break;
                            }
                        }
                    }
                    
                    
                    
                    $attachments = [];
                    if(!empty($email['attachment']) &&  is_array($email['attachment'])) {
                        foreach($email['attachment'] as $filename => $attachment)
                        {
                            $i = 0;
                            foreach($attachment as $contentType => $value)
                            {
                                array_push($attachments, [
                                    'filename' => $filename,
                                    'content-type' => $contentType,
                                    'attachment_link' =>  $this->url()->fromRoute('inmail/message/attachment',[ 'id' => $email['uid'], 'attachment' => $i ], ['force_canonical' => true]),
                                ]);
                                $i++;
                            }
                        }
                    }
                    
                    return new JsonModel([
                        'success' => true,
                        'data' => [
                            'uuid' => $user->uuid,
                            'name' => $user->first_name . ' ' . $user->last_name,
                            'image' => $storage->getUserImage($user),
                            'subject' => $subject,
                            'body' => $body,
                            'date' => date('Y-m-d h:i a', $email['date']),
                            'seen' => $seen,
                            'block_link' => $this->url()->fromRoute('inmail/user/block',[ 'id' => $user->uuid ], ['force_canonical' => true]),
                            'send_link' => $this->url()->fromRoute('inmail/message/send',[ 'id' => $user->uuid ], ['force_canonical' => true]),
                            'delete_link'=>    $this->url()->fromRoute('inmail/message/delete',[ 'id' => $email['uid'] ], ['force_canonical' => true]),
                            'attachments' => $attachments,
                        ]
                    ]);
                    
                    
                } else {
                    return new JsonModel([
                        'success' => false,
                        'data' => 'ERROR_INMAIL_MESSAGE_NOT_FOUND'
                    ]);
                }
                
                
            } catch (\Exception $e) {
                
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_INMAIL_MESSAGE_LIST_UNAVAILABLE'
                ]);
            }
            
            
            
        } else {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    }
    
    
    public function deleteMessageAction()
    {
        $request = $this->getRequest();
        if ($request->isPost()) {
            $currentUserPlugin = $this->plugin('currentUserPlugin');
            $currentUser = $currentUserPlugin->getUser();
            
            $id = intval($this->params()->fromRoute('id'), 10);

            
            $externalCredentials = ExternalCredentials::getInstancia($this->config, $this->adapter);
            $externalCredentials->getUserBy($currentUser->id);
            
            $host       = trim($this->config['leaderslinked.inmail.host']);
            $port       = intval($this->config['leaderslinked.inmail.port_imap'], 10);
            $mailbox    = trim($this->config['leaderslinked.inmail.mailbox']);
            
            
            $username   = $externalCredentials->getUsernameInmail();
            $password   =  $externalCredentials->getPasswordInmail();
            
            
            
            
            try {
                \Eden\Core\Control::i();
                $client = eden('mail')->imap(
                    $host,
                    $username,
                    $password,
                    $port,
                    false);
                
                $client->setActiveMailbox($mailbox);
                
                $response = $client->remove($id, true); 
                $client->disconnect();
              
                if($response) {
                    return new JsonModel([
                        'success' => true,
                        'data' => 'LABEL_INMAIL_MESSAGE_DELETED'
                    ]);
                } else {
                    return new JsonModel([
                        'success' => false,
                        'data' =>  'ERROR_INMAIL_MESSAGE_NOT_DELETE'
                    ]);
                }
                
                
            } catch (\Exception $e) {
                
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_INMAIL_MESSAGE_LIST_UNAVAILABLE'
                ]);
            }
            
            
            
        } else {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    }
    
    
    public function sendMessageAction()
    {
        $request = $this->getRequest();
        if ($request->isPost()) {
            $currentUserPlugin = $this->plugin('currentUserPlugin');
            $currentUser = $currentUserPlugin->getUser();
            
            $userMapper = UserMapper::getInstance($this->adapter);
            
            $id = $this->params()->fromRoute('id');
            if (!$id) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID'
                ]);
            }
            
            
            $user = $userMapper->fetchOneByUuidAndNetworkId($id, $currentUser->network_id);
            if (!$user) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_REQUEST_IS_INVALID'
                ]);
            }
            
            $externalCredentials = ExternalCredentials::getInstancia($this->config, $this->adapter);
            $externalCredentials->getUserBy($currentUser->id);
            
            $host       = trim($this->config['leaderslinked.inmail.host']);
            $port       = intval($this->config['leaderslinked.inmail.port_smtp'], 10);

            
            $username   = $externalCredentials->getUsernameInmail();
            $password   =  $externalCredentials->getPasswordInmail();
            
            
            
            $data = array_merge($request->getPost()->toArray(), $request->getFiles()->toArray());
     
            
            $form = new SendForm();
            $form->setData($data);
            
            if ($form->isValid()) {
                
                $dataPost = (array) $form->getData();
                
                try { 
                    \Eden\Core\Control::i();
                    $smtp = eden('mail')->smtp(
                        $host,
                        $username,
                        $password,
                        $port,
                        false
                    );
                   
                    $smtp->setSubject( $dataPost['subject']);
                    $smtp->setBody( $dataPost['body'], true);
                    $smtp->setBody($dataPost['body']);
                    $smtp->addTo($user->username_inmail);
    
                    $files  = $this->getRequest()->getFiles()->toArray();
                    if (isset($files['filename']) && empty($files['filename']['error'])) {
                        $smtp->addAttachment($files['filename']['name'], $files['filename']['tmp_name']);
                        
                    }
                    
                    
                    
                    $smtp->send();
                    
                    $smtp->disconnect(); 
                    
                    return new JsonModel([
                        'success'   => true,
                        'data'   => 'LABEL_INMAIL_MESSAGE_SENT'
                    ]);
                    
                } catch (\Exception $e) {
                    return new JsonModel([
                        'success'   => false,
                        'data'   => 'ERROR_INMAIL_MESSAGE_NOT_SENT'
                    ]);
                }
                
                
            } else {
                
                
                $messages = [];
                $form_messages = (array) $form->getMessages();
                foreach ($form_messages  as $fieldname => $field_messages) {
                    $messages[$fieldname] = array_values($field_messages);
                }
                
                return new JsonModel([
                    'success'   => false,
                    'data'   => $messages
                ]);
            }
        } else {
            return new JsonModel([
                'success' => false,
                'data' => 'ERROR_METHOD_NOT_ALLOWED'
            ]);
        }
    }
    

}