mirror of
https://github.com/xtr-dev/payload-mailing.git
synced 2025-12-10 16:23:23 +00:00
- Replace hardcoded payload-types imports with generic BaseEmailDocument interface - Update sendEmail and sendEmailTask to work with both string and number IDs - Refactor MailingService to use generic document types instead of specific ones - Add BaseEmailDocument and BaseEmailTemplateDocument interfaces supporting id: string | number - Export BaseEmailDocument for users to extend with their custom fields - Fix TypeScript compilation error in template subject handling - Add CUSTOM-TYPES.md documentation for users with different ID types Fixes compatibility issue where plugin required number IDs but user projects used string IDs. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
88 lines
2.1 KiB
Markdown
88 lines
2.1 KiB
Markdown
# Using Custom ID Types
|
|
|
|
The mailing plugin now supports both `string` and `number` ID types. By default, it works with the generic `BaseEmailDocument` interface, but you can provide your own types for full type safety.
|
|
|
|
## Usage with Your Generated Types
|
|
|
|
When you have your own generated Payload types (e.g., from `payload generate:types`), you can use them with the mailing plugin:
|
|
|
|
```typescript
|
|
import { sendEmail, BaseEmailDocument } from '@xtr-dev/payload-mailing'
|
|
import { Email } from './payload-types' // Your generated types
|
|
|
|
// Option 1: Use your specific Email type
|
|
const email = await sendEmail<Email>(payload, {
|
|
template: {
|
|
slug: 'welcome',
|
|
variables: { name: 'John' }
|
|
},
|
|
data: {
|
|
to: 'user@example.com',
|
|
// All your custom fields are now type-safe
|
|
}
|
|
})
|
|
|
|
// Option 2: Extend BaseEmailDocument for custom fields
|
|
interface MyEmail extends BaseEmailDocument {
|
|
customField: string
|
|
anotherField?: number
|
|
}
|
|
|
|
const customEmail = await sendEmail<MyEmail>(payload, {
|
|
data: {
|
|
to: 'user@example.com',
|
|
subject: 'Hello',
|
|
html: '<p>Hello World</p>',
|
|
customField: 'my value', // Type-safe!
|
|
}
|
|
})
|
|
```
|
|
|
|
## ID Type Compatibility
|
|
|
|
The plugin works with both:
|
|
- **String IDs**: `id: string`
|
|
- **Number IDs**: `id: number`
|
|
|
|
Your Payload configuration determines which type is used. The plugin automatically adapts to your setup.
|
|
|
|
## Type Definitions
|
|
|
|
The base interfaces provided by the plugin:
|
|
|
|
```typescript
|
|
interface BaseEmailDocument {
|
|
id: string | number
|
|
template?: any
|
|
to: string[]
|
|
cc?: string[]
|
|
bcc?: string[]
|
|
from?: string
|
|
replyTo?: string
|
|
subject: string
|
|
html: string
|
|
text?: string
|
|
variables?: Record<string, any>
|
|
scheduledAt?: string
|
|
sentAt?: string
|
|
status?: 'pending' | 'processing' | 'sent' | 'failed'
|
|
attempts?: number
|
|
lastAttemptAt?: string
|
|
error?: string
|
|
priority?: number
|
|
createdAt?: string
|
|
updatedAt?: string
|
|
}
|
|
|
|
interface BaseEmailTemplateDocument {
|
|
id: string | number
|
|
name: string
|
|
slug: string
|
|
subject?: string
|
|
content?: any
|
|
createdAt?: string
|
|
updatedAt?: string
|
|
}
|
|
```
|
|
|
|
These provide a foundation that works with any ID type while maintaining type safety for the core email functionality. |