mirror of
https://github.com/xtr-dev/payload-mailing.git
synced 2025-12-10 08:13:23 +00:00
- Reduced log noise while keeping essential error logging - Only show job polling logs after 2 attempts (to catch real issues) - Keep the main job scheduling confirmation log - Immediate processing success is now at debug level 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
89 lines
2.8 KiB
TypeScript
89 lines
2.8 KiB
TypeScript
import type { Payload } from 'payload'
|
|
import { createContextLogger } from './logger.js'
|
|
|
|
/**
|
|
* Processes a single email by ID using the mailing service
|
|
* @param payload Payload instance
|
|
* @param emailId The ID of the email to process
|
|
* @returns Promise that resolves when email is processed
|
|
*/
|
|
export async function processEmailById(payload: Payload, emailId: string): Promise<void> {
|
|
// Get mailing context from payload
|
|
const mailingContext = (payload as any).mailing
|
|
|
|
if (!mailingContext) {
|
|
throw new Error(
|
|
'Mailing plugin not found on payload instance. ' +
|
|
'Ensure the mailingPlugin is properly configured in your Payload config plugins array.'
|
|
)
|
|
}
|
|
|
|
if (!mailingContext.service) {
|
|
throw new Error(
|
|
'Mailing service not available. ' +
|
|
'The plugin may not have completed initialization. ' +
|
|
'Check that email configuration is properly set up in your Payload config.'
|
|
)
|
|
}
|
|
|
|
// Process the specific email
|
|
await mailingContext.service.processEmailItem(emailId)
|
|
}
|
|
|
|
/**
|
|
* Processes a job immediately by finding and executing it
|
|
* @param payload Payload instance
|
|
* @param jobId The ID of the job to run immediately
|
|
* @returns Promise that resolves when job is processed
|
|
*/
|
|
export async function processJobById(payload: Payload, jobId: string): Promise<void> {
|
|
if (!payload.jobs) {
|
|
throw new Error('PayloadCMS jobs not configured - cannot process job immediately')
|
|
}
|
|
|
|
try {
|
|
// Run a specific job by its ID (using where clause to find the job)
|
|
const result = await payload.jobs.run({
|
|
where: {
|
|
id: {
|
|
equals: jobId
|
|
}
|
|
}
|
|
})
|
|
} catch (error) {
|
|
const logger = createContextLogger(payload, 'PROCESSOR')
|
|
logger.error(`Job ${jobId} execution failed:`, error)
|
|
throw new Error(`Failed to process job ${jobId}: ${String(error)}`)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Processes all pending and failed emails using the mailing service
|
|
* @param payload Payload instance
|
|
* @returns Promise that resolves when all emails are processed
|
|
*/
|
|
export async function processAllEmails(payload: Payload): Promise<void> {
|
|
// Get mailing context from payload
|
|
const mailingContext = (payload as any).mailing
|
|
|
|
if (!mailingContext) {
|
|
throw new Error(
|
|
'Mailing plugin not found on payload instance. ' +
|
|
'Ensure the mailingPlugin is properly configured in your Payload config plugins array.'
|
|
)
|
|
}
|
|
|
|
if (!mailingContext.service) {
|
|
throw new Error(
|
|
'Mailing service not available. ' +
|
|
'The plugin may not have completed initialization. ' +
|
|
'Check that email configuration is properly set up in your Payload config.'
|
|
)
|
|
}
|
|
|
|
// Process pending emails first
|
|
await mailingContext.service.processEmails()
|
|
|
|
// Then retry failed emails
|
|
await mailingContext.service.retryFailedEmails()
|
|
} |