Skip to content

Commit a26b879

Browse files
committed
ADO-313: Adds back message queue for event processing
1 parent 30bc79a commit a26b879

File tree

7 files changed

+116
-44
lines changed

7 files changed

+116
-44
lines changed

app/code/Meta/Conversion/Controller/Pixel/Tracker.php

Lines changed: 23 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@
66

77
use Magento\Framework\App\Action\HttpPostActionInterface;
88
use Magento\Framework\App\RequestInterface;
9-
use Meta\Conversion\Helper\ServerSideHelper;
10-
use Meta\Conversion\Helper\ServerEventFactory;
119
use Meta\BusinessExtension\Helper\FBEHelper;
1210
use Magento\Framework\Controller\Result\JsonFactory;
1311
use Magento\Framework\Controller\Result\Json;
12+
use Magento\Framework\MessageQueue\PublisherInterface;
13+
use Magento\Framework\Serialize\Serializer\Json as JsonSerializer;
14+
use FacebookAds\Object\ServerSide\Util;
1415

1516
class Tracker implements HttpPostActionInterface
1617
{
@@ -19,11 +20,6 @@ class Tracker implements HttpPostActionInterface
1920
*/
2021
private $request;
2122

22-
/**
23-
* @var ServerSideHelper
24-
*/
25-
private $serverSideHelper;
26-
2723
/**
2824
* @var FBEHelper
2925
*/
@@ -40,33 +36,36 @@ class Tracker implements HttpPostActionInterface
4036
private $jsonFactory;
4137

4238
/**
43-
* @var ServerEventFactory
39+
* @var PublisherInterface
4440
*/
45-
private $serverEventFactory;
41+
private $publisher;
42+
43+
/**
44+
* @var JsonSerializer
45+
*/
46+
private $jsonSerializer;
4647

4748
/**
48-
* Constructor
49-
*
5049
* @param RequestInterface $request
51-
* @param ServerSideHelper $serverSideHelper
5250
* @param FBEHelper $fbeHelper
5351
* @param JsonFactory $jsonFactory
54-
* @param ServerEventFactory $serverEventFactory
52+
* @param PublisherInterface $publisher
53+
* @param JsonSerializer $jsonSerializer
5554
* @param array $pixelEvents
5655
*/
5756
public function __construct(
5857
RequestInterface $request,
59-
ServerSideHelper $serverSideHelper,
6058
FBEHelper $fbeHelper,
6159
JsonFactory $jsonFactory,
62-
ServerEventFactory $serverEventFactory,
60+
PublisherInterface $publisher,
61+
JsonSerializer $jsonSerializer,
6362
array $pixelEvents = []
6463
) {
6564
$this->request = $request;
66-
$this->serverSideHelper = $serverSideHelper;
6765
$this->fbeHelper = $fbeHelper;
6866
$this->jsonFactory = $jsonFactory;
69-
$this->serverEventFactory = $serverEventFactory;
67+
$this->publisher = $publisher;
68+
$this->jsonSerializer = $jsonSerializer;
7069
$this->pixelEvents = $pixelEvents;
7170
}
7271

@@ -81,22 +80,17 @@ public function execute(): Json
8180
try {
8281
$params = $this->request->getParams();
8382
$eventName = $params['eventName'];
84-
$eventId = $params['eventId'];
8583

8684
if ($eventName) {
8785
$payload = $this->pixelEvents[$eventName]->getPayload($params);
86+
$payload['event_id'] = $params['eventId'];
87+
$payload['event_type'] = $this->pixelEvents[$eventName]->getEventType();
88+
$payload['request_uri'] = Util::getRequestUri();
89+
$payload['user_agent'] = Util::getHttpUserAgent();
90+
$payload['fbp'] = Util::getFbp();
91+
$payload['fbc'] = Util::getFbc();
8892
if (isset($payload)) {
89-
// Add source and pluginVersion in the payload as custom properties
90-
$payload['custom_properties'] = [];
91-
$payload['custom_properties']['source'] = $this->fbeHelper->getSource();
92-
$payload['custom_properties']['pluginVersion'] = $this->fbeHelper->getPluginVersion();
93-
$eventType = $this->pixelEvents[$eventName]->getEventType();
94-
$event = $this->serverEventFactory->createEvent($eventType, array_filter($payload), $eventId);
95-
if (isset($payload['userDataFromOrder'])) {
96-
$this->serverSideHelper->sendEvent($event, $payload['userDataFromOrder']);
97-
} else {
98-
$this->serverSideHelper->sendEvent($event);
99-
}
93+
$this->publisher->publish('send.conversion.event.to.meta', $this->jsonSerializer->serialize($payload));
10094
$response['success'] = true;
10195
}
10296
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Meta\Conversion\Model;
5+
6+
use Magento\Framework\Serialize\Serializer\Json as JsonSerializer;
7+
use Meta\BusinessExtension\Helper\FBEHelper;
8+
use Meta\Conversion\Helper\ServerEventFactory;
9+
use Meta\Conversion\Helper\ServerSideHelper;
10+
11+
class CapiEventHandler
12+
{
13+
14+
/**
15+
* @param ServerSideHelper $serverSideHelper
16+
* @param FBEHelper $fbeHelper
17+
* @param ServerEventFactory $serverEventFactory
18+
* @param JsonSerializer $jsonSerializer
19+
*/
20+
public function __construct(
21+
private readonly ServerSideHelper $serverSideHelper,
22+
private readonly FBEHelper $fbeHelper,
23+
private readonly ServerEventFactory $serverEventFactory,
24+
private readonly JsonSerializer $jsonSerializer
25+
) { }
26+
27+
public function process(string $message): void
28+
{
29+
try {
30+
$payload = $this->jsonSerializer->unserialize($message);
31+
$eventId = $payload['event_id'];
32+
$eventType = $payload['event_type'];
33+
// remove values from array
34+
unset($payload['event_id']);
35+
unset($payload['event_type']);
36+
37+
$additionalPayloadKeys = ['request_uri', 'user_agent', 'fbp', 'fbc'];
38+
$additionalPayloadData = array_intersect_key($payload, array_flip($additionalPayloadKeys));
39+
$payload = array_diff_key($payload, array_flip($additionalPayloadKeys));
40+
41+
// Add source and pluginVersion in the payload as custom properties
42+
$payload['custom_properties'] = [];
43+
$payload['custom_properties']['source'] = $this->fbeHelper->getSource();
44+
$payload['custom_properties']['pluginVersion'] = $this->fbeHelper->getPluginVersion();
45+
$event = $this->serverEventFactory->createEvent($eventType, array_filter($payload), $additionalPayloadData, $eventId);
46+
if (isset($payload['userDataFromOrder'])) {
47+
$this->serverSideHelper->sendEvent($event, $payload['userDataFromOrder']);
48+
} else {
49+
$this->serverSideHelper->sendEvent($event);
50+
}
51+
} catch (\Exception $e) {
52+
$this->fbeHelper->logException($e);
53+
}
54+
}
55+
}

app/code/Meta/Conversion/Model/CapiTracker.php

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,38 @@
33

44
namespace Meta\Conversion\Model;
55

6-
use Meta\BusinessExtension\Helper\FBEHelper;
7-
use Meta\Conversion\Helper\ServerEventFactory;
8-
use Meta\Conversion\Helper\ServerSideHelper;
6+
use FacebookAds\Object\ServerSide\Util;
97
use Magento\Customer\Model\Session as CustomerSession;
8+
use Magento\Framework\Serialize\Serializer\Json as JsonSerializer;
9+
use Magento\Framework\MessageQueue\PublisherInterface;
1010

1111
class CapiTracker
1212
{
1313

14+
/**
15+
* @param CustomerSession $customerSession
16+
* @param CapiEventIdHandler $capiEventIdHandler
17+
* @param JsonSerializer $jsonSerializer
18+
* @param PublisherInterface $publisher
19+
*/
1420
public function __construct(
15-
private readonly FBEHelper $fbeHelper,
16-
private readonly ServerSideHelper $serverSideHelper,
17-
private readonly ServerEventFactory $serverEventFactory,
1821
private readonly CustomerSession $customerSession,
1922
private readonly CapiEventIdHandler $capiEventIdHandler,
23+
private readonly JsonSerializer $jsonSerializer,
24+
private readonly PublisherInterface $publisher
2025
) { }
2126

2227
public function execute(array $payload, string $eventName, string $eventType, bool $useSessionForEventIds = false): void
2328
{
2429
if (isset($payload)) {
25-
$payload['custom_properties'] = [];
26-
$payload['custom_properties']['source'] = $this->fbeHelper->getSource();
27-
$payload['custom_properties']['pluginVersion'] = $this->fbeHelper->getPluginVersion();
2830
$eventId = $this->generateEventId($eventName, $useSessionForEventIds);
29-
$event = $this->serverEventFactory->createEvent($eventType, array_filter($payload), $eventId);
30-
if (isset($payload['userDataFromOrder'])) {
31-
$this->serverSideHelper->sendEvent($event, $payload['userDataFromOrder']);
32-
} else {
33-
$this->serverSideHelper->sendEvent($event);
34-
}
31+
$payload['event_id'] = $eventId;
32+
$payload['event_type'] = $eventType;
33+
$payload['request_uri'] = Util::getRequestUri();
34+
$payload['user_agent'] = Util::getHttpUserAgent();
35+
$payload['fbp'] = Util::getFbp();
36+
$payload['fbc'] = Util::getFbc();
37+
$this->publisher->publish('send.conversion.event.to.meta', $this->jsonSerializer->serialize($payload));
3538
}
3639
}
3740

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0"?>
2+
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Communication/etc/communication.xsd">
3+
<topic name="send.conversion.event.to.meta" request="string" />
4+
</config>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0"?>
2+
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/consumer.xsd">
3+
<consumer name="send.conversion.event.to.meta.consumer" queue="send_conversion_event_to_meta" connection="db" handler="Meta\Conversion\Model\CapiEventHandler::process" consumerInstance="Magento\Framework\MessageQueue\Consumer"/>
4+
</config>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0"?>
2+
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/publisher.xsd">
3+
<publisher topic="send.conversion.event.to.meta">
4+
<connection name="db" exchange="send-conversion-event-to-meta-exchange" disabled="false"/>
5+
</publisher>
6+
</config>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0"?>
2+
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework-message-queue:etc/topology.xsd">
3+
<exchange name="send-conversion-event-to-meta-exchange" type="topic" connection="db">
4+
<binding id="SendConversionEventToMeta" topic="send.conversion.event.to.meta" destinationType="queue" destination="send_conversion_event_to_meta"/>
5+
</exchange>
6+
</config>

0 commit comments

Comments
 (0)