Helper/ServerEventFactory.php (112 lines of code) (raw):
<?php
/**
* Copyright (c) Meta Platforms, Inc. and affiliates. All Rights Reserved
*/
namespace Facebook\BusinessExtension\Helper;
use FacebookAds\Object\ServerSide\Event;
use FacebookAds\Object\ServerSide\EventRequest;
use FacebookAds\Object\ServerSide\UserData;
use FacebookAds\Object\ServerSide\CustomData;
use FacebookAds\Object\ServerSide\Content;
use FacebookAds\Object\ServerSide\Util;
/**
* Factory class for generating new ServerSideAPI events with default parameters.
*/
class ServerEventFactory
{
/**
* @param $eventName
* @param null $eventId
* @return mixed
*/
public static function newEvent($eventName, $eventId = null)
{
// Capture default user-data parameters passed down from the client browser.
$userData = (new UserData())
->setClientIpAddress(self::getIpAddress())
->setClientUserAgent(Util::getHttpUserAgent())
->setFbp(Util::getFbp())
->setFbc(Util::getFbc());
$event = (new Event())
->setEventName($eventName)
->setEventTime(time())
->setEventSourceUrl(Util::getRequestUri())
->setActionSource('website')
->setUserData($userData)
->setCustomData(new CustomData());
if ($eventId == null) {
$event->setEventId(EventIdGenerator::guidv4());
} else {
$event->setEventId($eventId);
}
return $event;
}
/**
* Get the IP address from the $_SERVER variable
*
* @return string|null
*/
private static function getIpAddress()
{
$HEADERS_TO_SCAN = [
'HTTP_CLIENT_IP',
'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED',
'HTTP_X_CLUSTER_CLIENT_IP',
'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED',
'REMOTE_ADDR'
];
foreach ($HEADERS_TO_SCAN as $header) {
if (array_key_exists($header, $_SERVER)) {
$ipList = explode(',', $_SERVER[$header]);
foreach ($ipList as $ip) {
$trimmedIp = trim($ip);
if (self::isValidIpAddress($trimmedIp)) {
return $trimmedIp;
}
}
}
}
return null;
}
/**
* Check if the given ip address is valid
*
* @param $ipAddress
* @return mixed
*/
private static function isValidIpAddress($ipAddress)
{
return filter_var(
$ipAddress,
FILTER_VALIDATE_IP,
FILTER_FLAG_IPV4
| FILTER_FLAG_IPV6
| FILTER_FLAG_NO_PRIV_RANGE
| FILTER_FLAG_NO_RES_RANGE
);
}
/**
* Fill customData member of $event with array $data
*
* @param $event
* @param $data
* @return mixed
*/
private static function addCustomData($event, $data)
{
$custom_data = $event->getCustomData();
if (!empty($data['currency'])) {
$custom_data->setCurrency($data['currency']);
}
if (!empty($data['value'])) {
$custom_data->setValue($data['value']);
}
if (!empty($data['content_ids'])) {
$custom_data->setContentIds($data['content_ids']);
}
if (!empty($data['content_type'])) {
$custom_data->setContentType($data['content_type']);
}
if (!empty($data['content_name'])) {
$custom_data->setContentName($data['content_name']);
}
if (!empty($data['content_category'])) {
$custom_data->setContentCategory($data['content_category']);
}
if (!empty($data['search_string'])) {
$custom_data->setSearchString($data['search_string']);
}
if (!empty($data['num_items'])) {
$custom_data->setNumItems($data['num_items']);
}
if (!empty($data['contents'])) {
$contents = [];
foreach ($data['contents'] as $content) {
$contents[] = new Content($content);
}
$custom_data->setContents($contents);
}
if (!empty($data['order_id'])) {
$custom_data->setOrderId($data['order_id']);
}
return $event;
}
/**
* Create a server side event
*
* @param $eventName
* @param $data
* @param null $eventId
* @return mixed
*/
public static function createEvent($eventName, $data, $eventId = null)
{
$event = self::newEvent($eventName, $eventId);
$event = self::addCustomData($event, $data);
return $event;
}
}