50 lines
1.5 KiB
PHP
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
|
|
);
|
|
}
|
|
}
|