<?php
namespace App\Log\Service;
use App\Log\Entity\Request;
use App\Security\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class RequestFactory {
/**
* @var EntityManagerInterface
*/
protected EntityManagerInterface $entityManager;
/**
* @var TokenStorageInterface
*/
protected TokenStorageInterface $tokenStorage;
public function __construct(EntityManagerInterface $logEntityManager, TokenStorageInterface $tokenStorage)
{
$this->entityManager = $logEntityManager;
$this->tokenStorage = $tokenStorage;
}
/**]
* @param string $url
* @param array $requestData
* @param string|null $ip
* @return Request
*/
public function create(string $url, array $requestData, string $ip = null): Request
{
$request = new Request();
$request
->setUrl($url)
->setRequestData($requestData)
->setIp($ip)
;
$user = $this->tokenStorage->getToken() ? $this->tokenStorage->getToken()->getUser() : null;
if ($user instanceof User && $this->tokenStorage->getToken()){
$request->setUser($this->entityManager->getRepository(User::class)->find($user->getId()));
}
$this->entityManager->persist($request);
$this->entityManager->flush($request);
return $request;
}
/**
* @param Request $request
* @param $responseData
* @param $statusCode
* @param bool $complete
*/
public function update(Request $request, $responseData, $statusCode, bool $complete = true): void
{
if(!$this->entityManager->isOpen()) {
// if entity manager is closed, do not try to update and send another exception
return;
}
$request
->setResponseData($responseData ?: [])
->setStatusCode($statusCode)
->setFinishAt()
->setComplete($complete);
$this->entityManager->persist($request);
$this->entityManager->flush($request);
}
/**
* @param Request $request
* @param $requestData
*/
public function updateRequestData(Request $request, $requestData): void
{
if(!$this->entityManager->isOpen()) {
// if entity manager is closed, do not try to update and send another exception
return;
}
$request
->setRequestData($requestData);
$this->entityManager->persist($request);
$this->entityManager->flush($request);
}
}