Files
kupshop/bundles/KupShop/KafkaBundle/DBChanges/Util/DBMessageFactory.php
2025-08-02 16:30:27 +02:00

50 lines
1.5 KiB
PHP

<?php
declare(strict_types=1);
namespace KupShop\KafkaBundle\DBChanges\Util;
use KupShop\KafkaBundle\DBChanges\MessageTypes\DBGenericMessage;
use KupShop\KafkaBundle\DBChanges\MessageTypes\DBLegacyMessage;
use KupShop\KafkaBundle\Exception\KafkaInvalidMessageException;
use RdKafka\Message;
use Symfony\Component\DependencyInjection\Attribute\TaggedLocator;
use Symfony\Component\DependencyInjection\ServiceLocator;
class DBMessageFactory
{
public function __construct(
/** @param ServiceLocator<DBGenericMessage> $serviceLocator */
#[TaggedLocator(tag: 'kupshop.kafka.dbmessages', defaultIndexMethod: 'getClassTableName')] private ServiceLocator $serviceLocator,
) {
}
/**
* @param $rawMessage array
*
* @throws KafkaInvalidMessageException
*/
public function create(Message $rawMessage): DBGenericMessage
{
$body = json_decode($rawMessage->payload, true) ?? [];
if (!isset($body['cdc'])) {
// for messages in legacy format
$tableName = DBLegacyMessage::$tableName;
} else {
$tableName = $body['source']['table'] ?? '';
if (!$this->serviceLocator->has($tableName)) {
$tableName = DBGenericMessage::$tableName;
}
}
return $this->serviceLocator->get($tableName)->setMessage(
$rawMessage->offset,
(int) floor($rawMessage->timestamp / 1000),
$rawMessage->headers,
$body
);
}
}