Rev 15345 | Rev 15452 | 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\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\NetworkMapper;
use LeadersLinked\Model\Network;
use LeadersLinked\Form\NetworkCreateForm;
use LeadersLinked\Model\User;
use LeadersLinked\Model\UserType;
use LeadersLinked\Mapper\PageMapper;
use LeadersLinked\Mapper\UserMapper;
use LeadersLinked\Mapper\UserPasswordMapper;
use LeadersLinked\Model\UserPassword;
use LeadersLinked\Mapper\CompanySizeMapper;
use LeadersLinked\Mapper\IndustryMapper;
use LeadersLinked\Model\Company;
use LeadersLinked\Mapper\CompanyMapper;
use LeadersLinked\Model\CompanyUser;
use LeadersLinked\Mapper\CompanyUserMapper;
use LeadersLinked\Form\NetworkEditForm;
use LeadersLinked\Mapper\EmailTemplateMapper;
use LeadersLinked\Model\EmailTemplate;
use LeadersLinked\Mapper\PushTemplateMapper;
use LeadersLinked\Model\PushTemplate;
use LeadersLinked\Model\Page;
class PrivateNetworksController 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()
{
$currentUserPlugin = $this->plugin('currentUserPlugin');
$currentUser = $currentUserPlugin->getUser();
$request = $this->getRequest();
$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) {
$acl = $this->getEvent()->getViewModel()->getVariable('acl');
$allowEdit = $acl->isAllowed($currentUser->usertype_id, 'settings/private-networks/edit');
$allowDelete = $acl->isAllowed($currentUser->usertype_id, 'settings/private-networks/delete');
$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 = ['name','main_hostname', 'admin_hostname'];
$order_field = isset($fields[$order_field]) ? $fields[$order_field] : 'name';
if(!in_array($order_direction, ['ASC', 'DESC'])) {
$order_direction = 'ASC';
}
$networkMapper = NetworkMapper::getInstance($this->adapter);
$paginator = $networkMapper->fetchAllDataTable($search, $page, $records_x_page, $order_field, $order_direction);
$items = [];
$records = $paginator->getCurrentItems();
foreach($records as $record)
{
$item = [
'name' => $record->name,
'main_hostname' => $record->main_hostname,
'admin_hostname' => $record->admin_hostname,
'status' => $record->status,
'actions' => [
'link_edit' => $allowEdit ? $this->url()->fromRoute('settings/private-networks/edit', ['id' => $record->uuid ]) : '',
'link_delete' => $allowDelete && $record->default == Network::DEFAULT_NO ? $this->url()->fromRoute('settings/private-networks/delete', ['id' => $record->uuid ]) : '',
],
];
array_push($items, $item);
}
return new JsonModel([
'success' => true,
'data' => [
'items' => $items,
'total' => $paginator->getTotalItemCount(),
]
]);
} else {
$formAdd = new NetworkCreateForm($this->adapter);
$formEdit = new NetworkEditForm();
$this->layout()->setTemplate('layout/layout-backend');
$viewModel = new ViewModel();
$viewModel->setTemplate('leaders-linked/private-networks/index.phtml');
$viewModel->setVariables([
'formAdd' => $formAdd,
'formEdit' => $formEdit
]);
return $viewModel ;
}
} else {
return new JsonModel([
'success' => false,
'data' => 'ERROR_METHOD_NOT_ALLOWED'
]);;
}
}
public function addAction() {
$currentUserPlugin = $this->plugin('currentUserPlugin');
$currentUser = $currentUserPlugin->getUser();
$request = $this->getRequest();
if ($request->isPost()) {
$form = new NetworkCreateForm($this->adapter);
$dataPost = $request->getPost()->toArray();
$form->setData($dataPost);
if ($form->isValid()) {
$dataPost = (array) $form->getData();
$networkMapper = NetworkMapper::getInstance($this->adapter);
$networkDefault = $networkMapper->fetchOneByDefault();
$network = new Network();
$network->status = Network::STATUS_ACTIVE;
$network->default = Network::DEFAULT_NO;
$network->name = $dataPost['company'];
$network->admin_hostname = $dataPost['admin_hostname'];
$network->main_hostname = $dataPost['main_hostname'];
foreach($networkDefault as $key => $value)
{
if(strpos($key, 'css') !== false) {
$network->{$key} = $networkDefault->{$key};
}
}
if(!$networkMapper->insert($network)) {
$response = [
'success' => false,
'data' => $networkMapper->getError()
];
return new JsonModel($response);
}
$this->logger->info('Se agrego la red privada : ' . $network->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
$timestamp = time();
$activation_key = sha1($dataPost['email'] . uniqid() . $timestamp);
$password_hash = password_hash($dataPost['password'], PASSWORD_DEFAULT);
$user = new User();
$user->blocked = User::BLOCKED_NO;
$user->email = $dataPost['email'];
$user->email_verified = User::EMAIL_VERIFIED_YES;
$user->first_name = $dataPost['first_name'];
$user->last_name = $dataPost['last_name'];
$user->usertype_id = UserType::ADMIN;
$user->password = $password_hash;
$user->password_updated_on = date('Y-m-d H:i:s');
$user->activation_key = $activation_key;
$user->status = User::STATUS_ACTIVE;
$user->login_attempt = 0;
$user->network_id = $network->id;
$userMapper = UserMapper::getInstance($this->adapter);
if(!$userMapper->insert($user)) {
$response = [
'success' => false,
'data' => $networkMapper->getError()
];
return new JsonModel($response);
}
$userPassword = new UserPassword();
$userPassword->user_id = $user->id;
$userPassword->password = $password_hash;
$userPasswordMapper = UserPasswordMapper::getInstance($this->adapter);
$userPasswordMapper->insert($userPassword);
$this->logger->info('Se agrego el usuario administrador : ' . $user->first_name . ' ' . $user->last_name . ' de la red privada : ' . $network->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
$companySizeMapper = CompanySizeMapper::getInstance($this->adapter);
$companySize = $companySizeMapper->fetchOneByUuid($dataPost['company_size_id']);
$industryMapper = IndustryMapper::getInstance($this->adapter);
$industry = $industryMapper->fetchOneByUuid($dataPost['industry_id']);
$company = new Company();
$company->name = $network->name;
$company->default_for_network = Company::DEFAULT_FOR_NETWORK_YES;
$company->network_id = $network->id;
$company->company_size_id = $companySize->id;
$company->industry_id = $industry->id;
$company->foundation_year = date('Y');
$company->status = Company::STATUS_ACTIVE;
$company->description = '';
$companyMapper = CompanyMapper::getInstance($this->adapter);
$result = $companyMapper->insert($company);
if($result) {
/** Creación del fake user propietario de la empresa */
$owner = new User();
$owner->network_id = $network->id;
$owner->email = 'fake-email'.$company->id;
$owner->first_name = substr($company->name, 0, 64);
$owner->last_name = substr($company->name, 64);
$owner->status = User::STATUS_INACTIVE;
$owner->blocked = User::BLOCKED_YES;
$owner->login_attempt = 0;
$owner->email_verified = User::EMAIL_VERIFIED_YES;
$owner->show_in_search = User::SHOW_IN_SEARCH_NO;
$owner->password = 'NO-PASSWORD';
$owner->usertype_id = UserType::COMPANY;
$userMapper = UserMapper::getInstance($this->adapter);
$userMapper->insert($owner);
$companyUser = new CompanyUser();
$companyUser->company_id = $company->id;
$companyUser->user_id = $owner->id;
$companyUser->owner = CompanyUser::OWNER_YES;
$companyUser->creator = CompanyUser::CREATOR_NO;
$companyUser->status = CompanyUser::STATUS_ACCEPTED;
$companyUserMapper = CompanyUserMapper::getInstance($this->adapter);
$companyUserMapper->insert($companyUser);
/** agregamos el usuario que lo crea como full administrador */
$companyUser = new CompanyUser();
$companyUser->company_id = $company->id;
$companyUser->user_id = $user->id;
$companyUser->owner = CompanyUser::OWNER_NO;
$companyUser->creator = CompanyUser::CREATOR_YES;
$companyUser->status = CompanyUser::STATUS_ACCEPTED;
$companyUser->backend = CompanyUser::BACKEND_YES;
$companyUserMapper->insert($companyUser);
$emailTemplateMapper = EmailTemplateMapper::getInstance($this->adapter);
$records = $emailTemplateMapper->fetchAllDefault();
foreach($records as $record)
{
$emailTemplate = new EmailTemplate();
$emailTemplate->network_id = $network->id;
$emailTemplate->email_template_default_id = $record->id;
$emailTemplate->code = $record->code;
$emailTemplate->subject = $record->subject;
$emailTemplate->content = $record->content;
$emailTemplate->status = $record->status;
$emailTemplateMapper->insert($emailTemplate);
}
$pageMapper = PageMapper::getInstance($this->adapter);
$records = $pageMapper->fetchAllDefault();
foreach($records as $record)
{
$page = new Page();
$page->network_id = $network->id;
$page->code = $record->code;
$page->content = $record->content;
$page->fixed = $record->fixed;
$page->page_default_id = $record->id;
$page->title = $record->title;
$page->status = $record->status;
$page->type = $record->type;
$page->url = $record->url;
$pageMapper->insert($page);
}
$this->logger->info('Se agrego la empresa por defecto : ' . $company->name . ' de la red : ' . $network->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
$data = [
'success' => true,
'data' => 'LABEL_RECORD_ADDED'
];
} else {
$data = [
'success' => false,
'data' => $companyMapper->getError()
];
}
return new JsonModel($data);
} 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 {
$data = [
'success' => false,
'data' => 'ERROR_METHOD_NOT_ALLOWED'
];
return new JsonModel($data);
}
return new JsonModel($data);
}
public function editAction()
{
$currentUserPlugin = $this->plugin('currentUserPlugin');
$currentUser = $currentUserPlugin->getUser();
$request = $this->getRequest();
$id = $this->params()->fromRoute('id');
if (!$id) {
$data = [
'success' => false,
'data' => 'ERROR_INVALID_PARAMETER'
];
return new JsonModel($data);
}
$networkMapper = NetworkMapper::getInstance($this->adapter);
$network = $networkMapper->fetchOneByUuid($id);
if (!$network) {
$data = [
'success' => false,
'data' => 'ERROR_RECORD_NOT_FOUND'
];
return new JsonModel($data);
}
if ($request->isPost()) {
$form = new NetworkEditForm();
$dataPost = $request->getPost()->toArray();
$form->setData($dataPost);
if ($form->isValid()) {
$dataPost = (array) $form->getData();
if(empty($dataPost['status'])) {
$network->status = Network::STATUS_INACTIVE;
}
$network->name = $dataPost['name'];
$network->main_hostname = $dataPost['main_hostname'];
$network->admin_hostname = $dataPost['admin_hostname'];
$result = $networkMapper->update($network);
if ($result) {
$this->logger->info('Se actualizo la red privada : ' . $network->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
$data = [
'success' => true,
'data' => 'LABEL_RECORD_UPDATED'
];
} else {
$data = [
'success' => false,
'data' => $networkMapper->getError()
];
}
return new JsonModel($data);
} 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 if ($request->isGet()) {
$data = [
'success' => true,
'data' => [
'name' => $network->name,
'status' => $network->status,
'main_hostname' => $network->main_hostname,
'admin_hostname' => $network->admin_hostname,
'status' => $network->status,
]
];
return new JsonModel($data);
} else {
$data = [
'success' => false,
'data' => 'ERROR_METHOD_NOT_ALLOWED'
];
return new JsonModel($data);
}
return new JsonModel($data);
}
public function deleteAction()
{
$currentUserPlugin = $this->plugin('currentUserPlugin');
$currentUser = $currentUserPlugin->getUser();
$request = $this->getRequest();
if ($request->isPost()) {
$id = $this->params()->fromRoute('id');
if (!$id) {
$response = [
'success' => false,
'data' => 'ERROR_INVALID_PARAMETER'
];
return new JsonModel($response);
}
$networkMapper = NetworkMapper::getInstance($this->adapter);
$network = $networkMapper->fetchOneByUuid($id);
if (!$network) {
$response = [
'success' => false,
'data' => 'ERROR_RECORD_NOT_FOUND'
];
return new JsonModel($response);
}
if($network->default == Network::DEFAULT_YES) {
$response = [
'success' => false,
'data' => 'ERROR_PRIVATE_NETWORK_CANNOT_DELETED'
];
return new JsonModel($response);
}
$result = $networkMapper->delete($network->id);
if ($result) {
$this->logger->info('Se borro la red privada : ' . $network->name, ['user_id' => $currentUser->id, 'ip' => Functions::getUserIP()]);
$response = [
'success' => true,
'data' => 'LABEL_RECORD_DELETED'
];
} else {
$response = [
'success' => false,
'data' => $networkMapper->getError()
];
}
} else {
$response = [
'success' => false,
'data' => 'ERROR_METHOD_NOT_ALLOWED'
];
}
return new JsonModel($response);
}
}