dotnet-cqrs/Svrnty.CQRS.Events.Abstractions/Subscriptions/IEventSubscriptionService.cs

90 lines
3.4 KiB
C#

using System;
using Svrnty.CQRS.Events.Abstractions.Subscriptions;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Svrnty.CQRS.Events.Abstractions.Models;
namespace Svrnty.CQRS.Events.Abstractions.Subscriptions;
/// <summary>
/// Service for managing event subscriptions.
/// Provides high-level operations for subscribing, unsubscribing, and managing subscriptions.
/// </summary>
public interface IEventSubscriptionService
{
/// <summary>
/// Create a new subscription to events for a correlation ID.
/// </summary>
/// <param name="request">Subscription request details.</param>
/// <param name="cancellationToken">Cancellation token.</param>
/// <returns>The created subscription.</returns>
Task<EventSubscription> SubscribeAsync(SubscriptionRequest request, CancellationToken cancellationToken = default);
/// <summary>
/// Unsubscribe from events (marks subscription as cancelled).
/// </summary>
/// <param name="subscriptionId">The subscription ID to cancel.</param>
/// <param name="cancellationToken">Cancellation token.</param>
Task UnsubscribeAsync(string subscriptionId, CancellationToken cancellationToken = default);
/// <summary>
/// Get all active subscriptions for a subscriber (for catch-up on reconnect).
/// </summary>
/// <param name="subscriberId">The subscriber ID.</param>
/// <param name="cancellationToken">Cancellation token.</param>
/// <returns>List of active subscriptions.</returns>
Task<List<EventSubscription>> GetActiveSubscriptionsAsync(string subscriberId, CancellationToken cancellationToken = default);
/// <summary>
/// Mark a subscription as completed (terminal event received).
/// </summary>
/// <param name="subscriptionId">The subscription ID.</param>
/// <param name="cancellationToken">Cancellation token.</param>
Task CompleteSubscriptionAsync(string subscriptionId, CancellationToken cancellationToken = default);
/// <summary>
/// Update the last delivered sequence for a subscription.
/// </summary>
/// <param name="subscriptionId">The subscription ID.</param>
/// <param name="sequence">The sequence number that was delivered.</param>
/// <param name="cancellationToken">Cancellation token.</param>
Task UpdateLastDeliveredAsync(string subscriptionId, long sequence, CancellationToken cancellationToken = default);
}
/// <summary>
/// Request to create a new event subscription.
/// </summary>
public sealed class SubscriptionRequest
{
/// <summary>
/// ID of the subscriber (typically user ID or client ID).
/// </summary>
public required string SubscriberId { get; init; }
/// <summary>
/// Correlation ID to subscribe to.
/// </summary>
public required string CorrelationId { get; init; }
/// <summary>
/// Event types to receive (empty = all types).
/// </summary>
public HashSet<string> EventTypes { get; init; } = new();
/// <summary>
/// Event types that complete the subscription.
/// </summary>
public HashSet<string> TerminalEventTypes { get; init; } = new();
/// <summary>
/// How events should be delivered.
/// </summary>
public DeliveryMode DeliveryMode { get; init; } = DeliveryMode.Immediate;
/// <summary>
/// Optional timeout duration for this subscription.
/// </summary>
public TimeSpan? Timeout { get; init; }
}