Skip to content

AdvancedEmailJobService Usage Examples

The AdvancedEmailJobService provides advanced email queue functionality with support for deduplication, unique locks, bulk processing, and scheduling.

Basic Usage

typescript
import AdvancedEmailJobService from '@app/Jobs/AdvancedEmailJobService';

// Send with deduplication (prevents duplicate emails)
await AdvancedEmailJobService.sendWithDeduplication(
  'user@example.com',
  'Welcome to ZinTrust!',
  'welcome',
  { name: 'John Doe' },
  'welcome-user-123' // unique deduplication ID
);

// Send with unique lock (only one email per unique constraint)
await AdvancedEmailJobService.sendWithUniqueLock(
  'user@example.com',
  'Password Reset',
  'password-reset',
  { resetToken: 'abc123' },
  'user-email' // unique constraint
);

Bulk Email Processing

typescript
// Send bulk emails with batch tracking
const recipients = ['user1@example.com', 'user2@example.com', 'user3@example.com'];
const jobIds = await AdvancedEmailJobService.sendBulk(
  recipients,
  'Monthly Newsletter',
  'newsletter',
  { issue: 'Q1-2024', campaign: 'monthly' },
  'newsletter-april-2024' // optional batch ID
);

Logger.info(`Queued ${jobIds.length} emails`);

High Priority and Scheduled Emails

typescript
// Send high priority email
await AdvancedEmailJobService.sendHighPriority(
  'admin@example.com',
  'Critical System Alert',
  'system-alert',
  { error: 'Database connection failed' },
  { priority: 20, delay: 0 } // higher priority = more important
);

// Schedule email for later
await AdvancedEmailJobService.sendScheduled(
  'user@example.com',
  'Meeting Reminder',
  'meeting-reminder',
  { meetingTime: '2024-02-01T10:00:00Z' },
  3600000 // delay in milliseconds (1 hour)
);

Email with Custom Metadata

typescript
await AdvancedEmailJobService.sendWithMetadata(
  'customer@example.com',
  'Special Offer Just for You!',
  'promotion',
  { discountCode: 'SAVE20', expiryDate: '2024-02-15' },
  {
    campaign: 'spring-sale',
    source: 'email-marketing',
    priority: 'high',
    tags: ['promotion', 'spring', 'discount'],
  }
);

Queue Management

typescript
// Process a single job
const processed = await AdvancedEmailJobService.processOne();
Logger.info(`Processed ${processed ? '1' : '0'} job`);

// Process all jobs in queue
const processedCount = await AdvancedEmailJobService.processAll();
Logger.info(`Processed ${processedCount} jobs`);

// Start worker for continuous processing
await AdvancedEmailJobService.start();

Advanced Features

Deduplication

Prevents duplicate emails with the same deduplication ID for 24 hours:

typescript
// This will only be sent once, even if called multiple times
await AdvancedEmailJobService.sendWithDeduplication(
  'user@example.com',
  'Welcome',
  'welcome',
  { name: 'User' },
  'welcome-user-123'
);

Unique Locks

This section demonstrates unique lock functionality.

typescript
// Only one email will be sent per user, regardless of template
await AdvancedEmailJobService.sendWithUniqueLock(
  'user@example.com',
  'Account Update',
  'account-update',
  { changes: ['email', 'password'] },
  'user-email'
);

Bulk Processing with Parallel Queuing

Bulk emails are queued in parallel for better performance:

typescript
const recipients = Array.from({ length: 1000 }, (_, i) => `user${i}@example.com`);
const startTime = Date.now();

const jobIds = await AdvancedEmailJobService.sendBulk(
  recipients,
  'Bulk Campaign',
  'bulk-campaign',
  { campaignId: 'spring-2024' }
);

const endTime = Date.now();
Logger.info(`Queued ${jobIds.length} emails in ${endTime - startTime}ms`);

Error Handling

All methods return a Promise<string> (job ID) or Promise<string[]> for bulk operations:

typescript
try {
  const jobId = await AdvancedEmailJobService.sendWithDeduplication(
    'user@example.com',
    'Test Email',
    'test',
    {}
  );
  Logger.info(`Email queued with job ID: ${jobId}`);
} catch (error) {
  Logger.error('Failed to queue email:', error);
}

Test Samples

The service includes test samples for documentation and testing:

typescript
import { testSamples } from '@app/Jobs/AdvancedEmailJobService';

Logger.info(testSamples.advancedQueuePatternsHeadline);
Logger.info(testSamples.uniqueIdExample);
Logger.info(testSamples.bulkExample);

Released under the MIT License.