Proyectos de Subversion LeadersLinked - Services

Rev

Rev 319 | Autoría | Comparar con el anterior | Ultima modificación | Ver Log |

<?php
declare(strict_types=1);

namespace LeadersLinked\Controller;

use Laminas\View\Model\JsonModel;
use Laminas\Mvc\Controller\AbstractActionController;
use LeadersLinked\Mapper\UserMapper;
use LeadersLinked\Mapper\DeviceMapper;
use LeadersLinked\Model\Device;
use LeadersLinked\Mapper\DeviceHistoryMapper;
use LeadersLinked\Model\DeviceHistory;
use LeadersLinked\Mapper\SyncLogMapper;
use LeadersLinked\Model\SyncLog;

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