Rev 625 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |
<?php
declare(strict_types=1);
namespace LeadersLinked\Controller;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\JsonModel;
use LeadersLinked\Mapper\QueryMapper;
use LeadersLinked\Mapper\CompanyMapper;
use LeadersLinked\Mapper\MicrolearningTopicMapper;
use LeadersLinked\Model\MicrolearningTopic;
use LeadersLinked\Mapper\MicrolearningUserMapper;
use LeadersLinked\Model\MicrolearningUser;
use LeadersLinked\Mapper\EngagementRewardMapper;
use LeadersLinked\Model\EngagementReward;
use LeadersLinked\Library\Functions;
use LeadersLinked\Library\Storage;
use LeadersLinked\Model\MicrolearningTopicUser;
class MarketPlaceController extends AbstractActionController
{
/**
*
* @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 perfiles
* {@inheritDoc}
* @see \Laminas\Mvc\Controller\AbstractActionController::indexAction()
*/
public function indexAction()
{
$request = $this->getRequest();
if(!$request->isGet()) {
return new JsonModel([
'success' => false,
'data' => 'ERROR_METHOD_NOT_ALLOWED'
]);
}
$currentUserPlugin = $this->plugin('currentUserPlugin');
$currentUser = $currentUserPlugin->getUser();
$search = Functions::sanitizeFilterString($this->params()->fromQuery('search', ''));
$entity = Functions::sanitizeFilterString($this->params()->fromQuery('entity', 'capsules'));
$storage = Storage::getInstance($this->config, $this->adapter);
if($entity == 'rewards') {
$currentUserPlugin = $this->plugin('currentUserPlugin');
$currentUser = $currentUserPlugin->getUser();
$currentNetworkPlugin = $this->plugin('currentNetworkPlugin');
$currentNetwork = $currentNetworkPlugin->getNetwork();
$companyMapper = CompanyMapper::getInstance($this->adapter);
$company = $companyMapper->fetchDefaultForNetworkByNetworkId($currentNetwork->id);
$queryMapper = QueryMapper::getInstance($this->adapter);
$select = $queryMapper->getSql()->select( EngagementRewardMapper::_TABLE);
$select->columns(['uuid', 'name', 'image', 'points']);
$select->where->equalTo('company_id', $company->id);
$select->where->equalTo('status', EngagementReward::STATUS_ACTIVE);
if($search) {
$select->where->like('c.name', '%' . $search . '%');
}
$select->order(['name ASC']);
$path = $storage->getPathEngagementReward();
$records = $queryMapper->fetchAll($select);
$items = [];
foreach($records as $record)
{
$item = [
'name' => $record['name'],
'image' => $storage->getGenericImage($path, $record['uuid'], $record['image']),
'points' => $record['points'],
'link_claim' => $this->url()->fromRoute('marketplace/claim', ['id' => $record['uuid']])
];
array_push($items, $item);
}
}
if($entity == 'topics') {
$microlearningTopicUserMapper = MicrolearningTopicUserMapper::getInstance($this->adapter);
$path = $storage->getPathMicrolearningTopic();
// Obtener las cápsulas públicas y gratuitas
$accessGrantedIds = new MicrolearningUserAccessGrantedIds();
$topicUserRecords = $microlearningTopicUserMapper->fetchAllActiveByUserId($currentUser->id);
// Obtener las cápsulas públicas y gratuitas
foreach($topicUserRecords as $topicUserRecord) {
if(!in_array($topicUserRecord->company_id, $accessGrantedIds->companies)) {
array_push($accessGrantedIds->companies, $topicUserRecord->company_id);
}
if(!in_array($topicUserRecord->topic_id, $accessGrantedIds->topics)) {
array_push($accessGrantedIds->topics, $topicUserRecord->topic_id);
}
if(!in_array($topicUserRecord->topic_id, $accessGrantedIds->topics)) {
array_push($accessGrantedIds->topics, $topicUserRecord->topic_id);
}
}
$queryMapper = QueryMapper::getInstance($this->adapter);
$select = $queryMapper->getSql()->select();
$select->columns(['id', 'uuid', 'name', 'status', 'image', 'privacy', 'type', 'marketplace']);
$select->from(['t' => MicrolearningTopicMapper::_TABLE]);
$select->join(['o' => CompanyMapper::_TABLE], ' c.company_id = o.id ', ['company_uuid' => 'uuid']);
$select->where->equalTo('c.privacy', MicrolearningTopic::PRIVACY_PUBLIC);
$select->where->equalTo('c.type', MicrolearningTopic::TYPE_FREE);
$select->where->equalTo('c.status', MicrolearningTopic::STATUS_ACTIVE);
if($search) {
$select->where->like('c.name', '%' . $search . '%');
}
$select->order(['name ASC']);
//echo $select->getSqlString($this->adapter->platform); exit;
$records = $queryMapper->fetchAll($select);
$items = [];
foreach($records as $record)
{
$topicUser = $microlearningTopicUserMapper->fetchOneByUserIdAndTopicId($currentUser->id, $record['id']);
$params = [
'company_uuid' => $record['company_uuid'],
'topic_uuid' => $record['uuid']
];
$item = [
'name' => $record['name'],
'image' => $storage->getGenericImage($path, $record['uuid'], $record['marketplace']),
'status' => $topicUser ? 'LABEL_ENROLLED' : 'LABEL_AVAILABLE',
'link_enroll' => $topicUser ? '' : $this->url()->fromRoute('marketplace/enroll', $params),
];
array_push($items, $item);
}
}
$response = [
'success' => true,
'data' => $items
];
return new JsonModel($response);
}
public function enrollAction()
{
$request = $this->getRequest();
if($request->isPost()) {
$currentUserPlugin = $this->plugin('currentUserPlugin');
$currentUser = $currentUserPlugin->getUser();
$company_uuid = $this->params()->fromRoute('company_uuid');
$topic_uuid = $this->params()->fromRoute('topic_uuid');
$companyMapper = CompanyMapper::getInstance($this->adapter);
$company = $companyMapper->fetchOneByUuid($company_uuid);
if(!$company) {
$this->logger->err('ERROR_COMPANY_NOT_FOUND', ['company_uuid' => $company_uuid]);
return new JsonModel([
'success' => false,
'data' => 'ERROR_COMPANY_NOT_FOUND'
]);
}
$topicMapper = MicrolearningTopicMapper::getInstance($this->adapter);
$topic = $topicMapper->fetchOneByUuid($topic_uuid);
if(!$topic) {
return new JsonModel([
'success' => false,
'data' => 'ERROR_TOPIC_NOT_FOUND'
]);
}
if($topic->company_id != $company->id) {
return new JsonModel([
'success' => false,
'data' => 'ERROR_UNAUTHORIZED'
]);
}
if($topic->status != MicrolearningTopic::STATUS_ACTIVE || $topic->privacy != MicrolearningTopic::PRIVACY_PUBLIC || $topic->type != MicrolearningTopic::TYPE_FREE) {
$this->logger->err('ERROR_UNAUTHORIZED', ['company_id' => $company->id, 'topic_id' => $topic->id]);
return new JsonModel([
'success' => false,
'data' => 'ERROR_UNAUTHORIZED'
]);
}
$topicUserMapper = MicrolearningTopicUserMapper::getInstance($this->adapter);
$topicUser = $topicUserMapper->fetchOneByUserIdAndTopicId($currentUser->id, $topic->id);
if($topicUser) {
return new JsonModel([
'success' => false,
'data' => 'ERROR_UNAUTHORIZED'
]);
}
$topicUser = new MicrolearningTopicUser();
$topicUser->company_id = $company->id;
$topicUser->topic_id = $topic->id;
$topicUser->user_id = $currentUser->id;
$topicUser->access = MicrolearningTopicUser::ACCESS_UNLIMITED;
if($topicUserMapper->insert($topicUser)) {
$topicUser = $topicUserMapper->fetchOne($topic->id);
if($topicUser) {
$microlearningUserMapper = MicrolearningUserMapper::getInstance($this->adapter);
$microlearningUser = $microlearningUserMapper->fetchOneByUserIdAndCompanyId($topicUser->user_id, $topicUser->company_id);
if($microlearningUser) {
$microlearningUser->updated_on = $topicUser->updated_on;
$microlearningUserMapper->update($microlearningUser);
} else {
$microlearningUser = new MicrolearningUser();
$microlearningUser->company_id = $topicUser->company_id;
$microlearningUser->user_id = $topicUser->user_id;
$microlearningUser->added_on = $topicUser->added_on;
$microlearningUser->updated_on = $topicUser->updated_on;
$microlearningUserMapper->insert($microlearningUser);
}
}
return new JsonModel([
'success' => true,
'data' => 'LABEL_YOU_HAVE_BEEN_SUCCESSFULLY_ENROLLED'
]);
} else {
return new JsonModel([
'success' => false,
'data' => 'ERROR_UNAUTHORIZED'
]);
}
} else {
return new JsonModel([
'success' => false,
'data' => 'ERROR_METHOD_NOT_ALLOWED'
]);
}
}
public function claimAction()
{
$currentUserPlugin = $this->plugin('currentUserPlugin');
$currentUser = $currentUserPlugin->getUser();
return new JsonModel([
'success' => true,
'data' => 'Por definirse'
]);
}
public function getCategoriesAction()
{
$currentUserPlugin = $this->plugin('currentUserPlugin');
$currentUser = $currentUserPlugin->getUser();
$acl = $this->getEvent()->getViewModel()->getVariable('acl');
$allowDailyPuse = $acl->isAllowed($currentUser->usertype_id, 'daily-pulse');
$data = [
'capsules' => 'LABEL_CAPSULES'
];
if( $allowDailyPuse) {
$data['rewards'] = 'LABEL_REWARDS';
}
return new JsonModel([
'success' => true,
'data' => $data
]);
}
}