src/Manager/SeedManager.php line 45

Open in your IDE?
  1. <?php
  2. namespace App\Manager;
  3. use App\Entity\Seed;
  4. use App\Entity\Tracker;
  5. use App\Enum\Product;
  6. use App\Enum\Home;
  7. use App\Enum\Source;
  8. use Symfony\Component\HttpFoundation\RequestStack;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  11. use Doctrine\Persistence\ManagerRegistry;
  12. use Doctrine\Persistence\ObjectManager;
  13. use Psr\Log\LoggerInterface;
  14. class SeedManager
  15. {
  16. private Request $request;
  17. private SessionInterface $session;
  18. private ManagerRegistry $managerRegistry;
  19. private ObjectManager $doctrineObjectManager;
  20. private Seed $seed;
  21. private LoggerInterface $logger;
  22. public function __construct(RequestStack $requestStack, ManagerRegistry $managerRegistry, LoggerInterface $logger)
  23. {
  24. if (!$request = $requestStack->getCurrentRequest()) {
  25. throw new \Exception('++++>No request defined');
  26. }
  27. $this->request = $request;
  28. $this->session = $request->getSession();
  29. $this->managerRegistry = $managerRegistry;
  30. $this->doctrineObjectManager = $managerRegistry->getManager();
  31. $this->seed = new Seed(Product::none, Home::undifined, Source::none, '', '', '', '');
  32. $this->logger = $logger;
  33. }
  34. public function save(Product $eProduct, Home $eHome, string $sTemplate, bool $bOriginToken = false): Seed
  35. {
  36. $bRefreshSeedInSession = false;
  37. /** @var int|null $iSeedId */
  38. if (! $iSeedId = (int)$this->session->get('iSeedId')) {
  39. $this->setCurrentSeedDetails($eProduct, $eHome, $bOriginToken);
  40. $this->doctrineObjectManager->persist($this->seed);
  41. } else {
  42. $seed = $this->doctrineObjectManager->getRepository(Seed::class)->find($iSeedId);
  43. if (! $seed) {//marginal case when iSeedId in session but not in db
  44. $this->logger->error('---->SeedManager : not found iSeedId : ' . $iSeedId);
  45. $this->setCurrentSeedDetails($eProduct, $eHome, $bOriginToken);
  46. $this->doctrineObjectManager->persist($this->seed);
  47. $bRefreshSeedInSession = true;
  48. } else {
  49. $this->seed = $seed;
  50. }
  51. }
  52. $tracker = new Tracker($this->seed, $sTemplate, (string)$this->request->headers->get('referer'));
  53. $this->doctrineObjectManager->persist($tracker);
  54. $this->doctrineObjectManager->flush();
  55. //PHP Session
  56. if (! $iSeedId) {
  57. $this->session->set('iSeedId', $this->seed->getId());
  58. } elseif ($bRefreshSeedInSession) {
  59. $this->session->set('iSeedId', $this->seed->getId());
  60. }
  61. $this->session->set('eProduct', $eProduct);
  62. return $this->seed;
  63. }
  64. public function getManagerRegistry(): ManagerRegistry
  65. {
  66. return $this->managerRegistry;
  67. }
  68. private function getOriginToken(): string
  69. {
  70. $aTokenSource = ['gclid', 'fbclid', 'msclkid'];
  71. //on [] current return false
  72. return (string)current(array_intersect_key($this->request->query->all(), array_flip($aTokenSource)));
  73. }
  74. private function setCurrentSeedDetails(Product $eProduct, Home $eHome, bool $bOriginToken): void
  75. {
  76. $this->seed->setEProduct($eProduct);
  77. $this->seed->setEHome($eHome);
  78. $this->seed->setSPhpSession($this->session->getId());
  79. $this->seed->setSIp($this->request->headers->get('x-real-ip') ?? $this->request->getClientIp() ?? 'unknown');
  80. $this->seed->setSUserAgent((string)$this->request->headers->get('User-Agent'));
  81. $this->seed->setSHeader(serialize($this->request->headers));
  82. /**
  83. * @psalm-suppress InternalMethod
  84. */
  85. if ($this->request->get('sSource') !== null) {
  86. $sSourceValue = (string) $this->request->get('sSource');
  87. if (!Source::tryFrom($sSourceValue)) {
  88. $this->logger->warning('Invalid sSource value: ' . $sSourceValue . '. Setting to "unknown".');
  89. $this->seed->setESource(Source::unknown);
  90. } else {
  91. $this->seed->setESource(Source::from($sSourceValue));
  92. }
  93. }
  94. /**
  95. * @psalm-suppress InternalMethod
  96. */
  97. if ($this->request->get('sOrigin') !== null) {
  98. $this->seed->setSOrigin((string) $this->request->get('sOrigin'));
  99. }
  100. /**
  101. * @psalm-suppress InternalMethod
  102. */
  103. if ($this->request->get('sModel') !== null) {
  104. $this->seed->setSModel((string) $this->request->get('sModel'));
  105. }
  106. /**
  107. * @psalm-suppress InternalMethod
  108. */
  109. if ($this->request->get('sVersion') !== null) {
  110. $this->seed->setSVersion((string) $this->request->get('sVersion'));
  111. }
  112. /**
  113. * @psalm-suppress InternalMethod
  114. */
  115. if ($this->request->get('sObs') !== null) {
  116. $this->seed->setSObs((string) $this->request->get('sObs'));
  117. }
  118. if ($bOriginToken && $sToken = $this->getOriginToken()) {
  119. $this->seed->setSOriginToken($sToken);
  120. }
  121. }
  122. }