using BuildingBlocks.Core.Event; namespace BuildingBlocks.MessageProcessor; // Ref: http://www.kamilgrzybek.com/design/the-outbox-pattern/ // Ref: https://event-driven.io/en/outbox_inbox_patterns_and_delivery_guarantees_explained/ // Ref: https://debezium.io/blog/2019/02/19/reliable-microservices-data-exchange-with-the-outbox-pattern/ // Ref: https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/multi-container-microservice-net-applications/subscribe-events#designing-atomicity-and-resiliency-when-publishing-to-the-event-bus // Ref: https://github.com/kgrzybek/modular-monolith-with-ddd#38-internal-processing public interface IPersistMessageProcessor { Task PublishMessageAsync( TMessageEnvelope messageEnvelope, CancellationToken cancellationToken = default) where TMessageEnvelope : MessageEnvelope; Task AddReceivedMessageAsync( TMessageEnvelope messageEnvelope, CancellationToken cancellationToken = default) where TMessageEnvelope : MessageEnvelope; Task AddInternalMessageAsync( TCommand internalCommand, CancellationToken cancellationToken = default) where TCommand : class, IInternalCommand; Task ExistMessageAsync( Guid messageId, CancellationToken cancellationToken = default); Task ProcessInboxAsync( Guid messageId, CancellationToken cancellationToken = default); Task ProcessAsync(Guid messageId, MessageDeliveryType deliveryType, CancellationToken cancellationToken = default); Task ProcessAllAsync(CancellationToken cancellationToken = default); }