mirror of
https://github.com/xtr-dev/payload-mailing.git
synced 2025-12-10 00:03:23 +00:00
- Create sendEmailWorkflow as a Payload workflow alternative to task - Add processImmediately option (disabled by default) to send emails immediately - Expose processEmailItem method in MailingService for individual email processing - Add comprehensive input schema with conditional fields - Update plugin to register both tasks and workflows - Add detailed documentation comparing tasks vs workflows - Includes status tracking and error handling - Bump version to 0.3.0 (new feature)
124 lines
3.6 KiB
TypeScript
124 lines
3.6 KiB
TypeScript
import { Payload } from 'payload'
|
|
import type { CollectionConfig, RichTextField } from 'payload'
|
|
|
|
// JSON value type that matches Payload's JSON field type
|
|
export type JSONValue = string | number | boolean | { [k: string]: unknown } | unknown[] | null | undefined
|
|
|
|
// Generic base interfaces that work with any ID type and null values
|
|
export interface BaseEmailDocument {
|
|
id: string | number
|
|
template?: any
|
|
to: string[]
|
|
cc?: string[] | null
|
|
bcc?: string[] | null
|
|
from?: string | null
|
|
fromName?: string | null
|
|
replyTo?: string | null
|
|
subject: string
|
|
html: string
|
|
text?: string | null
|
|
variables?: JSONValue
|
|
scheduledAt?: string | Date | null
|
|
sentAt?: string | Date | null
|
|
status?: 'pending' | 'processing' | 'sent' | 'failed' | null
|
|
attempts?: number | null
|
|
lastAttemptAt?: string | Date | null
|
|
error?: string | null
|
|
priority?: number | null
|
|
createdAt?: string | Date | null
|
|
updatedAt?: string | Date | null
|
|
}
|
|
|
|
export interface BaseEmailTemplateDocument {
|
|
id: string | number
|
|
name: string
|
|
slug: string
|
|
subject?: string | null
|
|
content?: any
|
|
createdAt?: string | Date | null
|
|
updatedAt?: string | Date | null
|
|
}
|
|
|
|
export type BaseEmail<TEmail extends BaseEmailDocument = BaseEmailDocument, TEmailTemplate extends BaseEmailTemplateDocument = BaseEmailTemplateDocument> = Omit<TEmail, 'id' | 'template'> & {template: Omit<TEmailTemplate, 'id'> | TEmailTemplate['id'] | undefined | null}
|
|
|
|
export type BaseEmailTemplate<TEmailTemplate extends BaseEmailTemplateDocument = BaseEmailTemplateDocument> = Omit<TEmailTemplate, 'id'>
|
|
|
|
export type TemplateRendererHook = (template: string, variables: Record<string, any>) => string | Promise<string>
|
|
|
|
export type TemplateEngine = 'liquidjs' | 'mustache' | 'simple'
|
|
|
|
export interface BeforeSendMailOptions {
|
|
from: string
|
|
to: string[]
|
|
cc?: string[]
|
|
bcc?: string[]
|
|
replyTo?: string
|
|
subject: string
|
|
html: string
|
|
text?: string
|
|
attachments?: any[]
|
|
[key: string]: any
|
|
}
|
|
|
|
export type BeforeSendHook = (options: BeforeSendMailOptions, email: BaseEmailDocument) => BeforeSendMailOptions | Promise<BeforeSendMailOptions>
|
|
|
|
export interface MailingPluginConfig {
|
|
collections?: {
|
|
templates?: string | Partial<CollectionConfig>
|
|
emails?: string | Partial<CollectionConfig>
|
|
}
|
|
defaultFrom?: string
|
|
defaultFromName?: string
|
|
queue?: string
|
|
retryAttempts?: number
|
|
retryDelay?: number
|
|
templateRenderer?: TemplateRendererHook
|
|
templateEngine?: TemplateEngine
|
|
richTextEditor?: RichTextField['editor']
|
|
beforeSend?: BeforeSendHook
|
|
onReady?: (payload: any) => Promise<void>
|
|
initOrder?: 'before' | 'after'
|
|
}
|
|
|
|
export interface QueuedEmail {
|
|
id: string
|
|
template?: string | null
|
|
to: string[]
|
|
cc?: string[] | null
|
|
bcc?: string[] | null
|
|
from?: string | null
|
|
fromName?: string | null
|
|
replyTo?: string | null
|
|
subject: string
|
|
html: string
|
|
text?: string | null
|
|
variables?: JSONValue
|
|
scheduledAt?: string | Date | null
|
|
sentAt?: string | Date | null
|
|
status: 'pending' | 'processing' | 'sent' | 'failed'
|
|
attempts: number
|
|
lastAttemptAt?: string | Date | null
|
|
error?: string | null
|
|
priority?: number | null
|
|
createdAt: string
|
|
updatedAt: string
|
|
}
|
|
|
|
// Simple helper type for template variables
|
|
export interface TemplateVariables {
|
|
[key: string]: any
|
|
}
|
|
|
|
export interface MailingService {
|
|
processEmails(): Promise<void>
|
|
processEmailItem(emailId: string): Promise<void>
|
|
retryFailedEmails(): Promise<void>
|
|
renderTemplate(templateSlug: string, variables: TemplateVariables): Promise<{ html: string; text: string; subject: string }>
|
|
}
|
|
|
|
export interface MailingContext {
|
|
payload: Payload
|
|
config: MailingPluginConfig
|
|
service: MailingService
|
|
}
|