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'
]);
}
}
}