<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\HttpKernel\KernelInterface;
use App\Services\CsvResponse;
use App\Services\OnTraceServerSync;
use App\Entity\ProductType;
use App\Services\Utils;
use App\Entity\Parameter;
use App\Entity\Product;
use App\Entity\Placement;
/**
* SOAP controller.
*
* @Route("/")
*/
class CURLController extends AbstractController
{
/**
* @Route("/url_interface.php", name="curl", methods={"GET","POST"})
*/
public function urlInterfaceAction(Request $request, KernelInterface $kernel, OnTraceServerSync $sync)
{
try {
$container=$kernel->getContainer();
$logger=$container->get('monolog.logger.onTraceEvents');
$internal_api=$container->get('on_trace_internal_api');
$api=$container->get('on_trace_api');
$filename='file.csv';
$debugTimes='';
$startTime=microtime(true);
$class=$request->get('class');
$internal_api->logEventIn($class);
$str='';
foreach($request->query->all() as $key=>$o) $str=$str.$key.'='.$o.'&';
foreach($request->request->all() as $key=>$o) if (is_string($key) && is_string($o)) $str=$str.$key.'='.$o.'&';
//$logger->info(' '.$str);
$isJson=false;
$doLog=true;
if (array_search($class,array('add_inout','add_group','add_queue','add_device','add_segment','isalive','monitor'))!==false &&
Parameter::get($this->getDoctrine()->getConnection(), Parameter::STOP_EVENTS)) {
$result='ERROR STOPPED EVENTS';
} else {
try {
switch ($class) {
case 'add_inout':
$data=explode("\n",$request->getContent());
if (count($data)>1) { //multiple add_inout
$type=array(); $date=array(); $height=array(); $line=array(); $idEvents=array();
foreach($data as $l) {
$params=array();
parse_str($l,$params);
$type[]=$params['type'];
$date[]=$params['date'];
$height[]=$params['height'];
$line[]=$params['line'];
$idEvents[]=array_key_exists('id',$params)?$params['id']:null;
}
$result=$internal_api->add_inout($request->get('prod_ref'),$idEvents, $type,
$date,$height,$line);
} else {
$result=$internal_api->add_inout($request->get('prod_ref'), $request->get('id'),
$request->get('type'),$request->get('date'),$request->get('height'),
$request->get('line'));
}
if (is_array($result)) {
$debugTimes=$result['time'];
$result=$result['result'];
}
break;
case 'add_group':
//class=add_group&members=3&child=1date=20100330132859&prod_ref=XXXX
$data=explode("\n",$request->getContent());
if (count($data)>1) { //multiple add_inout
$line=array(); $members=array(); $child=array(); $date=array();
foreach($data as $l) {
$params=array();
parse_str($l,$params);
$line[]=$params['line'];
$members[]=$params['members'];
$child[]=$params['child'];
$date[]=$params['date'];
}
$result=$internal_api->add_group($request->get('prod_ref'),$line, $members, $child,$date);
} else {
$result=$internal_api->add_group($request->get('prod_ref'), $request->get('line'),$request->get('members'),
$request->get('child'),$request->get('date'));
}
if (is_array($result)) {
$debugTimes=$result['time'];
$result=$result['result'];
}
break;
case 'add_queue':
$data=explode("\n",$request->getContent());
if (count($data)>1) { //multiple add_inout
$type=array(); $subType=array(); $zone=array(); $idEvents=array(); $qtime=array(); $date=array(); $height=array(); $total=array();
foreach($data as $l) {
$params=array();
parse_str($l,$params);
$type[]=$params['type'];
$subType[]=$params['sub_type'];
$zone[]=$params['zone'];
$idEvents[]=array_key_exists('id',$params)?$params['id']:null;
$qtime[]=$params['qtime'];
$date[]=$params['date'];
$height[]=$params['height'];
$total[]=$params['total'];
}
$result=$internal_api->add_queue($request->get('prod_ref'), $idEvents, $type, $subType, $zone, $qtime, $date, $height, $total);
} else {
$result=$internal_api->add_queue($request->get('prod_ref'), $request->get('id'),
$request->get('type'), $request->get('sub_type'),$request->get('zone'),
$request->get('qtime'),$request->get('date'), $request->get('height'), $request->get('total'));
}
if (is_array($result)) {
$debugTimes=$result['time'];
$result=$result['result'];
}
break;
case 'add_device':
//return new Response('ERROR server busy');
$data=explode("\n",$request->getContent());
if (count($data)>1) { //multiple add_device
$dev_id=array(); $model=array(); $first_t=array(); $last_t=array(); $status=array();
foreach($data as $line) {
$params=array();
parse_str($line,$params);
$dev_id[]=$params['dev_id'];
$model[]=$params['model'];
$first_t[]=$params['first_t'];
$last_t[]=$params['last_t'];
$status[]=$params['status'];
}
$result=$internal_api->add_device($request->get('prod_ref'),$dev_id,
$model,$first_t,$last_t,$status,null,null,null,null);
} else {
$result=$internal_api->add_device($request->get('prod_ref'),$request->get('dev_id'),
$request->get('model'),$request->get('first_t'),$request->get('last_t'),
$request->get('status'),$request->get('mq'),$request->get('sq'),
$request->get('mp'),$request->get('sq'));
}
break;
case 'add_segment':
$data=explode("\n",$request->getContent());
if (count($data)>1) { //multiple add_device
$age=array(); $gender=array(); $expression=array(); $duration=array(); $distance=array(); $date=array(); $type=array();
foreach($data as $line) {
$params=array();
parse_str($line,$params);
$age[]=$params['age'];
$gender[]=$params['gender'];
$expression[]=$params['expression'];
$duration[]=$params['duration'];
$distance[]=$params['distance'];
$date[]=$params['date'];
$type[]=$params['type'];
}
$result=$internal_api->add_segment($request->get('prod_ref'),$age, $gender, $expression, $duration, $distance, $date, $type);
} else {
$result=$internal_api->add_segment($request->get('prod_ref'),$request->get('age'),
$request->get('gender'),$request->get('expression'),$request->get('duration'),
$request->get('distance'),$request->get('date'),$request->get('type'));
}
break;
case 'add_health':
//class=add_health&prod_ref=XXXX&co2=500&temp=25.6&hr=58&date=20210620195959
$data=explode("\n",$request->getContent());
if (count($data)>1) { //multiple add_device
$co2=array(); $temp=array(); $hr=array(); $date=array();
foreach($data as $line) {
$params=array();
parse_str($line,$params);
$co2[]=$params['co2'];
$temp[]=$params['temp'];
$hr[]=$params['hr'];
$date[]=$params['date'];
}
$result=$internal_api->add_health($request->get('prod_ref'),$co2, $temp, $hr, $date);
} else {
$result=$internal_api->add_health($request->get('prod_ref'),$request->get('co2'),
$request->get('temp'),$request->get('hr'),$request->get('date'));
}
break;
case 'get_access':
$result=$internal_api->get_access($request->get('idPlacement'));
return $this->addHeaders(new Response($result));
break;
case 'get_timetable':
$result=$internal_api->get_timetable($request->get('prod_ref'),$request->get('date')); break;
case 'get_calendar':
$result=$internal_api->get_calendar($request->get('prod_ref')); break;
case 'isalive':
$result=$internal_api->isalive($request->get('prod_ref'),$request->get('type'),$request->get('local_time')); break;
case 'monitor':
$result=$internal_api->monitor($request->get('prod_ref'),$request->get('disk'),
$request->get('temp'),$request->get('rb'),$request->get('varN'),
$request->get('status'),$request->get('lastboot'),$request->get('ip'),
$request->get('rtp'),
$request->getMethod()=='GET'?$request->getQueryString():$request->getContent());
break;
case 'select':
$doLog=false;
if ($request->getMethod()=='GET') {
$result=$api->select(
$request->get('login'),$request->get('password'),$request->get('ticket'),
$request->get('productType'),
$request->get('dataType'),
$request->get('dateIn'),$request->get('dateEnd'),$request->get('freq'),
$request->get('idType'),$request->get('ids'),
$request->get('innerIdOperation'),
$request->get('idsOperation'),
$request->get('projectOperation'));
} else {
$params = array();
$content = $request->getContent();
$login=$request->get('login');
$ticket=$request->get('ticket');
$password=$request->get('password');
if (!empty($content))
{
$params = json_decode($content); // 2nd param to get as array
$result=$api->selectMulti($login, $password, $ticket, $params);
}
}
$isJson=true;
break;
case 'selectRealTime':
$doLog=false;
$result=$api->selectRealTime(
$request->get('login'),$request->get('password'),$request->get('ticket'),
$request->get('idType'),$request->get('ids'),
$request->get('idsOperation'));
$isJson=true;
break;
case 'selectAlerts':
$doLog=false;
$result=$api->selectAlerts(
$request->get('login'),$request->get('password'),$request->get('ticket'),
$request->get('idType'),$request->get('ids'));
$isJson=true;
break;
case 'selectEntity':
$doLog=false;
$result=$api->selectEntity(
$request->get('login'),$request->get('password'),$request->get('ticket'),
$request->get('idType'),$request->get('ids'),
$request->get('dataType'));
$isJson=true;
break;
case 'selectUserEntities':
$doLog=false;
$result=$api->selectUserEntities(
$request->get('login'),$request->get('password'),$request->get('ticket'),
$request->get('idType'),$request->get('productType'));
$isJson=true;
break;
case 'selectJson':
if ($request->getMethod()==='POST') {
$content = $request->getContent();
if (!empty($content))
{
$params = json_decode($content, true); //to array
$result=$api->selectJson($params);
$isJson=true;
}
}
break;
case 'selectUserThresholds':
$doLog=false;
$result=$api->selectUserThresholds($request->get('login'),$request->get('password'), $request->get('ticket'));
$isJson=true;
break;
case 'sync':
if ($request->getMethod()==='POST') {
$content = $request->getContent();
if (!empty($content))
{
$container->get('monolog.logger.onTraceSync')->info('url_interface/sync=>ip:'.$request->getClientIp().'-->'.$content);
$params = json_decode($content);
switch($params->op) {
case 'serverToMasterSync':
$sync=$container->get('on_trace_server_to_master_sync');
$result=$sync->import($request->getClientIp(), $params);
$isJson=true;
break;
case 'transfer':
$sync=$container->get('on_trace_transfer_sync');
$result=$sync->import($request->getClientIp(), $params);
break;
case 'copyProduct':
$sync=$container->get('on_trace_transfer_sync');
$result=$sync->importProduct($request->getClientIp(), $params);
break;
case 'tansferNotify':
$sync=$container->get('on_trace_transfer_sync');
$result=$sync->notify($request->getClientIp(), $params);
break;
case 'ping':
$result='OK';
break;
case 'update':
case 'updateFields':
case 'canDelete':
case 'delete':
case 'markDeleted':
case '':
$sync=$container->get('on_trace_master_to_server_sync');
$result=$sync->sync(
$request->getClientIp(), $request->getSchemeAndHttpHost(),
$params->entity, $params->op, $params->id, $params->values);
$isJson=true;
break;
case 'doBackup':
case 'getBackupProgress':
$isJson=true;
$sync=$container->get('on_trace_backup_sync');
$result=$sync->dispatch($request->getClientIp(),
$request->getHttpHost(),
$params->op, $params->id);
break;
case 'initSlaveServer':
$sync=$container->get('on_trace_discover_sync');
$sync->initSlaveServer($request->getClientIp());
$result='OK';
break;
case 'addServerToGlobalMaster':
$sync=$container->get('on_trace_discover_sync');
$result=$sync->addServerToGlobalMaster($request->getClientIp(), $params);
$isJson=true;
break;
case 'addMaterializedData':
$sync=$container->get('on_trace_global_sync');
$result=$sync->addMaterializedData($request->getClientIp(), $params->table, $params->id, $params->data);
$isJson=true;
break;
default:
$result="unkown op=[$op]";
}
} else $result='sync without parameters';
} /*else {
//$result='sync must use POST';
$sync=$container->get('on_trace_master_to_server_sync');
$result=$sync->sync(
$request->getClientIp(), $request->getSchemeAndHttpHost(),
$request->get('entity'), $request->get('op'), $request->get('id'), $request->get('values'));
}*/
break;
case 'syncAppGestio':
$entity = null;
$trusted_ip = '91.142.215.75';
if ($request->getMethod()==='POST' && $request->getClientIp()===$trusted_ip) {
switch ($request->get('type')) {
case 'branch':
$entity = $internal_api->appGestio_branch(
$request->get('idBranch'),
$request->get('branch_name')
);
break;
case 'client':
$entity = $internal_api->appGestio_client(
$request->get('idClient'),
$request->get('client_name'),
$request->get('idBranch')
);
break;
case 'sale':
$entity = $internal_api->appGestio_sale(
$request->get('prod_ref'),
$request->get('idClient')
);
break;
case 'license':
$entity = $internal_api->appGestio_license(
$request->get('prod_ref'),
$request->get('op')
);
break;
case 'generate_products':
$internal_api->appGestio_generate_products(
$request->get('quantity')
);
break;
default: break;
}
$sync=$container->get('on_trace_master_to_server_sync');
$sync->prepare($entity);
$r=$sync->update($entity);
$result=$entity->getId();
}
break;
case 'syncMonitoring':
if ($request->getMethod()==='POST') {
$content = $request->getContent();
if (!empty($content))
{
$params = json_decode($content);
$result=$sync->syncMonitoring($request->getClientIp(), $params->idProduct, $params->status);
} else $result='syncMonitoring without parameters';
}
break;
case 'syncSelectStatus':
if ($request->getMethod()==='POST') {
$content = $request->getContent();
if (!empty($content))
{
$params = json_decode($content);
$result=$sync->selectStatus($request->getClientIp(), $params->idProducts);
} else $result='syncSelectStatus without parameters';
}
$isJson=true;
break;
case 'docEfficency':
if ($request->getMethod()==='POST') {
$doc='';
$format=$request->get('format');
$content = $request->get('data');
if (!empty($content))
{
$data = json_decode($content);
$eff=$container->get('on_trace_efficency');
if ($format=='pdf') $doc= $eff->getPdf($data, $format);
else $doc= $eff->getCsv($data, $format);
};
return new Response($doc, 200, array(
'Content-Type' => $format=='pdf'?'application/pdf':'text/csv',
'Content-Disposition' => 'attachment; filename="'.$data->file.'.'.$format.'"',
));
}
break;
default: $result='Unknown command '.$class;
}
} catch (AccessDeniedHttpException $e) {
throw $e;
}catch (\Exception $e) {
$result=$e->getMessage().' '.$e->getTraceAsString();
$logger->info(' ERROR internal: '.$result);
return new Response('ERROR internal: '.$result);
}
}
$elapsedTime=round((microtime(true)-$startTime)*1000);
if ($doLog) {
$logger->info('Result(IP '.$request->getClientIp().'): '.$str.'-->'.($isJson?'*':$result). '['.$elapsedTime.'ms] ['.$debugTimes.']');
}
$internal_api->logEventOut($class, $elapsedTime);
if ($isJson) {
if ($request->get('format')=='CSV' || $request->get('format')=='CSV2') {
$filename='';
$aIds=explode(',',$request->get('ids'));
if ($request->get('idType')=='placement' && count($aIds)==1 && $aIds[0]) {
$placement=$this->getDoctrine()->getRepository(Placement::class)->find($request->get('ids'));
$filename=$placement->getName().'-';
} else {
$filename='T-';
}
$dateIn=$request->get('dateIn');
$dateEnd=$request->get('dateEnd');
if ($dateIn==$dateEnd) {
$filename.=$dateIn;
} else {
$filename.=$dateIn.'-'.$dateEnd;
}
return new CsvResponse($result,$filename.'.csv',$request->get('format'));
} else return $this->addHeaders(new JsonResponse($result));
} else return new Response($result);
} catch (AccessDeniedHttpException $e) {
throw $e;
} catch( \Exception $e) {
$result=$e->getMessage().' '.$e->getTraceAsString();
error_log(' ERROR internal: '.$result);
return new Response('ERROR internal: '.$result);
}
}
function addHeaders($response) {
$response->headers->set('Access-Control-Allow-Origin', '*'); //allow CORS Cross Origin
return $response;
}
/**
* @Route("/axpeco", name="axpeco", methods={"GET","POST"})
*/
public function axpecoAction(Request $request, KernelInterface $kernel)
{
$container=$kernel->getContainer();
$logger=$container->get('monolog.logger.onTraceEvents');
$internal_api=$container->get('on_trace_internal_api');
$em = $this->getDoctrine()->getManager();
$str='';
foreach($request->query->all() as $key=>$o) $str=$str.$key.'='.$o.'&';
foreach($request->request->all() as $key=>$o) if (is_string($key) && is_string($o)) $str=$str.$key.'='.$o.'&';
$logger->info('AXPECO -->'.$str);
$id=$request->get('id');
$product=$em->getRepository(Product::class)->findOneBy(array('prodRef'=>$id));
if ($product) {
$placement=$product->getPlacement();
$productFunction=$product->getProductFunction(ProductType::INOUT);
if ($productFunction && $placement) {
if ($request->getMethod()=='GET') {
$date=$productFunction->getLastIsAlive()->format('c');
return new JsonResponse($date);
} else if ($request->getMethod()=='POST') {
$jsonData=$request->get('data');
$data=json_decode($jsonData);
//busquem l'Ășltim bloc de 5minuts amb dades (in!=0 o out!=0)
//per descartar-lo, ja que a vegades els comptadors envien
//dades temporals
$lastData=null;
foreach($data as $row) {
$date=$row->date;
$ins=$row->in;
$outs=$row->out;
$pos=strpos($date,'+');
if ($pos>0) {
$date=substr($date,0,$pos);
}
$oDate=\DateTime::createFromFormat('Y-m-d?H:i:s', $date);
if ($ins>0 || $outs>0) $lastData=$oDate;
}
$txt='';
$lastIsAlive=$productFunction->getLastIsAlive();
foreach($data as $row) {
$date=$row->date;
$ins=$row->in;
$outs=$row->out;
$pos=strpos($date,'+');
if ($pos>0) {
$date=substr($date,0,$pos);
}
$oDate=\DateTime::createFromFormat('Y-m-d?H:i:s', $date);
if ($oDate>$lastIsAlive && $lastData && $oDate<$lastData && ($ins>0 || $outs>0) ) {
$date=Utils::DateTimeToYYYYMMDDhhmmss($oDate);
$txt.=$date.'--'.$ins.'--'.$outs."\r\n";
$aType=array(); $aDate=array(); $aHeight=array(); $aLine=array();
//IN's
for($i=0;$i<$ins;$i++) {
$aType[]='IN';
$aDate[]=$date;
$aHeight[]=150;
$aLine[]=0;
}
//OUT's
for($i=0;$i<$outs;$i++) {
$aType[]='OUT';
$aDate[]=$date;
$aHeight[]=150;
$aLine[]=0;
}
$result=$internal_api->add_inout($id,null,$aType,
$aDate,$aHeight,$aLine);
$productFunction->setLastIsAlive($oDate);
}
}
$em->persist($productFunction);
$em->flush();
$logger->info('AXPECO -->'.$txt);
return new JsonResponse(array('result'=>'OK'));
}
}
}
return new JsonResponse('ERROR');
}
}
?>