mirror of
https://github.com/xtr-dev/payload-mailing.git
synced 2025-12-10 08:13:23 +00:00
Support custom ID types (string/number) for improved compatibility
- 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>
This commit is contained in:
88
CUSTOM-TYPES.md
Normal file
88
CUSTOM-TYPES.md
Normal file
@@ -0,0 +1,88 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user