namespace Ecotone\SqsDemo\Configuration;
#[ModuleAnnotation]
final class SqsMessagePublisherModule extends NoExternalConfigurationModule implements AnnotationModule
{
public static function create(AnnotationFinder $annotationRegistrationService, InterfaceToCallRegistry $interfaceToCallRegistry): static
{
return new self();
}
public function prepare(Configuration $configuration, array $extensionObjects, ModuleReferenceSearchService $moduleReferenceSearchService, InterfaceToCallRegistry $interfaceToCallRegistry): void
{
// 1. Extension Object Resolver
$serviceConfiguration = ExtensionObjectResolver::resolveUnique(ServiceConfiguration::class, $extensionObjects, ServiceConfiguration::createWithDefaults());
/** @var SqsMessagePublisherConfiguration $messagePublisher */
foreach (ExtensionObjectResolver::resolve(SqsMessagePublisherConfiguration::class, $extensionObjects) as $messagePublisher) {
$mediaType = $messagePublisher->getOutputDefaultConversionMediaType() ?: $serviceConfiguration->getDefaultSerializationMediaType();
// 2. Registering Messaging Gateways
$configuration
->registerGatewayBuilder(
GatewayProxyBuilder::create($messagePublisher->getReferenceName(), MessagePublisher::class, 'send', $messagePublisher->getReferenceName())
->withParameterConverters([
GatewayPayloadBuilder::create('data'),
GatewayHeaderBuilder::create('sourceMediaType', MessageHeaders::CONTENT_TYPE),
])
)
->registerGatewayBuilder(
GatewayProxyBuilder::create($messagePublisher->getReferenceName(), MessagePublisher::class, 'sendWithMetadata', $messagePublisher->getReferenceName())
->withParameterConverters([
GatewayPayloadBuilder::create('data'),
GatewayHeadersBuilder::create('metadata'),
GatewayHeaderBuilder::create('sourceMediaType', MessageHeaders::CONTENT_TYPE),
])
)
->registerGatewayBuilder(
GatewayProxyBuilder::create($messagePublisher->getReferenceName(), MessagePublisher::class, 'convertAndSend', $messagePublisher->getReferenceName())
->withParameterConverters([
GatewayPayloadBuilder::create('data'),
GatewayHeaderValueBuilder::create(MessageHeaders::CONTENT_TYPE, MediaType::APPLICATION_X_PHP),
])
)
->registerGatewayBuilder(
GatewayProxyBuilder::create($messagePublisher->getReferenceName(), MessagePublisher::class, 'convertAndSendWithMetadata', $messagePublisher->getReferenceName())
->withParameterConverters([
GatewayPayloadBuilder::create('data'),
GatewayHeadersBuilder::create('metadata'),
GatewayHeaderValueBuilder::create(MessageHeaders::CONTENT_TYPE, MediaType::APPLICATION_X_PHP),
])
)
// 3. Registering Outbound Channel Adapter
->registerMessageHandler(
SqsOutboundChannelAdapterBuilder::create($messagePublisher->getQueueName(), $messagePublisher->getConnectionReference())
->withEndpointId($messagePublisher->getReferenceName() . '.handler')
->withInputChannelName($messagePublisher->getReferenceName())
->withAutoDeclareOnSend($messagePublisher->isAutoDeclareOnSend())
->withHeaderMapper($messagePublisher->getHeaderMapper())
->withDefaultConversionMediaType($mediaType)
);
}
}
public function canHandle($extensionObject): bool
{
return
$extensionObject instanceof SqsMessagePublisherConfiguration
|| $extensionObject instanceof ServiceConfiguration;
}
public function getModulePackageName(): string
{
return ModulePackageList::SQS_PACKAGE;
}
}