Proyectos de Subversion LeadersLinked - Services

Rev

Rev 318 | 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\Authentication\AuthenticationService;
use Laminas\Authentication\Result as AuthResult;
use Laminas\Db\Adapter\AdapterInterface;

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

use LeadersLinked\Authentication\AuthAdapter;
use LeadersLinked\Mapper\UserMapper;
use LeadersLinked\Mapper\EmailTemplateMapper;
use LeadersLinked\Model\User;
use LeadersLinked\Model\UserType;

use LeadersLinked\Library\AesCipher;
use LeadersLinked\Library\AesEncryption;
use LeadersLinked\Library\QueueEmail;
use LeadersLinked\Library\Functions;
use LeadersLinked\Model\EmailTemplate;
use LeadersLinked\Mapper\UserPasswordMapper;
use LeadersLinked\Mapper\DeviceMapper;
use LeadersLinked\Model\Device;
use LeadersLinked\Mapper\ApplicationMapper;
use LeadersLinked\Model\Application;
use LeadersLinked\Validator\PasswordStrengthCheck;

use LeadersLinked\Mapper\CompanyMapper;
use LeadersLinked\Model\Company;
use LeadersLinked\Mapper\MicrolearningTopicMapper;
use LeadersLinked\Mapper\MicrolearningCapsuleMapper;
use LeadersLinked\Mapper\MicrolearningSlideMapper;
use LeadersLinked\Model\MicrolearningSlide;
use LeadersLinked\Mapper\MicrolearningUserLogMapper;
use LeadersLinked\Mapper\MicrolearningUserProgressMapper;
use LeadersLinked\Mapper\MicrolearningQuizMapper;
use LeadersLinked\Mapper\MicrolearningQuestionMapper;
use LeadersLinked\Mapper\MicrolearningAnswerMapper;
use LeadersLinked\Model\MicrolearningUserProgress;
use LeadersLinked\Model\MicrolearningUserLog;
use LeadersLinked\Mapper\DeviceHistoryMapper;
use LeadersLinked\Model\DeviceHistory;
use LeadersLinked\Mapper\PushMapper;
use LeadersLinked\Model\Push;
use LeadersLinked\Mapper\MicrolearningCapsuleUserMapper;
use LeadersLinked\Mapper\CompanyServiceMapper;
use LeadersLinked\Model\Service;
use LeadersLinked\Model\CompanyService;
use LeadersLinked\Model\MicrolearningCapsuleUser;
use LeadersLinked\Model\MicrolearningUserQuiz;
use LeadersLinked\Mapper\MicrolearningUserQuizMapper;
use LeadersLinked\Mapper\MicrolearningUserMapper;
use LeadersLinked\Model\MicrolearningUser;
use LeadersLinked\Mapper\PushTemplateMapper;
use LeadersLinked\Model\PushTemplate;
use LeadersLinked\Mapper\SyncLogMapper;
use LeadersLinked\Model\SyncLog;
use LeadersLinked\Model\MicrolearningExtendUser;
use LeadersLinked\Mapper\MicrolearningExtendUserMapper;
use LeadersLinked\Model\MicrolearningExtendUserCompany;
use LeadersLinked\Mapper\MicrolearningCapsuleCommentMapper;
use LeadersLinked\Mapper\MicrolearningExtendUserCompanyMapper;
use LeadersLinked\Mapper\MicrolearningExtendUserFunctionMapper;
use LeadersLinked\Mapper\MicrolearningExtendUserGroupMapper;
use LeadersLinked\Mapper\MicrolearningExtendUserInstitutionMapper;
use LeadersLinked\Mapper\MicrolearningExtendUserPartnerMapper;
use LeadersLinked\Mapper\MicrolearningExtendUserProgramMapper;
use LeadersLinked\Mapper\MicrolearningExtendUserStudentTypeMapper;
use LeadersLinked\Mapper\MicrolearningExtendUserSectorMapper;
use Nullix\CryptoJsAes\CryptoJsAes;
use LeadersLinked\Model\MicrolearningTopic;
use LeadersLinked\Model\MicrolearningCapsule;
use LeadersLinked\Model\UserDeleted;
use LeadersLinked\Mapper\UserDeletedMapper;
use LeadersLinked\Mapper\ApplicationVariantMapper;
use LeadersLinked\Library\EasyAES;


class ServiceController 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;
    }
    
    public function indexAction() 
    {
        return new JsonModel(['ok' => false]);
    }
    
    public function signinAction()
    {
        $rawdata = file_get_contents("php://input");
        error_log('URL = ' . $_SERVER['REQUEST_URI'] );
        error_log('$rawdata = ' . $rawdata );
        
        $request = $this->getRequest();
        
        if($request->isPost()) {
            
            
            $seed   = $this->config['leaderslinked.services.seed'];
            $min    = strtotime('-1 day');
            $max    = strtotime('+1 day');
            
            
            
            
            $device_uuid    = Functions::sanitizeFilterString($this->params()->fromPost('device_uuid', ''));
            $user_uuid      = Functions::sanitizeFilterString($this->params()->fromPost('user_uuid', ''));
            $rand           = Functions::sanitizeFilterString($this->params()->fromPost('rand', ''));
            $timestamp      = Functions::sanitizeFilterString($this->params()->fromPost('timestamp', ''));
            $password       = Functions::sanitizeFilterString($this->params()->fromPost('password', ''));
            $sync_id        = Functions::sanitizeFilterString($this->params()->fromPost('sync_id', ''));
            
            
            $ok = $device_uuid && strlen($device_uuid) == 32;
            $ok = $ok && $rand > 0;
            $ok = $ok && ($timestamp / 1000) >= $min;
            $ok = $ok && ($timestamp / 1000) <= $max;
            $ok = $ok && strlen($password) == 32;
            $ok = $ok && strlen($user_uuid)  == 36;
            $ok = $ok && $sync_id;
            
            if(!$ok) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID',
                ]);
            }
            
            $password_md5 = md5($device_uuid . '-' . $seed . '-' . $rand . '-' . $timestamp . '-' . $user_uuid );
            if($password != $password_md5) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_WEBSERVICE_PASSWORD',
                ]);
                
                
            }
            
            
            $deviceMapper = DeviceMapper::getInstance($this->adapter);
            $device = $deviceMapper->fetchOne($device_uuid);
            if(!$device) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_DEVICE_NOT_FOUND',
                ]);
            }
            
            $userMapper = UserMapper::getInstance($this->adapter);
            $user = $userMapper->fetchOneByUuid($user_uuid);
            if(!$user) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_USER_NOT_FOUND',
                ]);
            }
            
            
            $syncLog = new SyncLog();
            $syncLog->data          = json_encode(['user' => $user_uuid]);
            $syncLog->type          = 'signin';
            $syncLog->device_uuid   = $device->id;
            $syncLog->ip            = Functions::getUserIP();
            
            $syncLogMapper = SyncLogMapper::getInstance($this->adapter);
            $syncLogMapper->insert($syncLog);
            
            $device->user_id        = $user->id;
            $device->ip             = Functions::getUserIP();
            $result                 = $deviceMapper->update($device);
            
            if($result) {
                
                $deviceHistory = new DeviceHistory();
                $deviceHistory->device_id   = $device->id;
                $deviceHistory->user_id     = $user->id;
                $deviceHistory->ip          = Functions::getUserIP();
                
                $deviceHistoryMapper = DeviceHistoryMapper::getInstance($this->adapter);
                $deviceHistoryMapper->insert($deviceHistory);
                
                
                
                return new JsonModel([
                    'success' => true,
                    'data' => [
                        'sync_id' => $sync_id
                    ]
                ]);
            } else {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_THERE_WAS_AN_ERROR',
                ]);
            }
            
        }
        
        return new JsonModel([
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ]);
        

    }
    
    public function fcmAction()
    {
        
        $rawdata = file_get_contents("php://input");
        error_log('URL = ' . $_SERVER['REQUEST_URI'] );
        error_log('$rawdata = ' . $rawdata );
        
        $request = $this->getRequest();
        
  
        if($request->isPost()) {
            
            
            $seed   = $this->config['leaderslinked.services.seed'];
            $min    = strtotime('-1 day');
            $max    = strtotime('+1 day');
            
            $device_uuid    = Functions::sanitizeFilterString($this->params()->fromPost('device_uuid', ''));
            $token          = Functions::sanitizeFilterString($this->params()->fromPost('token', ''));
            $rand           = Functions::sanitizeFilterString($this->params()->fromPost('rand', ''));
            $timestamp      = Functions::sanitizeFilterString($this->params()->fromPost('timestamp', ''));
            $password       = Functions::sanitizeFilterString($this->params()->fromPost('password', ''));
            $sync_id        = Functions::sanitizeFilterString($this->params()->fromPost('sync_id', ''));
            
            $ok = $device_uuid && strlen($device_uuid) == 32;
            $ok = $ok && $rand > 0;
            $ok = $ok && ($timestamp / 1000) >= $min;
            $ok = $ok && ($timestamp / 1000) <= $max;
            $ok = $ok && strlen($password) == 32;
            $ok = $ok && strlen($token) <= 512;
            $ok = $ok && $sync_id;
                       
            if(!$ok) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID',
                ]);
            }
            
            $password_md5 = md5($device_uuid . '-' . $seed . '-' . $rand . '-' . $timestamp . '-' . $token );
            
            if($password != $password_md5) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_WEBSERVICE_PASSWORD',
                ]);
                
                
            }
            
            
            $deviceMapper = DeviceMapper::getInstance($this->adapter);
            $device = $deviceMapper->fetchOne($device_uuid);
            if(!$device) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_DEVICE_NOT_FOUND',
                ]);
            }
            
            
            $syncLog = new SyncLog();
            $syncLog->data          = json_encode(['token' => $token]);
            $syncLog->type          = 'token';
            $syncLog->device_uuid   = $device->id;
            $syncLog->ip            = Functions::getUserIP();
            
            $syncLogMapper = SyncLogMapper::getInstance($this->adapter);
            $syncLogMapper->insert($syncLog);
            
            $device->token          = $token;
            $device->ip             = Functions::getUserIP();
            $result                 = $deviceMapper->update($device);
            
            if($result) {
                return new JsonModel([
                    'success' => true,
                    'data' => [
                        'sync_id' => $sync_id
                    ]
                ]);
            } else {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_THERE_WAS_AN_ERROR',
                ]);
            }
            
        }
        
        return new JsonModel([
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ]);
    }
    
    
    public function deviceAction()
    {
        $rawdata = file_get_contents("php://input");
        error_log('URL = ' . $_SERVER['REQUEST_URI'] );
        error_log('$rawdata = ' . $rawdata );
        
        $request = $this->getRequest();
        
        if($request->isPost()) {
            
            $seed   = $this->config['leaderslinked.services.seed'];
            $min    = strtotime('-1 day');
            $max    = strtotime('+1 day');
            
            

            
            $device_uuid    = Functions::sanitizeFilterString($this->params()->fromPost('device_uuid', ''));
            $manufacturer   = Functions::sanitizeFilterString($this->params()->fromPost('manufacturer', ''));
            $platform       = Functions::sanitizeFilterString($this->params()->fromPost('platform', ''));
            $brand          = Functions::sanitizeFilterString($this->params()->fromPost('brand', ''));
            $version        = Functions::sanitizeFilterString($this->params()->fromPost('version', ''));
            $model          = Functions::sanitizeFilterString($this->params()->fromPost('model', ''));
            $rand           = Functions::sanitizeFilterString($this->params()->fromPost('rand', ''));
            $timestamp      = Functions::sanitizeFilterString($this->params()->fromPost('timestamp', ''));
            $password       = Functions::sanitizeFilterString($this->params()->fromPost('password', ''));
            $sync_id        = Functions::sanitizeFilterString($this->params()->fromPost('sync_id', ''));
            

            $ok = $device_uuid && strlen($device_uuid) == 32;
            $ok = $ok && strlen($manufacturer) <= 250;
            $ok = $ok && strlen($brand) <= 250;
            $ok = $ok && strlen($version) <= 250;
            $ok = $ok && strlen($model) <= 250;
            $ok = $ok && $rand > 0;
            $ok = $ok && ($timestamp / 1000) >= $min;
            $ok = $ok && ($timestamp / 1000) <= $max;
            $ok = $ok && strlen($password) == 32;
            $ok = $ok && $sync_id;

            
            $password_md5 = md5($device_uuid . '-' . $seed . '-' . $rand . '-' . $timestamp . '-' . $manufacturer . '-' . $brand . '-' . $version . '-' . $model);
         
            
            if($password != $password_md5) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_WEBSERVICE_PASSWORD',
                ]);
                
                
            }

            
            if(!$ok) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID',
                ]);
            }

            
            
            
            $syncLog = new SyncLog();
            $syncLog->data = json_encode([
                'platform' => $platform,
                'manufacturer' => $manufacturer,
                'brand' => $brand,
                'version' => $version,
                'model' => $model,
            ]);
            $syncLog->type          = 'device';
            $syncLog->device_uuid   = $device_uuid;
            $syncLog->ip            = Functions::getUserIP();
            
            $syncLogMapper = SyncLogMapper::getInstance($this->adapter);
            $syncLogMapper->insert($syncLog);
            
            
            $deviceMapper = DeviceMapper::getInstance($this->adapter);
            $device = $deviceMapper->fetchOne($device_uuid);
            
            
            
            
            if($device) {
                $device->platform       = $platform;
                $device->manufacturer   = $manufacturer;
                $device->brand          = $brand;
                $device->version        = $version;
                $device->model          = $model;
                $device->ip             = Functions::getUserIP();
                $result                 = $deviceMapper->update($device); 
                
            } else {
                $device                 = new Device();
                $device->id             = $device_uuid;
                $device->manufacturer   = $manufacturer;
                $device->brand          = $brand;
                $device->version        = $version;
                $device->model          = $model;
                $device->platform       = $platform;
                $device->ip             = Functions::getUserIP();
                $result                 = $deviceMapper->insert($device);
            }
            

            
            if($result) {
                return new JsonModel([
                    'success' => true,
                    'data' => [
                        'sync_id'   => $sync_id,
                    ]
                ]);
            } else {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_THERE_WAS_AN_ERROR',
                ]);
            }
            
        }
        
        return new JsonModel([
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ]);
        
    }
    
    
    
    public function signoutAction()
    {
        $rawdata = file_get_contents("php://input");
        error_log('URL = ' . $_SERVER['REQUEST_URI'] );
        error_log('$rawdata = ' . $rawdata );
       
        $request = $this->getRequest();
        
        if($request->isPost()) {
            
            
            $seed   = $this->config['leaderslinked.services.seed'];
            $min    = strtotime('-1 day');
            $max    = strtotime('+1 day');
            
            
            
            
            $device_uuid    = Functions::sanitizeFilterString($this->params()->fromPost('device_uuid', ''));
            $user_uuid      = Functions::sanitizeFilterString($this->params()->fromPost('user_uuid', ''));
            $rand           = Functions::sanitizeFilterString($this->params()->fromPost('rand', ''));
            $timestamp      = Functions::sanitizeFilterString($this->params()->fromPost('timestamp', ''));
            $password       = Functions::sanitizeFilterString($this->params()->fromPost('password', ''));
            $sync_id        = Functions::sanitizeFilterString($this->params()->fromPost('sync_id', ''));
            
            
            $ok = $device_uuid && strlen($device_uuid) == 32;
            $ok = $ok && $rand > 0;
            $ok = $ok && ($timestamp / 1000) >= $min;
            $ok = $ok && ($timestamp / 1000) <= $max;
            $ok = $ok && strlen($password) == 32;
            $ok = $ok && strlen($user_uuid)  == 36;
            $ok = $ok && $sync_id;
            
            if(!$ok) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_PARAMETERS_ARE_INVALID',
                ]);
            }
            
            $password_md5 = md5($device_uuid . '-' . $seed . '-' . $rand . '-' . $timestamp . '-' . $user_uuid );
            if($password != $password_md5) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_WEBSERVICE_PASSWORD',
                ]);
                
                
            }
            
            
            $deviceMapper = DeviceMapper::getInstance($this->adapter);
            $device = $deviceMapper->fetchOne($device_uuid);
            if(!$device) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_DEVICE_NOT_FOUND',
                ]);
            }
            
            $userMapper = UserMapper::getInstance($this->adapter);
            $user = $userMapper->fetchOneByUuid($user_uuid);
            if(!$user) {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_USER_NOT_FOUND',
                ]);
            }
            
            
            $syncLog = new SyncLog();
            $syncLog->data          = json_encode(['user' => $user_uuid]);
            $syncLog->type          = 'signin';
            $syncLog->device_uuid   = $device->id;
            $syncLog->ip            = Functions::getUserIP();
            
            $syncLogMapper = SyncLogMapper::getInstance($this->adapter);
            $syncLogMapper->insert($syncLog);
            
            $device->user_id        =
            $device->ip             = Functions::getUserIP();
            $result                 = $deviceMapper->update($device);
            
            if($result) {
                return new JsonModel([
                    'success' => true,
                    'data' => [
                        'sync_id' => $sync_id
                    ]
                ]);
            } else {
                return new JsonModel([
                    'success' => false,
                    'data' => 'ERROR_THERE_WAS_AN_ERROR',
                ]);
            }
            
        }
        
        return new JsonModel([
            'success' => false,
            'data' => 'ERROR_METHOD_NOT_ALLOWED'
        ]);
        
        
    }
    
    
    
    
    
    
}