UNPKG

@xtr-dev/payload-mailing

Version:

Template-based email system with scheduling and job processing for PayloadCMS

99 lines (98 loc) 3.87 kB
import { MailingService } from './services/MailingService.js'; import { createEmailTemplatesCollection } from './collections/EmailTemplates.js'; import Emails from './collections/Emails.js'; import { mailingJobs } from './jobs/index.js'; export const mailingPlugin = (pluginConfig) => (config) => { const queueName = pluginConfig.queue || 'default'; // Handle templates collection configuration const templatesConfig = pluginConfig.collections?.templates; const templatesSlug = typeof templatesConfig === 'string' ? templatesConfig : 'email-templates'; const templatesOverrides = typeof templatesConfig === 'object' ? templatesConfig : {}; // Create base templates collection with custom editor if provided const baseTemplatesCollection = createEmailTemplatesCollection(pluginConfig.richTextEditor); const templatesCollection = { ...baseTemplatesCollection, slug: templatesSlug, ...templatesOverrides, // Ensure admin config is properly merged admin: { ...baseTemplatesCollection.admin, ...templatesOverrides.admin, }, // Ensure access config is properly merged access: { ...baseTemplatesCollection.access, ...templatesOverrides.access, }, }; // Handle emails collection configuration const emailsConfig = pluginConfig.collections?.emails; const emailsSlug = typeof emailsConfig === 'string' ? emailsConfig : 'emails'; const emailsOverrides = typeof emailsConfig === 'object' ? emailsConfig : {}; const emailsCollection = { ...Emails, slug: emailsSlug, ...emailsOverrides, // Ensure admin config is properly merged admin: { ...Emails.admin, ...emailsOverrides.admin, }, // Ensure access config is properly merged access: { ...Emails.access, ...emailsOverrides.access, }, // Update relationship fields to point to correct templates collection fields: (emailsOverrides.fields || Emails.fields).map((field) => { if (field && typeof field === 'object' && 'name' in field && field.name === 'template' && field.type === 'relationship') { return { ...field, relationTo: templatesSlug, }; } return field; }), }; // Filter out any existing collections with the same slugs to prevent duplicates const existingCollections = (config.collections || []).filter((collection) => collection.slug !== templatesSlug && collection.slug !== emailsSlug); return { ...config, collections: [ ...existingCollections, templatesCollection, emailsCollection, ], jobs: { ...(config.jobs || {}), tasks: [ ...(config.jobs?.tasks || []), ...mailingJobs, ], }, onInit: async (payload) => { if (pluginConfig.initOrder === 'after' && config.onInit) { await config.onInit(payload); } // Initialize mailing service with proper payload instance const mailingService = new MailingService(payload, pluginConfig); payload.mailing = { payload, service: mailingService, config: pluginConfig, collections: { templates: templatesSlug, emails: emailsSlug, }, }; if (pluginConfig.initOrder !== 'after' && config.onInit) { await config.onInit(payload); } }, }; }; export default mailingPlugin;