Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,28 @@

namespace Fluent.Brighter;

/// <summary>
/// Provides extension methods for <see cref="ConsumerBuilder"/> to configure PostgreSQL-based message consumers.
/// These extensions enable easy setup of PostgreSQL subscriptions, inbox patterns, and channel factories.
/// </summary>
public static class ConsumerBuilderExtensions
{
/// <summary>
/// Adds a pre-configured PostgreSQL subscription to the consumer builder.
/// </summary>
/// <param name="builder">The <see cref="ConsumerBuilder"/> instance to configure.</param>
/// <param name="subscription">The pre-configured <see cref="PostgresSubscription"/> to add.</param>
/// <returns>The <see cref="ConsumerBuilder"/> instance for method chaining.</returns>
public static ConsumerBuilder AddPostgresSubscription(this ConsumerBuilder builder, PostgresSubscription subscription)
=> builder.AddSubscription(subscription);

/// <summary>
/// Adds a PostgreSQL subscription to the consumer builder using a configuration action.
/// This method creates a new <see cref="PostgresSubscriptionBuilder"/>, applies the configuration, and builds the subscription.
/// </summary>
/// <param name="builder">The <see cref="ConsumerBuilder"/> instance to configure.</param>
/// <param name="configure">An action that configures the <see cref="PostgresSubscriptionBuilder"/> with subscription settings.</param>
/// <returns>The <see cref="ConsumerBuilder"/> instance for method chaining.</returns>
public static ConsumerBuilder AddPostgresSubscription(this ConsumerBuilder builder,
Action<PostgresSubscriptionBuilder> configure)
{
Expand All @@ -20,6 +37,15 @@ public static ConsumerBuilder AddPostgresSubscription(this ConsumerBuilder build
return builder.AddSubscription(sub.Build());
}

/// <summary>
/// Adds a PostgreSQL subscription for a specific request type to the consumer builder.
/// This method automatically configures the subscription with the specified <typeparamref name="TRequest"/> type
/// and then applies additional configuration provided by the action.
/// </summary>
/// <typeparam name="TRequest">The type of request/message that this subscription will handle. Must implement <see cref="IRequest"/>.</typeparam>
/// <param name="builder">The <see cref="ConsumerBuilder"/> instance to configure.</param>
/// <param name="configure">An action that configures the <see cref="PostgresSubscriptionBuilder"/> with additional settings.</param>
/// <returns>The <see cref="ConsumerBuilder"/> instance for method chaining.</returns>
public static ConsumerBuilder AddPostgresSubscription<TRequest>(this ConsumerBuilder builder,
Action<PostgresSubscriptionBuilder> configure)
where TRequest : class, IRequest
Expand All @@ -30,7 +56,14 @@ public static ConsumerBuilder AddPostgresSubscription<TRequest>(this ConsumerBui
return builder.AddSubscription(sub.Build());
}


/// <summary>
/// Configures the consumer to use a PostgreSQL inbox pattern using a database configuration builder.
/// The inbox pattern ensures message deduplication and idempotent message processing by storing
/// information about received messages in PostgreSQL.
/// </summary>
/// <param name="builder">The <see cref="ConsumerBuilder"/> instance to configure.</param>
/// <param name="configure">An action that configures the <see cref="RelationalDatabaseConfigurationBuilder"/> with connection details.</param>
/// <returns>The <see cref="ConsumerBuilder"/> instance for method chaining.</returns>
public static ConsumerBuilder UsePostgresInbox(this ConsumerBuilder builder,
Action<RelationalDatabaseConfigurationBuilder> configure)
{
Expand All @@ -39,16 +72,39 @@ public static ConsumerBuilder UsePostgresInbox(this ConsumerBuilder builder,
return builder.UsePostgresInbox(configuration.Build());
}

/// <summary>
/// Configures the consumer to use a PostgreSQL inbox pattern using a pre-configured database configuration.
/// The inbox pattern ensures message deduplication and idempotent message processing by storing
/// information about received messages in PostgreSQL.
/// </summary>
/// <param name="builder">The <see cref="ConsumerBuilder"/> instance to configure.</param>
/// <param name="configuration">The pre-configured relational database configuration containing connection details.</param>
/// <returns>The <see cref="ConsumerBuilder"/> instance for method chaining.</returns>
public static ConsumerBuilder UsePostgresInbox(this ConsumerBuilder builder, IAmARelationalDatabaseConfiguration configuration)
=> builder.UsePostgresInbox(cfg => cfg.SetConfiguration(configuration));

/// <summary>
/// Configures the consumer to use a PostgreSQL inbox pattern using a custom inbox builder configuration.
/// This method provides the most flexibility by allowing direct configuration of the <see cref="PostgresInboxBuilder"/>,
/// including custom connection providers and other advanced settings.
/// </summary>
/// <param name="builder">The <see cref="ConsumerBuilder"/> instance to configure.</param>
/// <param name="configure">An action that configures the <see cref="PostgresInboxBuilder"/> with inbox settings.</param>
/// <returns>The <see cref="ConsumerBuilder"/> instance for method chaining.</returns>
public static ConsumerBuilder UsePostgresInbox(this ConsumerBuilder builder, Action<PostgresInboxBuilder> configure)
{
var inbox = new PostgresInboxBuilder();
configure(inbox);
return builder.SetInbox(cfg => cfg.SetInbox(inbox.Build()));
}

/// <summary>
/// Adds a PostgreSQL channel factory to the consumer builder using a database configuration builder.
/// Channel factories are responsible for creating message channels that consume messages from PostgreSQL queues.
/// </summary>
/// <param name="builder">The <see cref="ConsumerBuilder"/> instance to configure.</param>
/// <param name="configure">An action that configures the <see cref="RelationalDatabaseConfigurationBuilder"/> with connection details.</param>
/// <returns>The <see cref="ConsumerBuilder"/> instance for method chaining.</returns>
public static ConsumerBuilder AddPostgresChannelFactory(this ConsumerBuilder builder,
Action<RelationalDatabaseConfigurationBuilder> configure)
{
Expand All @@ -57,6 +113,13 @@ public static ConsumerBuilder AddPostgresChannelFactory(this ConsumerBuilder bui
return builder.AddPostgresChannelFactory(configuration.Build());
}

/// <summary>
/// Adds a PostgreSQL channel factory to the consumer builder using a pre-configured database configuration.
/// Channel factories are responsible for creating message channels that consume messages from PostgreSQL queues.
/// </summary>
/// <param name="builder">The <see cref="ConsumerBuilder"/> instance to configure.</param>
/// <param name="configuration">The pre-configured relational database configuration containing connection details.</param>
/// <returns>The <see cref="ConsumerBuilder"/> instance for method chaining.</returns>
public static ConsumerBuilder AddPostgresChannelFactory(this ConsumerBuilder builder, RelationalDatabaseConfiguration configuration)
{
return builder
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,21 @@

namespace Fluent.Brighter;

/// <summary>
/// Provides extension methods for <see cref="FluentBrighterBuilder"/> to configure PostgreSQL integration.
/// These extensions enable easy setup of PostgreSQL-based messaging, outbox patterns, inbox patterns,
/// distributed locking, and message subscriptions/publications.
/// </summary>
public static class FluentBrighterExtensions
{
/// <summary>
/// Configures Fluent Brighter to use PostgreSQL for messaging infrastructure.
/// This method provides a fluent API for setting up all PostgreSQL-related features including
/// message queues, outbox/inbox patterns, distributed locking, and subscriptions/publications.
/// </summary>
/// <param name="builder">The <see cref="FluentBrighterBuilder"/> instance to configure.</param>
/// <param name="configure">An action that configures the <see cref="PostgresConfigurator"/> with PostgreSQL-specific settings.</param>
/// <returns>The <see cref="FluentBrighterBuilder"/> instance for method chaining.</returns>
public static FluentBrighterBuilder UsingPostgres(this FluentBrighterBuilder builder,
Action<PostgresConfigurator> configure)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,20 @@

namespace Fluent.Brighter;

/// <summary>
/// Provides extension methods for <see cref="PostgresInboxBuilder"/> to simplify configuration.
/// These extensions enable fluent configuration of PostgreSQL inbox settings using builder patterns.
/// </summary>
public static class PostgresInboxBuilderExtensions
{
/// <summary>
/// Sets the database configuration for the PostgreSQL inbox using a fluent configuration builder.
/// This extension method creates a <see cref="RelationalDatabaseConfigurationBuilder"/>, applies the provided configuration,
/// and sets the resulting configuration on the inbox builder.
/// </summary>
/// <param name="builder">The <see cref="PostgresInboxBuilder"/> instance to configure.</param>
/// <param name="configure">An action that configures the <see cref="RelationalDatabaseConfigurationBuilder"/> with connection details and settings.</param>
/// <returns>The <see cref="PostgresInboxBuilder"/> instance for method chaining.</returns>
public static PostgresInboxBuilder SetConfiguration(this PostgresInboxBuilder builder,
Action<RelationalDatabaseConfigurationBuilder> configure)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,35 @@

namespace Fluent.Brighter;

/// <summary>
/// Provides extension methods for <see cref="PostgresMessageProducerFactoryBuilder"/> to simplify configuration.
/// These extensions enable fluent configuration of PostgreSQL message producer factories, including
/// connection settings and publication mappings.
/// </summary>
public static class PostgresMessageProducerFactoryBuilderExtensions
{
#region SetConnection
/// <summary>
/// Sets the PostgreSQL messaging gateway connection using a pre-configured database configuration.
/// This method creates a <see cref="PostgresMessagingGatewayConnection"/> from the provided configuration
/// and sets it on the builder.
/// </summary>
/// <param name="builder">The <see cref="PostgresMessageProducerFactoryBuilder"/> instance to configure.</param>
/// <param name="configuration">The pre-configured relational database configuration containing connection details.</param>
/// <returns>The <see cref="PostgresMessageProducerFactoryBuilder"/> instance for method chaining.</returns>
public static PostgresMessageProducerFactoryBuilder SetConnection(
this PostgresMessageProducerFactoryBuilder builder,
RelationalDatabaseConfiguration configuration)
=> builder.SetConnection(new PostgresMessagingGatewayConnection(configuration));

/// <summary>
/// Sets the PostgreSQL messaging gateway connection using a fluent configuration builder.
/// This extension method creates a <see cref="RelationalDatabaseConfigurationBuilder"/>, applies the provided configuration,
/// and creates a <see cref="PostgresMessagingGatewayConnection"/> from the result.
/// </summary>
/// <param name="builder">The <see cref="PostgresMessageProducerFactoryBuilder"/> instance to configure.</param>
/// <param name="configure">An action that configures the <see cref="RelationalDatabaseConfigurationBuilder"/> with connection details and settings.</param>
/// <returns>The <see cref="PostgresMessageProducerFactoryBuilder"/> instance for method chaining.</returns>
public static PostgresMessageProducerFactoryBuilder SetConnection(
this PostgresMessageProducerFactoryBuilder builder,
Action<RelationalDatabaseConfigurationBuilder> configure)
Expand All @@ -27,6 +48,13 @@ public static PostgresMessageProducerFactoryBuilder SetConnection(

#region AddPublication

/// <summary>
/// Adds a PostgreSQL publication to the producer factory using a configuration builder.
/// Publications define how messages are published to PostgreSQL, including topic mappings and message metadata.
/// </summary>
/// <param name="builder">The <see cref="PostgresMessageProducerFactoryBuilder"/> instance to configure.</param>
/// <param name="configure">An action that configures the <see cref="PostgresPublicationBuilder"/> with publication settings.</param>
/// <returns>The <see cref="PostgresMessageProducerFactoryBuilder"/> instance for method chaining.</returns>
public static PostgresMessageProducerFactoryBuilder AddPublication(
this PostgresMessageProducerFactoryBuilder builder,
Action<PostgresPublicationBuilder> configure)
Expand All @@ -36,6 +64,15 @@ public static PostgresMessageProducerFactoryBuilder AddPublication(
return builder.AddPublication(publication.Build());
}

/// <summary>
/// Adds a PostgreSQL publication for a specific request type to the producer factory.
/// This method automatically configures the publication with the specified <typeparamref name="TRequest"/> type
/// and then applies additional configuration provided by the action.
/// </summary>
/// <typeparam name="TRequest">The type of request/message that this publication will handle. Must implement <see cref="IRequest"/>.</typeparam>
/// <param name="builder">The <see cref="PostgresMessageProducerFactoryBuilder"/> instance to configure.</param>
/// <param name="configure">An action that configures the <see cref="PostgresPublicationBuilder"/> with additional publication settings.</param>
/// <returns>The <see cref="PostgresMessageProducerFactoryBuilder"/> instance for method chaining.</returns>
public static PostgresMessageProducerFactoryBuilder AddPublication<TRequest>(
this PostgresMessageProducerFactoryBuilder builder,
Action<PostgresPublicationBuilder> configure)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,20 @@

namespace Fluent.Brighter;

/// <summary>
/// Provides extension methods for <see cref="PostgresOutboxBuilder"/> to simplify configuration.
/// These extensions enable fluent configuration of PostgreSQL outbox settings using builder patterns.
/// </summary>
public static class PostgresOutboxBuilderExtensions
{
/// <summary>
/// Sets the database configuration for the PostgreSQL outbox using a fluent configuration builder.
/// This extension method creates a <see cref="RelationalDatabaseConfigurationBuilder"/>, applies the provided configuration,
/// and sets the resulting configuration on the outbox builder.
/// </summary>
/// <param name="builder">The <see cref="PostgresOutboxBuilder"/> instance to configure.</param>
/// <param name="configure">An action that configures the <see cref="RelationalDatabaseConfigurationBuilder"/> with connection details and settings.</param>
/// <returns>The <see cref="PostgresOutboxBuilder"/> instance for method chaining.</returns>
public static PostgresOutboxBuilder SetConfiguration(this PostgresOutboxBuilder builder,
Action<RelationalDatabaseConfigurationBuilder> configure)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,73 @@

namespace Fluent.Brighter;

/// <summary>
/// Provides extension methods for <see cref="PostgresPublicationBuilder"/> to simplify configuration with convenient helper methods.
/// These extensions provide readable, intention-revealing methods for configuring channel creation behavior and message payload formats.
/// </summary>
public static class PostgresPublicationBuilderExtensions
{
#region MakeChannels
/// <summary>
/// Configures the publication to create PostgreSQL queues/topics if they don't exist.
/// When a publication attempts to send to a non-existent queue, it will be automatically created.
/// </summary>
/// <param name="builder">The <see cref="PostgresPublicationBuilder"/> instance to configure.</param>
/// <returns>The <see cref="PostgresPublicationBuilder"/> instance for method chaining.</returns>
public static PostgresPublicationBuilder CreateQueueIfMissing(this PostgresPublicationBuilder builder)
=> builder.SetMakeChannels(OnMissingChannel.Create);

{
return builder.SetMakeChannels(OnMissingChannel.Create);
}

/// <summary>
/// Configures the publication to validate that PostgreSQL queues/topics exist before publishing.
/// If a queue doesn't exist, an error will be raised rather than creating it automatically.
/// </summary>
/// <param name="builder">The <see cref="PostgresPublicationBuilder"/> instance to configure.</param>
/// <returns>The <see cref="PostgresPublicationBuilder"/> instance for method chaining.</returns>
public static PostgresPublicationBuilder ValidIfQueueExists(this PostgresPublicationBuilder builder)
=> builder.SetMakeChannels(OnMissingChannel.Validate);

{
return builder.SetMakeChannels(OnMissingChannel.Validate);
}

/// <summary>
/// Configures the publication to assume PostgreSQL queues/topics exist without validation.
/// No checks will be performed, and the publication will attempt to use the queue regardless.
/// This is the most performant option but requires queues to be pre-created.
/// </summary>
/// <param name="builder">The <see cref="PostgresPublicationBuilder"/> instance to configure.</param>
/// <returns>The <see cref="PostgresPublicationBuilder"/> instance for method chaining.</returns>
public static PostgresPublicationBuilder AssumeQueueExists(this PostgresPublicationBuilder builder)
=> builder.SetMakeChannels(OnMissingChannel.Assume);
{
return builder.SetMakeChannels(OnMissingChannel.Assume);
}

#endregion

#region Binary Message Payload
/// <summary>
/// Enables binary message payload storage in PostgreSQL.
/// Message payloads will be stored as binary data (bytea) instead of text, which can be more efficient
/// for certain message types and reduces storage overhead for binary content.
/// </summary>
/// <param name="builder">The <see cref="PostgresPublicationBuilder"/> instance to configure.</param>
/// <returns>The <see cref="PostgresPublicationBuilder"/> instance for method chaining.</returns>
public static PostgresPublicationBuilder EnableBinaryMessagePayload(this PostgresPublicationBuilder builder)
=> builder.SetBinaryMessagePayload(true);

{
return builder.SetBinaryMessagePayload(true);
}

/// <summary>
/// Disables binary message payload storage in PostgreSQL.
/// Message payloads will be stored as text format instead of binary data.
/// This is useful when you need human-readable messages in the database for debugging or monitoring.
/// </summary>
/// <param name="builder">The <see cref="PostgresPublicationBuilder"/> instance to configure.</param>
/// <returns>The <see cref="PostgresPublicationBuilder"/> instance for method chaining.</returns>
public static PostgresPublicationBuilder DisableBinaryMessagePayload(this PostgresPublicationBuilder builder)
=> builder.SetBinaryMessagePayload(false);
{
return builder.SetBinaryMessagePayload(false);
}

#endregion
}
Loading
Loading