Table of Contents

Class EmailQueueService

Namespace
FishMMO.Database.Npgsql.Services
Assembly
FishMMO-DB.dll

Outbound email queue service. Uses parameterized raw SQL for writes and EF Core compiled queries for reads, following the existing service pattern.

public sealed class EmailQueueService : BaseService<EmailQueueEntity>, IEmailQueueService
Inheritance
EmailQueueService
Implements
Inherited Members

Constructors

EmailQueueService(INpgsqlDbContextFactory)

public EmailQueueService(INpgsqlDbContextFactory dbContextFactory)

Parameters

dbContextFactory INpgsqlDbContextFactory

Methods

DequeueNextAsync(string, CancellationToken)

Atomically claims and dequeues the next pending email using FOR UPDATE SKIP LOCKED. Safe for concurrent LoginServers. Throws DatabaseEntityNotFoundException if the queue is empty.

public Task<DatabaseResult<EmailQueueData>> DequeueNextAsync(string claimedBy, CancellationToken cancellationToken = default)

Parameters

claimedBy string

Identifier of the claiming server (e.g. server name).

cancellationToken CancellationToken

Cancellation token.

Returns

Task<DatabaseResult<EmailQueueData>>

EnqueueAsync(string, string, string, string, CancellationToken)

Enqueues an email for asynchronous delivery.

public Task<DatabaseResult> EnqueueAsync(string recipientEmail, string recipientUsername, string subject, string body, CancellationToken cancellationToken = default)

Parameters

recipientEmail string

Recipient email address.

recipientUsername string

Associated account username.

subject string

Email subject line.

body string

Email body (plain-text or HTML).

cancellationToken CancellationToken

Cancellation token.

Returns

Task<DatabaseResult>

HasPendingForUserAsync(string, CancellationToken)

Returns true if the specified user already has a pending (unsent, unclaimed) verification email in the queue. Prevents duplicate/spam emails.

public Task<DatabaseResult<bool>> HasPendingForUserAsync(string recipientUsername, CancellationToken cancellationToken = default)

Parameters

recipientUsername string
cancellationToken CancellationToken

Returns

Task<DatabaseResult<bool>>

MarkFailedAsync(long, string, int, CancellationToken)

Marks an email delivery attempt as failed and increments the attempt counter. Emails exceeding maxAttempts are left in the queue with the error recorded so operators can investigate.

public Task<DatabaseResult> MarkFailedAsync(long id, string error, int maxAttempts = 5, CancellationToken cancellationToken = default)

Parameters

id long
error string
maxAttempts int
cancellationToken CancellationToken

Returns

Task<DatabaseResult>

MarkSentAsync(long, CancellationToken)

Marks an email as successfully sent.

public Task<DatabaseResult> MarkSentAsync(long id, CancellationToken cancellationToken = default)

Parameters

id long
cancellationToken CancellationToken

Returns

Task<DatabaseResult>