90 lines
3.4 KiB
C#
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; }
|
|
}
|