<?php
namespace App\Controller\REST;
use App\Entity\ApiLogs;
use App\Service\RESTApiService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
/**
* Class RestController
* @package App\Controller\REST
* @Route("/api")
*/
class RestController extends AbstractController
{
/**
* @Route(
* "/{ressource}/{id}",
* name="api_entry_point",
* methods={ "GET", "POST", "DELETE", "PUT" }
* )
*/
public function entryPointAction(Request $request, RESTApiService $apiService, $ressource, $id = null): Response
{
$log = new ApiLogs();
$log->setDateTime(new \DateTime());
$log->setUrl($request->getRequestUri());
$log->setMethod($request->getMethod());
$log->setRequestIp($request->getClientIp());
$log->setApiKey($request->headers->get('X-AUTH-TOKEN'));
$log->setRessource($ressource);
$log->setRessourceId($id);
$log->setParams(array('get'=>$request->query->all(),'post'=>$request->request->all()));
$log->setHasException(false);
try
{
return $apiService->handleApiRequest($request,$ressource,$id);
}
catch (\Exception $e)
{
$log->setHasException(true);
$log->setExceptionClass(get_class($e));
$log->setExceptionMessage($e->getMessage());
$log->setExceptionCode($e->getCode());
return new JsonResponse(array('error'=>["message" => $e->getMessage(), "code" => $e->getCode(), "trace" => $e->getTrace()]), '500');
}
finally
{
$log->setAuthenticated(null != $this->getUser());
$log->setUser($this->getUser());
$this->getDoctrine()->getManager()->persist($log);
$this->getDoctrine()->getManager()->flush();
}
}
}