first commit
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
<?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
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user