@astralibx/email-rule-engine 7.0.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2258,5 +2258,5 @@ exports.createEmailRuleSendSchema = createEmailRuleSendSchema;
2258
2258
  exports.createEmailTemplateSchema = createEmailTemplateSchema;
2259
2259
  exports.createEmailThrottleConfigSchema = createEmailThrottleConfigSchema;
2260
2260
  exports.validateConfig = validateConfig;
2261
- //# sourceMappingURL=index.js.map
2262
- //# sourceMappingURL=index.js.map
2261
+ //# sourceMappingURL=index.cjs.map
2262
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants/index.ts","../src/schemas/template.schema.ts","../src/schemas/rule.schema.ts","../src/schemas/rule-send.schema.ts","../src/schemas/run-log.schema.ts","../src/schemas/throttle-config.schema.ts","../src/services/template-render.service.ts","../src/errors/index.ts","../src/services/template.service.ts","../src/services/rule.service.ts","../src/utils/redis-lock.ts","../src/services/rule-runner.service.ts","../src/utils/express-helpers.ts","../src/controllers/template.controller.ts","../src/controllers/rule.controller.ts","../src/controllers/runner.controller.ts","../src/controllers/settings.controller.ts","../src/routes/index.ts","../src/validation/config.schema.ts","../src/index.ts"],"names":["Schema","Handlebars","mjml2html","convert","AlxError","UPDATEABLE_FIELDS","crypto","isValidValue","getErrorStatus","Router","z","baseDbSchema","baseRedisSchema","loggerSchema"],"mappings":"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","file":"index.cjs","sourcesContent":["export const TEMPLATE_CATEGORY = {\n Onboarding: 'onboarding',\n Engagement: 'engagement',\n Transactional: 'transactional',\n ReEngagement: 're-engagement',\n Announcement: 'announcement',\n} as const;\n\nexport type TemplateCategory = (typeof TEMPLATE_CATEGORY)[keyof typeof TEMPLATE_CATEGORY];\n\nexport const TEMPLATE_AUDIENCE = {\n Customer: 'customer',\n Provider: 'provider',\n All: 'all',\n} as const;\n\nexport type TemplateAudience = (typeof TEMPLATE_AUDIENCE)[keyof typeof TEMPLATE_AUDIENCE];\n\nexport const RULE_OPERATOR = {\n Eq: 'eq',\n Neq: 'neq',\n Gt: 'gt',\n Gte: 'gte',\n Lt: 'lt',\n Lte: 'lte',\n Exists: 'exists',\n NotExists: 'not_exists',\n In: 'in',\n NotIn: 'not_in',\n Contains: 'contains',\n} as const;\n\nexport type RuleOperator = (typeof RULE_OPERATOR)[keyof typeof RULE_OPERATOR];\n\nexport const EMAIL_TYPE = {\n Automated: 'automated',\n Transactional: 'transactional',\n} as const;\n\nexport type EmailType = (typeof EMAIL_TYPE)[keyof typeof EMAIL_TYPE];\n\nexport const RUN_TRIGGER = {\n Cron: 'cron',\n Manual: 'manual',\n} as const;\n\nexport type RunTrigger = (typeof RUN_TRIGGER)[keyof typeof RUN_TRIGGER];\n\nexport const THROTTLE_WINDOW = {\n Rolling: 'rolling',\n} as const;\n\nexport type ThrottleWindow = (typeof THROTTLE_WINDOW)[keyof typeof THROTTLE_WINDOW];\n\nexport const EMAIL_SEND_STATUS = {\n Sent: 'sent',\n Error: 'error',\n Skipped: 'skipped',\n Invalid: 'invalid',\n Throttled: 'throttled',\n} as const;\n\nexport type EmailSendStatus = (typeof EMAIL_SEND_STATUS)[keyof typeof EMAIL_SEND_STATUS];\n","import { Schema, Model, HydratedDocument } from 'mongoose';\nimport { TEMPLATE_CATEGORY, TEMPLATE_AUDIENCE } from '../constants';\nimport type { EmailTemplate, CreateEmailTemplateInput } from '../types/template.types';\n\nexport interface IEmailTemplate extends Omit<EmailTemplate, '_id'> {}\n\nexport type EmailTemplateDocument = HydratedDocument<IEmailTemplate>;\n\nexport interface EmailTemplateStatics {\n findBySlug(slug: string): Promise<EmailTemplateDocument | null>;\n findActive(): Promise<EmailTemplateDocument[]>;\n findByCategory(category: string): Promise<EmailTemplateDocument[]>;\n findByAudience(audience: string): Promise<EmailTemplateDocument[]>;\n createTemplate(input: CreateEmailTemplateInput): Promise<EmailTemplateDocument>;\n}\n\nexport type EmailTemplateModel = Model<IEmailTemplate> & EmailTemplateStatics;\n\nexport function createEmailTemplateSchema(\n platformValues?: string[],\n audienceValues?: string[],\n categoryValues?: string[],\n collectionPrefix?: string\n) {\n const schema = new Schema<IEmailTemplate>(\n {\n name: { type: String, required: true },\n slug: { type: String, required: true, unique: true },\n description: String,\n category: { type: String, enum: categoryValues || Object.values(TEMPLATE_CATEGORY), required: true },\n audience: { type: String, enum: audienceValues || Object.values(TEMPLATE_AUDIENCE), required: true },\n platform: {\n type: String,\n required: true,\n ...(platformValues ? { enum: platformValues } : {})\n },\n\n textBody: String,\n subjects: { type: [{ type: String }], required: true, validate: [(v: string[]) => v.length >= 1, 'At least one subject is required'] },\n bodies: { type: [{ type: String }], required: true, validate: [(v: string[]) => v.length >= 1, 'At least one body is required'] },\n preheaders: [{ type: String }],\n\n fields: {\n type: Schema.Types.Mixed,\n default: {},\n validate: {\n validator: (v: any) => {\n if (!v || typeof v !== 'object') return true;\n return Object.values(v).every(val => typeof val === 'string');\n },\n message: 'All field values must be strings'\n }\n },\n variables: [{ type: String }],\n version: { type: Number, default: 1 },\n isActive: { type: Boolean, default: true, index: true }\n },\n {\n timestamps: true,\n collection: `${collectionPrefix || ''}email_templates`,\n\n statics: {\n findBySlug(slug: string) {\n return this.findOne({ slug });\n },\n\n findActive() {\n return this.find({ isActive: true }).sort({ category: 1, name: 1 });\n },\n\n findByCategory(category: string) {\n return this.find({ category, isActive: true }).sort({ name: 1 });\n },\n\n findByAudience(audience: string) {\n return this.find({\n $or: [{ audience }, { audience: TEMPLATE_AUDIENCE.All }],\n isActive: true\n }).sort({ name: 1 });\n },\n\n async createTemplate(input: CreateEmailTemplateInput) {\n return this.create({\n name: input.name,\n slug: input.slug,\n description: input.description,\n category: input.category,\n audience: input.audience,\n platform: input.platform,\n textBody: input.textBody,\n subjects: input.subjects,\n bodies: input.bodies,\n preheaders: input.preheaders || [],\n fields: input.fields || {},\n variables: input.variables || [],\n version: 1,\n isActive: true\n });\n }\n }\n }\n );\n\n schema.index({ category: 1, isActive: 1 });\n schema.index({ audience: 1, platform: 1, isActive: 1 });\n\n return schema;\n}\n","import { Schema, Model, Types, HydratedDocument } from 'mongoose';\nimport { RULE_OPERATOR, EMAIL_TYPE, TEMPLATE_AUDIENCE } from '../constants';\nimport type { EmailRule, CreateEmailRuleInput } from '../types/rule.types';\n\nexport interface IEmailRule extends Omit<EmailRule, '_id' | 'templateId'> {\n templateId: Types.ObjectId;\n}\n\nexport type EmailRuleDocument = HydratedDocument<IEmailRule>;\n\nexport interface EmailRuleStatics {\n findActive(): Promise<EmailRuleDocument[]>;\n findByTemplateId(templateId: string | Types.ObjectId): Promise<EmailRuleDocument[]>;\n createRule(input: CreateEmailRuleInput): Promise<EmailRuleDocument>;\n}\n\nexport type EmailRuleModel = Model<IEmailRule> & EmailRuleStatics;\n\nexport function createEmailRuleSchema(platformValues?: string[], audienceValues?: string[], collectionPrefix?: string) {\n const RuleConditionSchema = new Schema({\n field: { type: String, required: true },\n operator: { type: String, enum: Object.values(RULE_OPERATOR), required: true },\n value: { type: Schema.Types.Mixed }\n }, { _id: false });\n\n const RuleTargetSchema = new Schema({\n mode: { type: String, enum: ['query', 'list'], required: true },\n role: { type: String, enum: audienceValues || Object.values(TEMPLATE_AUDIENCE) },\n platform: {\n type: String,\n ...(platformValues ? { enum: platformValues } : {})\n },\n conditions: [RuleConditionSchema],\n identifiers: [{ type: String }]\n }, { _id: false });\n\n const RuleRunStatsSchema = new Schema({\n matched: { type: Number, default: 0 },\n sent: { type: Number, default: 0 },\n skipped: { type: Number, default: 0 },\n skippedByThrottle: { type: Number, default: 0 },\n errors: { type: Number, default: 0 }\n }, { _id: false });\n\n const schema = new Schema<IEmailRule>(\n {\n name: { type: String, required: true },\n description: String,\n isActive: { type: Boolean, default: false, index: true },\n\n sortOrder: { type: Number, default: 10 },\n\n target: { type: RuleTargetSchema, required: true },\n templateId: { type: Schema.Types.ObjectId, ref: 'EmailTemplate', required: true, index: true },\n\n sendOnce: { type: Boolean, default: true },\n resendAfterDays: Number,\n cooldownDays: Number,\n autoApprove: { type: Boolean, default: true },\n maxPerRun: Number,\n\n validFrom: { type: Date },\n validTill: { type: Date },\n\n bypassThrottle: { type: Boolean, default: false },\n emailType: { type: String, enum: Object.values(EMAIL_TYPE), default: EMAIL_TYPE.Automated },\n\n totalSent: { type: Number, default: 0 },\n totalSkipped: { type: Number, default: 0 },\n lastRunAt: Date,\n lastRunStats: RuleRunStatsSchema\n },\n {\n timestamps: true,\n collection: `${collectionPrefix || ''}email_rules`,\n\n statics: {\n findActive() {\n return this.find({ isActive: true }).sort({ sortOrder: 1 });\n },\n\n findByTemplateId(templateId: string | Types.ObjectId) {\n return this.find({ templateId });\n },\n\n async createRule(input: CreateEmailRuleInput) {\n return this.create({\n name: input.name,\n description: input.description,\n isActive: false,\n sortOrder: input.sortOrder ?? 10,\n target: input.target,\n templateId: input.templateId,\n sendOnce: input.sendOnce ?? true,\n resendAfterDays: input.resendAfterDays,\n cooldownDays: input.cooldownDays,\n autoApprove: input.autoApprove ?? true,\n maxPerRun: input.maxPerRun,\n validFrom: input.validFrom,\n validTill: input.validTill,\n bypassThrottle: input.bypassThrottle ?? false,\n emailType: input.emailType ?? EMAIL_TYPE.Automated,\n totalSent: 0,\n totalSkipped: 0\n });\n }\n }\n }\n );\n\n schema.index({ isActive: 1, sortOrder: 1 });\n schema.index({ templateId: 1 });\n\n return schema;\n}\n","import { Schema, Model, Types, HydratedDocument } from 'mongoose';\n\nexport interface IEmailRuleSend {\n ruleId: Types.ObjectId;\n userId: Types.ObjectId;\n emailIdentifierId?: Types.ObjectId;\n messageId?: Types.ObjectId;\n sentAt: Date;\n status?: string;\n accountId?: string;\n senderName?: string;\n subject?: string;\n subjectIndex?: number;\n bodyIndex?: number;\n preheaderIndex?: number;\n failureReason?: string;\n}\n\nexport type EmailRuleSendDocument = HydratedDocument<IEmailRuleSend>;\n\nexport interface EmailRuleSendStatics {\n findLatestForUser(ruleId: string | Types.ObjectId, userId: string | Types.ObjectId): Promise<EmailRuleSendDocument | null>;\n findRecentByUserIds(userIds: (string | Types.ObjectId)[], sinceDays: number): Promise<EmailRuleSendDocument[]>;\n logSend(\n ruleId: string | Types.ObjectId,\n userId: string | Types.ObjectId,\n emailIdentifierId?: string | Types.ObjectId,\n messageId?: string | Types.ObjectId,\n extra?: { status?: string; accountId?: string; senderName?: string; subject?: string; subjectIndex?: number; bodyIndex?: number; preheaderIndex?: number; failureReason?: string }\n ): Promise<EmailRuleSendDocument>;\n}\n\nexport type EmailRuleSendModel = Model<IEmailRuleSend> & EmailRuleSendStatics;\n\nexport function createEmailRuleSendSchema(collectionPrefix?: string) {\n const schema = new Schema<IEmailRuleSend>(\n {\n ruleId: { type: Schema.Types.ObjectId, ref: 'EmailRule', required: true },\n userId: { type: Schema.Types.ObjectId, required: true },\n emailIdentifierId: { type: Schema.Types.ObjectId },\n messageId: { type: Schema.Types.ObjectId },\n sentAt: { type: Date, required: true, default: () => new Date() },\n status: { type: String },\n accountId: { type: String },\n senderName: { type: String },\n subject: { type: String },\n subjectIndex: { type: Number },\n bodyIndex: { type: Number },\n preheaderIndex: { type: Number },\n failureReason: { type: String },\n },\n {\n collection: `${collectionPrefix || ''}email_rule_sends`,\n\n statics: {\n findLatestForUser(ruleId: string | Types.ObjectId, userId: string | Types.ObjectId) {\n return this.findOne({ ruleId, userId }).sort({ sentAt: -1 });\n },\n\n findRecentByUserIds(userIds: (string | Types.ObjectId)[], sinceDays: number) {\n const since = new Date(Date.now() - sinceDays * 86400000);\n return this.find({\n userId: { $in: userIds },\n sentAt: { $gte: since }\n }).sort({ sentAt: -1 });\n },\n\n async logSend(\n ruleId: string | Types.ObjectId,\n userId: string | Types.ObjectId,\n emailIdentifierId?: string | Types.ObjectId,\n messageId?: string | Types.ObjectId,\n extra?: { status?: string; accountId?: string; senderName?: string; subject?: string; subjectIndex?: number; bodyIndex?: number; preheaderIndex?: number; failureReason?: string }\n ) {\n return this.create({\n ruleId,\n userId,\n emailIdentifierId,\n messageId,\n sentAt: new Date(),\n ...extra,\n });\n }\n }\n }\n );\n\n schema.index({ ruleId: 1, userId: 1, sentAt: -1 });\n schema.index({ userId: 1, sentAt: -1 });\n schema.index({ ruleId: 1, sentAt: -1 });\n\n return schema;\n}\n","import { Schema, Model, Types, HydratedDocument } from 'mongoose';\nimport { RUN_TRIGGER } from '../constants';\n\nexport interface IEmailRuleRunLog {\n runId?: string;\n runAt: Date;\n triggeredBy: string;\n duration: number;\n rulesProcessed: number;\n status?: string;\n totalStats: {\n matched: number;\n sent: number;\n skipped: number;\n skippedByThrottle: number;\n errors: number;\n };\n perRuleStats: Array<{\n ruleId: Types.ObjectId;\n ruleName: string;\n matched: number;\n sent: number;\n skipped: number;\n skippedByThrottle: number;\n errors: number;\n }>;\n}\n\nexport type EmailRuleRunLogDocument = HydratedDocument<IEmailRuleRunLog>;\n\nexport interface EmailRuleRunLogStatics {\n getRecent(limit?: number): Promise<EmailRuleRunLogDocument[]>;\n getByRuleId(ruleId: string | Types.ObjectId, limit?: number): Promise<EmailRuleRunLogDocument[]>;\n}\n\nexport type EmailRuleRunLogModel = Model<IEmailRuleRunLog> & EmailRuleRunLogStatics;\n\nexport function createEmailRuleRunLogSchema(collectionPrefix?: string) {\n const PerRuleStatsSchema = new Schema({\n ruleId: { type: Schema.Types.ObjectId, ref: 'EmailRule', required: true },\n ruleName: { type: String, required: true },\n matched: { type: Number, default: 0 },\n sent: { type: Number, default: 0 },\n skipped: { type: Number, default: 0 },\n skippedByThrottle: { type: Number, default: 0 },\n errors: { type: Number, default: 0 }\n }, { _id: false });\n\n const TotalStatsSchema = new Schema({\n matched: { type: Number, default: 0 },\n sent: { type: Number, default: 0 },\n skipped: { type: Number, default: 0 },\n skippedByThrottle: { type: Number, default: 0 },\n errors: { type: Number, default: 0 }\n }, { _id: false });\n\n const schema = new Schema<IEmailRuleRunLog>(\n {\n runId: { type: String, index: true },\n runAt: { type: Date, required: true, default: () => new Date() },\n status: { type: String, enum: ['completed', 'cancelled', 'failed'], default: 'completed' },\n triggeredBy: { type: String, enum: Object.values(RUN_TRIGGER), required: true },\n duration: { type: Number, required: true },\n rulesProcessed: { type: Number, required: true },\n totalStats: { type: TotalStatsSchema, required: true },\n perRuleStats: [PerRuleStatsSchema]\n },\n {\n collection: `${collectionPrefix || ''}email_rule_run_logs`,\n\n statics: {\n getRecent(limit = 20) {\n return this.find().sort({ runAt: -1 }).limit(limit);\n },\n\n getByRuleId(ruleId: string | Types.ObjectId, limit = 20) {\n return this.find({ 'perRuleStats.ruleId': ruleId })\n .sort({ runAt: -1 })\n .limit(limit);\n }\n }\n }\n );\n\n schema.index({ runAt: -1 });\n schema.index({ runAt: 1 }, { expireAfterSeconds: 90 * 86400 });\n\n return schema;\n}\n","import { Schema, Model, HydratedDocument } from 'mongoose';\nimport { THROTTLE_WINDOW } from '../constants';\nimport type { EmailThrottleConfig } from '../types/throttle.types';\n\nexport interface IEmailThrottleConfig extends Omit<EmailThrottleConfig, '_id'> {}\n\nexport type EmailThrottleConfigDocument = HydratedDocument<IEmailThrottleConfig>;\n\nexport interface EmailThrottleConfigStatics {\n getConfig(): Promise<EmailThrottleConfigDocument>;\n}\n\nexport type EmailThrottleConfigModel = Model<IEmailThrottleConfig> & EmailThrottleConfigStatics;\n\nexport function createEmailThrottleConfigSchema(collectionPrefix?: string) {\n const schema = new Schema<IEmailThrottleConfig>(\n {\n maxPerUserPerDay: { type: Number, default: 1 },\n maxPerUserPerWeek: { type: Number, default: 2 },\n minGapDays: { type: Number, default: 3 },\n throttleWindow: { type: String, enum: Object.values(THROTTLE_WINDOW), default: THROTTLE_WINDOW.Rolling }\n },\n {\n timestamps: true,\n collection: `${collectionPrefix || ''}email_throttle_config`,\n\n statics: {\n async getConfig() {\n let config = await this.findOne();\n if (!config) {\n config = await this.create({\n maxPerUserPerDay: 1,\n maxPerUserPerWeek: 2,\n minGapDays: 3,\n throttleWindow: THROTTLE_WINDOW.Rolling\n });\n }\n return config;\n }\n }\n }\n );\n\n return schema;\n}\n","import Handlebars from 'handlebars';\nimport mjml2html from 'mjml';\nimport { convert } from 'html-to-text';\n\nexport interface RenderResult {\n html: string;\n text: string;\n subject: string;\n}\n\nexport interface CompiledTemplate {\n subjectFn: HandlebarsTemplateDelegate;\n bodyFn: HandlebarsTemplateDelegate;\n textBodyFn?: HandlebarsTemplateDelegate;\n}\n\nconst MJML_BASE_OPEN = `<mjml>\n <mj-head>\n <mj-attributes>\n <mj-all font-family=\"Arial, sans-serif\" />\n <mj-text font-size=\"15px\" color=\"#333333\" line-height=\"1.6\" />\n </mj-attributes>\n </mj-head>\n <mj-body background-color=\"#ffffff\">\n <mj-section padding=\"20px\">\n <mj-column>\n <mj-text>`;\n\nconst MJML_BASE_CLOSE = ` </mj-text>\n </mj-column>\n </mj-section>\n </mj-body>\n</mjml>`;\n\nconst DATE_FORMAT_OPTIONS: Intl.DateTimeFormatOptions = {\n day: 'numeric',\n month: 'short',\n year: 'numeric'\n};\n\nfunction registerHelpers(): void {\n Handlebars.registerHelper('currency', (val: number) => {\n return `₹${Number(val).toLocaleString('en-IN')}`;\n });\n\n Handlebars.registerHelper('formatDate', (date: string | Date) => {\n const d = new Date(date);\n return d.toLocaleDateString('en-IN', DATE_FORMAT_OPTIONS);\n });\n\n Handlebars.registerHelper('capitalize', (str: string) => {\n if (!str) return '';\n return str.charAt(0).toUpperCase() + str.slice(1);\n });\n\n Handlebars.registerHelper('eq', (a: unknown, b: unknown) => a === b);\n Handlebars.registerHelper('neq', (a: unknown, b: unknown) => a !== b);\n Handlebars.registerHelper('not', (val: unknown) => !val);\n Handlebars.registerHelper('gt', (a: number, b: number) => a > b);\n Handlebars.registerHelper('lt', (a: number, b: number) => a < b);\n Handlebars.registerHelper('gte', (a: number, b: number) => a >= b);\n Handlebars.registerHelper('lte', (a: number, b: number) => a <= b);\n\n Handlebars.registerHelper('lowercase', (str: string) => {\n return str ? str.toLowerCase() : '';\n });\n\n Handlebars.registerHelper('uppercase', (str: string) => {\n return str ? str.toUpperCase() : '';\n });\n\n Handlebars.registerHelper('join', (arr: string[], separator: string) => {\n if (!Array.isArray(arr)) return '';\n const sep = typeof separator === 'string' ? separator : ', ';\n return arr.join(sep);\n });\n\n Handlebars.registerHelper('pluralize', (count: number, singular: string, plural: string) => {\n return count === 1 ? singular : (typeof plural === 'string' ? plural : singular + 's');\n });\n}\n\nlet helpersRegistered = false;\n\nfunction ensureHelpers(): void {\n if (!helpersRegistered) {\n registerHelpers();\n helpersRegistered = true;\n }\n}\n\nfunction wrapInMjml(body: string): string {\n if (body.trim().startsWith('<mjml')) {\n return body;\n }\n return `${MJML_BASE_OPEN}${body}${MJML_BASE_CLOSE}`;\n}\n\nfunction compileMjml(mjmlSource: string): string {\n const result = mjml2html(mjmlSource, {\n validationLevel: 'soft',\n minify: false\n });\n if (result.errors && result.errors.length > 0) {\n const criticalErrors = result.errors.filter((e: any) => e.tagName !== undefined);\n if (criticalErrors.length > 0) {\n throw new Error(`MJML compilation errors: ${criticalErrors.map(e => e.message).join('; ')}`);\n }\n }\n return result.html;\n}\n\nfunction htmlToPlainText(html: string): string {\n return convert(html, {\n wordwrap: 80,\n selectors: [\n { selector: 'a', options: { hideLinkHrefIfSameAsText: true } },\n { selector: 'img', format: 'skip' }\n ]\n });\n}\n\nexport class TemplateRenderService {\n constructor() {\n ensureHelpers();\n }\n\n renderSingle(\n subject: string,\n body: string,\n data: Record<string, unknown>,\n textBody?: string\n ): RenderResult {\n const subjectFn = Handlebars.compile(subject, { strict: true });\n const resolvedSubject = subjectFn(data);\n\n const bodyFn = Handlebars.compile(body, { strict: true });\n const resolvedBody = bodyFn(data);\n\n const mjmlSource = wrapInMjml(resolvedBody);\n const html = compileMjml(mjmlSource);\n\n let text: string;\n if (textBody) {\n const textFn = Handlebars.compile(textBody, { strict: true });\n text = textFn(data);\n } else {\n text = htmlToPlainText(html);\n }\n\n return { html, text, subject: resolvedSubject };\n }\n\n compileBatch(subject: string, body: string, textBody?: string): CompiledTemplate {\n const mjmlSource = wrapInMjml(body);\n const htmlWithHandlebars = compileMjml(mjmlSource);\n\n const subjectFn = Handlebars.compile(subject, { strict: true });\n const bodyFn = Handlebars.compile(htmlWithHandlebars, { strict: true });\n const textBodyFn = textBody ? Handlebars.compile(textBody, { strict: true }) : undefined;\n\n return { subjectFn, bodyFn, textBodyFn };\n }\n\n compileBatchVariants(\n subjects: string[],\n bodies: string[],\n textBody?: string,\n preheaders?: string[]\n ): { subjectFns: HandlebarsTemplateDelegate[]; bodyFns: HandlebarsTemplateDelegate[]; textBodyFn?: HandlebarsTemplateDelegate; preheaderFns?: HandlebarsTemplateDelegate[] } {\n const subjectFns = subjects.map(s => Handlebars.compile(s, { strict: true }));\n const bodyFns = bodies.map(b => {\n const mjmlSource = wrapInMjml(b);\n const htmlWithHandlebars = compileMjml(mjmlSource);\n return Handlebars.compile(htmlWithHandlebars, { strict: true });\n });\n const textBodyFn = textBody ? Handlebars.compile(textBody, { strict: true }) : undefined;\n const preheaderFns = preheaders && preheaders.length > 0\n ? preheaders.map(p => Handlebars.compile(p, { strict: true }))\n : undefined;\n return { subjectFns, bodyFns, textBodyFn, preheaderFns };\n }\n\n renderFromCompiled(\n compiled: CompiledTemplate,\n data: Record<string, unknown>\n ): RenderResult {\n const subject = compiled.subjectFn(data);\n const html = compiled.bodyFn(data);\n const text = compiled.textBodyFn\n ? compiled.textBodyFn(data)\n : htmlToPlainText(html);\n\n return { html, text, subject };\n }\n\n renderPreview(\n subject: string,\n body: string,\n data: Record<string, unknown>,\n textBody?: string\n ): RenderResult {\n return this.renderSingle(subject, body, data, textBody);\n }\n\n htmlToText(html: string): string {\n return htmlToPlainText(html);\n }\n\n extractVariables(template: string): string[] {\n const regex = /\\{\\{(?!#|\\/|!|>)([^}]+)\\}\\}/g;\n const variables = new Set<string>();\n let match: RegExpExecArray | null;\n\n while ((match = regex.exec(template)) !== null) {\n const variable = match[1].trim();\n if (!variable.startsWith('else')) {\n variables.add(variable);\n }\n }\n\n return Array.from(variables).sort();\n }\n\n validateTemplate(body: string): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n try {\n Handlebars.precompile(body);\n } catch (e) {\n errors.push(`Handlebars syntax error: ${(e as Error).message}`);\n }\n\n const mjmlSource = wrapInMjml(body);\n try {\n const result = mjml2html(mjmlSource, { validationLevel: 'strict' });\n if (result.errors && result.errors.length > 0) {\n for (const err of result.errors) {\n errors.push(`MJML error: ${err.message}`);\n }\n }\n } catch (e) {\n errors.push(`MJML compilation error: ${(e as Error).message}`);\n }\n\n return { valid: errors.length === 0, errors };\n }\n}\n","import { AlxError } from '@astralibx/core';\n\nexport class AlxEmailError extends AlxError {\n constructor(message: string, code: string) {\n super(message, code);\n this.name = 'AlxEmailError';\n }\n}\n\nexport class ConfigValidationError extends AlxEmailError {\n constructor(message: string, public readonly field: string) {\n super(message, 'CONFIG_VALIDATION');\n this.name = 'ConfigValidationError';\n }\n}\n\nexport class TemplateNotFoundError extends AlxEmailError {\n constructor(public readonly templateId: string) {\n super(`Template not found: ${templateId}`, 'TEMPLATE_NOT_FOUND');\n this.name = 'TemplateNotFoundError';\n }\n}\n\nexport class TemplateSyntaxError extends AlxEmailError {\n constructor(message: string, public readonly errors: string[]) {\n super(message, 'TEMPLATE_SYNTAX');\n this.name = 'TemplateSyntaxError';\n }\n}\n\nexport class RuleNotFoundError extends AlxEmailError {\n constructor(public readonly ruleId: string) {\n super(`Rule not found: ${ruleId}`, 'RULE_NOT_FOUND');\n this.name = 'RuleNotFoundError';\n }\n}\n\nexport class RuleTemplateIncompatibleError extends AlxEmailError {\n constructor(public readonly reason: string) {\n super(`Rule-template incompatibility: ${reason}`, 'RULE_TEMPLATE_INCOMPATIBLE');\n this.name = 'RuleTemplateIncompatibleError';\n }\n}\n\nexport class LockAcquisitionError extends AlxEmailError {\n constructor() {\n super('Could not acquire distributed lock — another run is in progress', 'LOCK_ACQUISITION');\n this.name = 'LockAcquisitionError';\n }\n}\n\nexport class DuplicateSlugError extends AlxEmailError {\n constructor(public readonly slug: string) {\n super(`Template with slug \"${slug}\" already exists`, 'DUPLICATE_SLUG');\n this.name = 'DuplicateSlugError';\n }\n}\n","import { TemplateRenderService } from './template-render.service';\nimport type { EmailTemplateModel, EmailTemplateDocument } from '../schemas/template.schema';\nimport type { CreateEmailTemplateInput, UpdateEmailTemplateInput } from '../types/template.types';\nimport type { EmailRuleEngineConfig } from '../types/config.types';\nimport { DuplicateSlugError, TemplateSyntaxError, TemplateNotFoundError } from '../errors';\n\nconst UPDATEABLE_FIELDS = new Set([\n 'name', 'description', 'category', 'audience', 'platform',\n 'textBody', 'subjects', 'bodies', 'preheaders', 'variables', 'isActive', 'fields'\n]);\n\nfunction slugify(name: string): string {\n return name\n .toLowerCase()\n .trim()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n}\n\nexport class TemplateService {\n private renderService = new TemplateRenderService();\n\n constructor(\n private EmailTemplate: EmailTemplateModel,\n private config: EmailRuleEngineConfig\n ) {}\n\n async list(filters?: {\n category?: string;\n audience?: string;\n platform?: string;\n isActive?: boolean;\n }): Promise<EmailTemplateDocument[]> {\n const query: Record<string, unknown> = {};\n\n if (filters?.category) query['category'] = filters.category;\n if (filters?.audience) query['audience'] = filters.audience;\n if (filters?.platform) query['platform'] = filters.platform;\n if (filters?.isActive !== undefined) query['isActive'] = filters.isActive;\n\n return this.EmailTemplate.find(query).sort({ category: 1, name: 1 });\n }\n\n async getById(id: string): Promise<EmailTemplateDocument | null> {\n return this.EmailTemplate.findById(id);\n }\n\n async getBySlug(slug: string): Promise<EmailTemplateDocument | null> {\n return this.EmailTemplate.findBySlug(slug);\n }\n\n async create(input: CreateEmailTemplateInput): Promise<EmailTemplateDocument> {\n const slug = input.slug || slugify(input.name);\n\n const existing = await this.EmailTemplate.findBySlug(slug);\n if (existing) {\n throw new DuplicateSlugError(slug);\n }\n\n const { subjects, bodies } = input;\n if (subjects.length === 0) throw new TemplateSyntaxError('At least one subject is required', ['At least one subject is required']);\n if (bodies.length === 0) throw new TemplateSyntaxError('At least one body is required', ['At least one body is required']);\n\n for (const b of bodies) {\n const validation = this.renderService.validateTemplate(b);\n if (!validation.valid) {\n throw new TemplateSyntaxError(`Template validation failed: ${validation.errors.join('; ')}`, validation.errors);\n }\n }\n\n const allContent = [...subjects, ...bodies, ...(input.preheaders || []), input.textBody || ''].join(' ');\n const variables = input.variables || this.renderService.extractVariables(allContent);\n\n return this.EmailTemplate.createTemplate({\n ...input,\n slug,\n subjects,\n bodies,\n variables\n });\n }\n\n async update(id: string, input: UpdateEmailTemplateInput): Promise<EmailTemplateDocument | null> {\n const template = await this.EmailTemplate.findById(id);\n if (!template) return null;\n\n if (input.subjects && input.subjects.length === 0) {\n throw new TemplateSyntaxError('At least one subject is required', ['At least one subject is required']);\n }\n if (input.bodies && input.bodies.length === 0) {\n throw new TemplateSyntaxError('At least one body is required', ['At least one body is required']);\n }\n\n const bodiesToValidate = input.bodies || null;\n if (bodiesToValidate) {\n for (const b of bodiesToValidate) {\n const validation = this.renderService.validateTemplate(b);\n if (!validation.valid) {\n throw new TemplateSyntaxError(`Template validation failed: ${validation.errors.join('; ')}`, validation.errors);\n }\n }\n }\n\n if (input.textBody || input.subjects || input.bodies || input.preheaders) {\n const subjects = input.subjects ?? template.subjects;\n const bodies = input.bodies ?? template.bodies;\n const preheaders = input.preheaders ?? (template as any).preheaders ?? [];\n const textBody = input.textBody ?? template.textBody;\n\n const allContent = [...subjects, ...bodies, ...preheaders, textBody || ''].join(' ');\n input.variables = this.renderService.extractVariables(allContent);\n }\n\n const setFields: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(input)) {\n if (value !== undefined && UPDATEABLE_FIELDS.has(key)) {\n setFields[key] = value;\n }\n }\n\n const update: Record<string, unknown> = { $set: setFields };\n if (input.textBody || input.subjects || input.bodies || input.preheaders) {\n update['$inc'] = { version: 1 };\n }\n\n return this.EmailTemplate.findByIdAndUpdate(\n id,\n update,\n { new: true }\n );\n }\n\n async delete(id: string): Promise<boolean> {\n const result = await this.EmailTemplate.findByIdAndDelete(id);\n return result !== null;\n }\n\n async toggleActive(id: string): Promise<EmailTemplateDocument | null> {\n const template = await this.EmailTemplate.findById(id);\n if (!template) return null;\n\n template.isActive = !template.isActive;\n await template.save();\n return template;\n }\n\n async preview(\n id: string,\n sampleData: Record<string, unknown>\n ): Promise<{ html: string; text: string; subject: string } | null> {\n const template = await this.EmailTemplate.findById(id);\n if (!template) return null;\n\n return this.renderService.renderPreview(\n template.subjects[0],\n template.bodies[0],\n sampleData,\n template.textBody\n );\n }\n\n async previewRaw(\n subject: string,\n body: string,\n sampleData: Record<string, unknown>,\n textBody?: string\n ): Promise<{ html: string; text: string; subject: string }> {\n return this.renderService.renderPreview(subject, body, sampleData, textBody);\n }\n\n async validate(body: string): Promise<{ valid: boolean; errors: string[]; variables: string[] }> {\n const validation = this.renderService.validateTemplate(body);\n const variables = this.renderService.extractVariables(body);\n return { ...validation, variables };\n }\n\n async sendTestEmail(\n id: string,\n testEmail: string,\n sampleData: Record<string, unknown>\n ): Promise<{ success: boolean; error?: string }> {\n if (!this.config.adapters.sendTestEmail) {\n return { success: false, error: 'Test email sending not configured' };\n }\n\n const template = await this.EmailTemplate.findById(id);\n if (!template) {\n return { success: false, error: 'Template not found' };\n }\n\n const rendered = this.renderService.renderSingle(\n template.subjects[0],\n template.bodies[0],\n sampleData,\n template.textBody\n );\n\n try {\n await this.config.adapters.sendTestEmail(\n testEmail,\n `[TEST] ${rendered.subject}`,\n rendered.html,\n rendered.text\n );\n return { success: true };\n } catch (error) {\n return { success: false, error: (error as Error).message };\n }\n }\n}\n","import type { EmailRuleModel, EmailRuleDocument } from '../schemas/rule.schema';\nimport type { EmailTemplateModel, EmailTemplateDocument } from '../schemas/template.schema';\nimport type { EmailRuleRunLogModel } from '../schemas/run-log.schema';\nimport type { CreateEmailRuleInput, UpdateEmailRuleInput, RuleTarget, QueryTarget } from '../types/rule.types';\nimport type { EmailRuleEngineConfig } from '../types/config.types';\nimport { TemplateNotFoundError, RuleNotFoundError, RuleTemplateIncompatibleError } from '../errors';\n\nfunction isQueryTarget(target: RuleTarget): target is QueryTarget {\n return !target.mode || target.mode === 'query';\n}\n\nconst UPDATEABLE_FIELDS = new Set([\n 'name', 'description', 'sortOrder', 'target', 'templateId',\n 'sendOnce', 'resendAfterDays', 'cooldownDays', 'autoApprove',\n 'maxPerRun', 'bypassThrottle', 'emailType',\n 'validFrom', 'validTill'\n]);\n\nfunction validateRuleTemplateCompat(\n targetRole: string,\n targetPlatform: string,\n template: EmailTemplateDocument\n): string | null {\n const templateAudience = template.audience;\n const templatePlatform = template.platform;\n\n if (templateAudience !== 'all') {\n if (targetRole === 'all') {\n return `Template \"${template.name}\" targets ${templateAudience} only, but rule targets all users`;\n }\n if (targetRole !== templateAudience) {\n return `Template targets ${templateAudience}, but rule targets ${targetRole}`;\n }\n }\n\n if (templatePlatform !== 'both') {\n if (targetPlatform === 'both') {\n return `Template is for ${templatePlatform} only, but rule targets all platforms`;\n }\n if (templatePlatform !== targetPlatform) {\n return `Template is for ${templatePlatform}, but rule targets ${targetPlatform}`;\n }\n }\n\n return null;\n}\n\nexport class RuleService {\n constructor(\n private EmailRule: EmailRuleModel,\n private EmailTemplate: EmailTemplateModel,\n private EmailRuleRunLog: EmailRuleRunLogModel,\n private config: EmailRuleEngineConfig\n ) {}\n\n async list(): Promise<EmailRuleDocument[]> {\n return this.EmailRule.find()\n .populate('templateId', 'name slug')\n .sort({ sortOrder: 1, createdAt: -1 });\n }\n\n async getById(id: string): Promise<EmailRuleDocument | null> {\n return this.EmailRule.findById(id);\n }\n\n async create(input: CreateEmailRuleInput): Promise<EmailRuleDocument> {\n const template = await this.EmailTemplate.findById(input.templateId);\n if (!template) {\n throw new TemplateNotFoundError(input.templateId);\n }\n\n if (isQueryTarget(input.target)) {\n if (!input.target.role || !input.target.platform) {\n throw new RuleTemplateIncompatibleError('target.role and target.platform are required for query mode, validation failed');\n }\n const compatError = validateRuleTemplateCompat(\n input.target.role,\n input.target.platform,\n template\n );\n if (compatError) {\n throw new RuleTemplateIncompatibleError(compatError);\n }\n } else {\n if (!input.target.identifiers || input.target.identifiers.length === 0) {\n throw new RuleTemplateIncompatibleError('target.identifiers must be a non-empty array for list mode, validation failed');\n }\n }\n\n return this.EmailRule.createRule(input);\n }\n\n async update(id: string, input: UpdateEmailRuleInput): Promise<EmailRuleDocument | null> {\n const rule = await this.EmailRule.findById(id);\n if (!rule) return null;\n\n const templateId = input.templateId ?? rule.templateId.toString();\n\n if (input.target) {\n if (isQueryTarget(input.target)) {\n if (!input.target.role || !input.target.platform) {\n throw new RuleTemplateIncompatibleError('target.role and target.platform are required for query mode, validation failed');\n }\n } else {\n if (!input.target.identifiers || input.target.identifiers.length === 0) {\n throw new RuleTemplateIncompatibleError('target.identifiers must be a non-empty array for list mode, validation failed');\n }\n }\n }\n\n const effectiveTarget = input.target ?? rule.target;\n\n if ((input.templateId || input.target) && isQueryTarget(effectiveTarget as RuleTarget)) {\n const qt = effectiveTarget as QueryTarget;\n const template = await this.EmailTemplate.findById(templateId);\n if (!template) {\n throw new TemplateNotFoundError(templateId);\n }\n\n const compatError = validateRuleTemplateCompat(qt.role, qt.platform, template);\n if (compatError) {\n throw new RuleTemplateIncompatibleError(compatError);\n }\n }\n\n const setFields: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(input)) {\n if (value !== undefined && UPDATEABLE_FIELDS.has(key)) {\n setFields[key] = value;\n }\n }\n\n return this.EmailRule.findByIdAndUpdate(\n id,\n { $set: setFields },\n { new: true }\n );\n }\n\n async delete(id: string): Promise<{ deleted: boolean; disabled?: boolean }> {\n const rule = await this.EmailRule.findById(id);\n if (!rule) return { deleted: false };\n\n if (rule.totalSent > 0) {\n rule.isActive = false;\n await rule.save();\n return { deleted: false, disabled: true };\n }\n\n await this.EmailRule.findByIdAndDelete(id);\n return { deleted: true };\n }\n\n async toggleActive(id: string): Promise<EmailRuleDocument | null> {\n const rule = await this.EmailRule.findById(id);\n if (!rule) return null;\n\n if (!rule.isActive) {\n const template = await this.EmailTemplate.findById(rule.templateId);\n if (!template) {\n throw new TemplateNotFoundError(rule.templateId.toString());\n }\n if (!template.isActive) {\n throw new RuleTemplateIncompatibleError('Cannot activate rule: linked template is inactive');\n }\n }\n\n rule.isActive = !rule.isActive;\n await rule.save();\n return rule;\n }\n\n async dryRun(id: string): Promise<{ matchedCount: number; ruleId: string }> {\n const rule = await this.EmailRule.findById(id);\n if (!rule) {\n throw new RuleNotFoundError(id);\n }\n\n const target = rule.target as unknown as RuleTarget;\n if (target.mode === 'list') {\n const identifiers = (target as any).identifiers || [];\n return { matchedCount: identifiers.length, ruleId: id };\n }\n\n const users = await this.config.adapters.queryUsers(rule.target, 50000);\n return { matchedCount: users.length, ruleId: id };\n }\n\n async getRunHistory(limit = 20): Promise<unknown[]> {\n return this.EmailRuleRunLog.getRecent(limit);\n }\n}\n","import crypto from 'crypto';\nimport type { Redis } from 'ioredis';\nimport type { LogAdapter } from '../types/config.types';\n\nexport class RedisLock {\n private lockValue = '';\n\n constructor(\n private redis: Redis,\n private lockKey: string,\n private ttlMs: number,\n private logger?: LogAdapter\n ) {}\n\n async acquire(): Promise<boolean> {\n this.lockValue = crypto.randomUUID();\n const result = await this.redis.set(this.lockKey, this.lockValue, 'PX', this.ttlMs, 'NX');\n return result === 'OK';\n }\n\n async release(): Promise<void> {\n try {\n const script = \"if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end\";\n await this.redis.eval(script, 1, this.lockKey, this.lockValue);\n } catch (err) {\n this.logger?.error('Failed to release lock', { error: err });\n }\n }\n}\n","import { TemplateRenderService } from './template-render.service';\nimport { RedisLock } from '../utils/redis-lock';\nimport type { EmailRuleModel } from '../schemas/rule.schema';\nimport type { EmailTemplateModel } from '../schemas/template.schema';\nimport type { EmailRuleSendModel } from '../schemas/rule-send.schema';\nimport type { EmailRuleRunLogModel } from '../schemas/run-log.schema';\nimport type { EmailThrottleConfigModel } from '../schemas/throttle-config.schema';\nimport { RUN_TRIGGER, EMAIL_TYPE } from '../constants';\nimport type { RunTrigger } from '../constants';\nimport type { RuleRunStats, PerRuleStats } from '../types/rule.types';\nimport crypto from 'crypto';\nimport type { Redis } from 'ioredis';\nimport type { EmailRuleEngineConfig, LogAdapter, RunStatusResponse } from '../types/config.types';\n\nconst MS_PER_DAY = 86400000;\nconst DEFAULT_LOCK_TTL_MS = 30 * 60 * 1000;\nconst IDENTIFIER_CHUNK_SIZE = 50;\n\nfunction getLocalDate(date: Date, timezone?: string): Date {\n if (!timezone) return date;\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone: timezone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false\n }).formatToParts(date);\n\n const get = (type: string) => parts.find(p => p.type === type)?.value || '0';\n return new Date(`${get('year')}-${get('month')}-${get('day')}T${get('hour')}:${get('minute')}:${get('second')}`);\n}\n\nasync function processInChunks<T, R>(items: T[], fn: (item: T) => Promise<R>, chunkSize: number): Promise<R[]> {\n const results: R[] = [];\n for (let i = 0; i < items.length; i += chunkSize) {\n const chunk = items.slice(i, i + chunkSize);\n const chunkResults = await Promise.all(chunk.map(fn));\n results.push(...chunkResults);\n }\n return results;\n}\n\ninterface UserThrottle {\n today: number;\n thisWeek: number;\n lastSentDate: Date | null;\n}\n\nconst defaultLogger: LogAdapter = {\n info: () => {},\n warn: () => {},\n error: () => {}\n};\n\nexport class RuleRunnerService {\n private templateRenderer = new TemplateRenderService();\n private lock: RedisLock;\n private logger: LogAdapter;\n private redis: Redis;\n private keyPrefix: string;\n\n constructor(\n private EmailRule: EmailRuleModel,\n private EmailTemplate: EmailTemplateModel,\n private EmailRuleSend: EmailRuleSendModel,\n private EmailRuleRunLog: EmailRuleRunLogModel,\n private EmailThrottleConfig: EmailThrottleConfigModel,\n private config: EmailRuleEngineConfig\n ) {\n this.keyPrefix = config.redis.keyPrefix || '';\n this.redis = config.redis.connection;\n const lockTTL = config.options?.lockTTLMs || DEFAULT_LOCK_TTL_MS;\n this.lock = new RedisLock(\n this.redis,\n `${this.keyPrefix}email-rule-runner:lock`,\n lockTTL,\n config.logger\n );\n this.logger = config.logger || defaultLogger;\n }\n\n async runAllRules(triggeredBy: RunTrigger = RUN_TRIGGER.Cron, runId?: string): Promise<{ runId: string }> {\n if (!runId) runId = crypto.randomUUID();\n const startedAt = new Date().toISOString();\n\n if (this.config.options?.sendWindow) {\n const { startHour, endHour, timezone } = this.config.options.sendWindow;\n const now = new Date();\n const formatter = new Intl.DateTimeFormat('en-US', { hour: 'numeric', hour12: false, timeZone: timezone });\n const currentHour = parseInt(formatter.format(now), 10);\n if (currentHour < startHour || currentHour >= endHour) {\n this.logger.info('Outside send window, skipping run', { currentHour, startHour, endHour, timezone });\n return { runId };\n }\n }\n\n const lockAcquired = await this.lock.acquire();\n if (!lockAcquired) {\n this.logger.warn('Rule runner already executing, skipping');\n return { runId };\n }\n\n const runStartTime = Date.now();\n\n await this.updateRunProgress(runId, {\n runId,\n status: 'running',\n currentRule: '',\n progress: { rulesTotal: 0, rulesCompleted: 0, sent: 0, failed: 0, skipped: 0, invalid: 0 },\n startedAt,\n elapsed: 0\n });\n\n let runStatus: 'completed' | 'cancelled' | 'failed' = 'completed';\n\n try {\n const throttleConfig = await this.EmailThrottleConfig.getConfig();\n const allActiveRules = await this.EmailRule.findActive();\n\n const now = new Date();\n const tz = this.config.options?.sendWindow?.timezone;\n const activeRules = allActiveRules.filter(rule => {\n if (rule.validFrom) {\n const localNow = getLocalDate(now, tz);\n const localValidFrom = getLocalDate(new Date(rule.validFrom), tz);\n if (localNow < localValidFrom) return false;\n }\n if (rule.validTill) {\n const localNow = getLocalDate(now, tz);\n const localValidTill = getLocalDate(new Date(rule.validTill), tz);\n if (localNow > localValidTill) return false;\n }\n return true;\n });\n\n this.config.hooks?.onRunStart?.({ rulesCount: activeRules.length, triggeredBy });\n\n await this.updateRunProgress(runId, {\n progress: { rulesTotal: activeRules.length, rulesCompleted: 0, sent: 0, failed: 0, skipped: 0, invalid: 0 }\n } as Partial<RunStatusResponse>);\n\n if (activeRules.length === 0) {\n this.logger.info('No active rules to process');\n await this.EmailRuleRunLog.create({\n runId,\n runAt: new Date(),\n triggeredBy,\n duration: Date.now() - runStartTime,\n rulesProcessed: 0,\n totalStats: { matched: 0, sent: 0, skipped: 0, skippedByThrottle: 0, errors: 0 },\n perRuleStats: [],\n status: 'completed'\n });\n await this.updateRunProgress(runId, { status: 'completed', elapsed: Date.now() - runStartTime } as Partial<RunStatusResponse>);\n return { runId };\n }\n\n const templateIds = [...new Set(activeRules.map(r => r.templateId.toString()))];\n const templates = await this.EmailTemplate.find({ _id: { $in: templateIds } }).lean();\n const templateMap = new Map<string, any>();\n for (const t of templates) {\n templateMap.set(t._id.toString(), t);\n }\n\n const recentSends = await this.EmailRuleSend.find({\n sentAt: { $gte: new Date(Date.now() - 7 * MS_PER_DAY) }\n }).lean();\n\n const throttleMap = this.buildThrottleMap(recentSends);\n const perRuleStats: PerRuleStats[] = [];\n let totalSent = 0;\n let totalFailed = 0;\n let totalSkipped = 0;\n let totalInvalid = 0;\n\n for (let ri = 0; ri < activeRules.length; ri++) {\n const rule = activeRules[ri];\n\n const cancelKey = `${this.keyPrefix}run:${runId}:cancel`;\n const cancelled = await this.redis.exists(cancelKey);\n if (cancelled) {\n runStatus = 'cancelled';\n break;\n }\n\n await this.updateRunProgress(runId, {\n currentRule: rule.name,\n elapsed: Date.now() - runStartTime\n } as Partial<RunStatusResponse>);\n\n const stats = await this.executeRule(rule, throttleMap, throttleConfig, templateMap, runId);\n totalSent += stats.sent;\n totalFailed += stats.errors;\n totalSkipped += stats.skipped + stats.skippedByThrottle;\n totalInvalid += stats.matched - stats.sent - stats.skipped - stats.skippedByThrottle - stats.errors;\n\n perRuleStats.push({\n ruleId: rule._id.toString(),\n ruleName: rule.name,\n ...stats\n });\n\n await this.updateRunProgress(runId, {\n progress: {\n rulesTotal: activeRules.length,\n rulesCompleted: ri + 1,\n sent: totalSent,\n failed: totalFailed,\n skipped: totalSkipped,\n invalid: totalInvalid < 0 ? 0 : totalInvalid\n },\n elapsed: Date.now() - runStartTime\n } as Partial<RunStatusResponse>);\n }\n\n const totalStats = perRuleStats.reduce(\n (acc, s) => ({\n matched: acc.matched + s.matched,\n sent: acc.sent + s.sent,\n skipped: acc.skipped + s.skipped,\n skippedByThrottle: acc.skippedByThrottle + s.skippedByThrottle,\n errors: acc.errors + s.errors,\n }),\n { matched: 0, sent: 0, skipped: 0, skippedByThrottle: 0, errors: 0 }\n );\n\n await this.EmailRuleRunLog.create({\n runId,\n runAt: new Date(),\n triggeredBy,\n duration: Date.now() - runStartTime,\n rulesProcessed: activeRules.length,\n totalStats,\n perRuleStats,\n status: runStatus\n });\n\n await this.updateRunProgress(runId, { status: runStatus, currentRule: '', elapsed: Date.now() - runStartTime } as Partial<RunStatusResponse>);\n\n this.config.hooks?.onRunComplete?.({ duration: Date.now() - runStartTime, totalStats, perRuleStats });\n\n this.logger.info('Rule run completed', {\n triggeredBy,\n rulesProcessed: activeRules.length,\n totalSent: totalStats.sent,\n totalSkipped: totalStats.skipped,\n duration: Date.now() - runStartTime\n });\n } catch (err) {\n runStatus = 'failed';\n await this.updateRunProgress(runId, { status: 'failed', elapsed: Date.now() - runStartTime } as Partial<RunStatusResponse>);\n throw err;\n } finally {\n await this.lock.release();\n }\n\n return { runId };\n }\n\n async executeRule(\n rule: any,\n throttleMap: Map<string, UserThrottle>,\n throttleConfig: any,\n templateMap?: Map<string, any>,\n runId?: string\n ): Promise<RuleRunStats> {\n const stats: RuleRunStats = { matched: 0, sent: 0, skipped: 0, skippedByThrottle: 0, errors: 0 };\n\n const template = templateMap?.get(rule.templateId.toString()) ?? await this.EmailTemplate.findById(rule.templateId);\n if (!template) {\n this.logger.error(`Rule \"${rule.name}\": template ${rule.templateId} not found`);\n stats.errors = 1;\n return stats;\n }\n\n const isListMode = rule.target?.mode === 'list';\n\n if (isListMode) {\n return this.executeListMode(rule, template, throttleMap, throttleConfig, stats, runId);\n }\n\n return this.executeQueryMode(rule, template, throttleMap, throttleConfig, stats, runId);\n }\n\n private async executeListMode(\n rule: any,\n template: any,\n throttleMap: Map<string, UserThrottle>,\n throttleConfig: any,\n stats: RuleRunStats,\n runId?: string\n ): Promise<RuleRunStats> {\n const rawIdentifiers: string[] = rule.target.identifiers || [];\n const uniqueEmails = [...new Set(rawIdentifiers.map((e: string) => e.toLowerCase().trim()).filter(Boolean))];\n\n const limit = rule.maxPerRun || this.config.options?.defaultMaxPerRun || 500;\n const emailsToProcess = uniqueEmails.slice(0, limit);\n\n stats.matched = emailsToProcess.length;\n const ruleId = rule._id.toString();\n const templateId = rule.templateId.toString();\n\n this.config.hooks?.onRuleStart?.({ ruleId, ruleName: rule.name, matchedCount: emailsToProcess.length });\n if (emailsToProcess.length === 0) return stats;\n\n const identifierResults = await processInChunks(\n emailsToProcess,\n async email => {\n const result = await this.config.adapters.findIdentifier(email);\n return result ? { email, ...result } : null;\n },\n IDENTIFIER_CHUNK_SIZE\n );\n\n const identifierMap = new Map<string, { id: string; contactId: string }>();\n for (const result of identifierResults) {\n if (result) {\n identifierMap.set(result.email, { id: result.id, contactId: result.contactId });\n }\n }\n\n const validEmails = emailsToProcess.filter(e => identifierMap.has(e));\n const identifierIds = validEmails.map(e => identifierMap.get(e)!.id);\n\n const allRuleSends = await this.EmailRuleSend.find({ ruleId: rule._id, userId: { $in: identifierIds } })\n .sort({ sentAt: -1 })\n .lean();\n\n const sendMap = new Map<string, any>();\n for (const send of allRuleSends) {\n const uid = send.userId.toString();\n if (!sendMap.has(uid)) {\n sendMap.set(uid, send);\n }\n }\n\n const preheaders: string[] = template.preheaders || [];\n const compiledVariants = this.templateRenderer.compileBatchVariants(\n template.subjects,\n template.bodies,\n template.textBody,\n preheaders\n );\n\n let totalProcessed = 0;\n\n for (let i = 0; i < emailsToProcess.length; i++) {\n const email = emailsToProcess[i];\n\n if (runId && i % 10 === 0) {\n const cancelKey = `${this.keyPrefix}run:${runId}:cancel`;\n const cancelled = await this.redis.exists(cancelKey);\n if (cancelled) break;\n }\n\n try {\n const identifier = identifierMap.get(email);\n if (!identifier) {\n stats.skipped++;\n this.config.hooks?.onSend?.({ ruleId, ruleName: rule.name, email, status: 'invalid' });\n continue;\n }\n\n const dedupKey = identifier.id;\n\n const lastSend = sendMap.get(dedupKey);\n if (lastSend) {\n if (rule.sendOnce && !rule.resendAfterDays) {\n stats.skipped++;\n this.config.hooks?.onSend?.({ ruleId, ruleName: rule.name, email, status: 'skipped' });\n continue;\n }\n if (rule.resendAfterDays) {\n const daysSince = (Date.now() - new Date(lastSend.sentAt).getTime()) / MS_PER_DAY;\n if (daysSince < rule.resendAfterDays) {\n stats.skipped++;\n this.config.hooks?.onSend?.({ ruleId, ruleName: rule.name, email, status: 'skipped' });\n continue;\n }\n } else {\n stats.skipped++;\n this.config.hooks?.onSend?.({ ruleId, ruleName: rule.name, email, status: 'skipped' });\n continue;\n }\n }\n\n if (!this.checkThrottle(rule, dedupKey, email, throttleMap, throttleConfig, stats)) continue;\n\n const agentSelection = await this.config.adapters.selectAgent(identifier.id, { ruleId, templateId });\n if (!agentSelection) {\n stats.skipped++;\n this.config.hooks?.onSend?.({ ruleId, ruleName: rule.name, email, status: 'skipped' });\n continue;\n }\n\n const user = { _id: identifier.id, email };\n const resolvedData = this.config.adapters.resolveData(user);\n const templateData = { ...(template.fields || {}), ...resolvedData };\n\n const si = Math.floor(Math.random() * compiledVariants.subjectFns.length);\n const bi = Math.floor(Math.random() * compiledVariants.bodyFns.length);\n\n const renderedSubject = compiledVariants.subjectFns[si](templateData);\n const renderedHtml = compiledVariants.bodyFns[bi](templateData);\n const renderedText = compiledVariants.textBodyFn\n ? compiledVariants.textBodyFn(templateData)\n : this.templateRenderer.htmlToText(renderedHtml);\n\n let finalHtml = renderedHtml;\n let finalText = renderedText;\n let finalSubject = renderedSubject;\n\n let pi: number | undefined;\n if (compiledVariants.preheaderFns && compiledVariants.preheaderFns.length > 0) {\n pi = Math.floor(Math.random() * compiledVariants.preheaderFns.length);\n const renderedPreheader = compiledVariants.preheaderFns[pi](templateData);\n if (renderedPreheader) {\n const preheaderHtml = `<div style=\"display:none;font-size:1px;color:#ffffff;line-height:1px;max-height:0px;max-width:0px;opacity:0;overflow:hidden;\">${renderedPreheader}</div>`;\n finalHtml = finalHtml.replace(/(<body[^>]*>)/i, `$1${preheaderHtml}`);\n }\n }\n\n if (this.config.hooks?.beforeSend) {\n try {\n const modified = await this.config.hooks.beforeSend({\n htmlBody: finalHtml,\n textBody: finalText,\n subject: finalSubject,\n account: {\n id: agentSelection.accountId,\n email: agentSelection.email,\n metadata: agentSelection.metadata,\n },\n user: {\n id: dedupKey,\n email,\n name: '',\n },\n });\n finalHtml = modified.htmlBody;\n finalText = modified.textBody;\n finalSubject = modified.subject;\n } catch (hookErr: any) {\n this.logger.error(`beforeSend hook failed for email ${email}: ${hookErr.message}`);\n stats.errors++;\n this.config.hooks?.onSend?.({ ruleId, ruleName: rule.name, email, status: 'error' });\n continue;\n }\n }\n\n await this.config.adapters.sendEmail({\n identifierId: identifier.id,\n contactId: identifier.contactId,\n accountId: agentSelection.accountId,\n subject: finalSubject,\n htmlBody: finalHtml,\n textBody: finalText,\n ruleId,\n autoApprove: rule.autoApprove ?? true\n });\n\n await this.EmailRuleSend.logSend(\n ruleId,\n dedupKey,\n identifier.id,\n undefined,\n { status: 'sent', accountId: agentSelection.accountId, subject: finalSubject, subjectIndex: si, bodyIndex: bi, preheaderIndex: pi }\n );\n\n const current = throttleMap.get(dedupKey) || { today: 0, thisWeek: 0, lastSentDate: null };\n throttleMap.set(dedupKey, {\n today: current.today + 1,\n thisWeek: current.thisWeek + 1,\n lastSentDate: new Date()\n });\n\n stats.sent++;\n this.config.hooks?.onSend?.({ ruleId, ruleName: rule.name, email, status: 'sent' });\n\n totalProcessed++;\n if (runId && totalProcessed % 10 === 0) {\n await this.updateRunSendProgress(runId, stats);\n }\n\n if (i < emailsToProcess.length - 1) {\n const delayMs = this.config.options?.delayBetweenSendsMs || 0;\n const jitterMs = this.config.options?.jitterMs || 0;\n if (delayMs > 0 || jitterMs > 0) {\n const totalDelay = delayMs + Math.floor(Math.random() * (jitterMs + 1));\n if (totalDelay > 0) await new Promise(resolve => setTimeout(resolve, totalDelay));\n }\n }\n } catch (err) {\n stats.errors++;\n this.config.hooks?.onSend?.({ ruleId, ruleName: rule.name, email, status: 'error' });\n this.logger.error(`Rule \"${rule.name}\" failed for identifier ${email}`, { error: err });\n }\n }\n\n await this.EmailRule.findByIdAndUpdate(rule._id, {\n $set: { lastRunAt: new Date(), lastRunStats: stats },\n $inc: { totalSent: stats.sent, totalSkipped: stats.skipped }\n });\n\n // Auto-disable only applies to sendOnce rules — rules without sendOnce are meant to keep running\n if (rule.sendOnce) {\n const allIdentifiers: string[] = rule.target.identifiers || [];\n const totalIdentifiers = new Set(allIdentifiers.map((e: string) => e.toLowerCase().trim()).filter(Boolean)).size;\n\n const sends = await this.EmailRuleSend.find({\n ruleId: rule._id,\n }).lean();\n\n const sentOrProcessedIds = new Set(sends\n .filter((s: any) => s.status !== 'throttled')\n .map((s: any) => String(s.userId || s.emailIdentifierId))\n );\n\n const throttledCount = sends.filter((s: any) => s.status === 'throttled').length;\n\n if (sentOrProcessedIds.size >= totalIdentifiers && throttledCount === 0) {\n await this.EmailRule.findByIdAndUpdate(rule._id, { $set: { isActive: false } });\n this.logger.info(`Rule '${rule.name}' auto-disabled — all identifiers processed`);\n }\n }\n\n this.config.hooks?.onRuleComplete?.({ ruleId, ruleName: rule.name, stats });\n\n return stats;\n }\n\n private async executeQueryMode(\n rule: any,\n template: any,\n throttleMap: Map<string, UserThrottle>,\n throttleConfig: any,\n stats: RuleRunStats,\n runId?: string\n ): Promise<RuleRunStats> {\n let users: Record<string, unknown>[];\n try {\n users = await this.config.adapters.queryUsers(rule.target, rule.maxPerRun || this.config.options?.defaultMaxPerRun || 500);\n } catch (err) {\n this.logger.error(`Rule \"${rule.name}\": query failed`, { error: err });\n stats.errors = 1;\n return stats;\n }\n\n stats.matched = users.length;\n this.config.hooks?.onRuleStart?.({ ruleId: rule._id.toString(), ruleName: rule.name, matchedCount: users.length });\n if (users.length === 0) return stats;\n\n const userIds = users.map(u => (u._id as any)?.toString()).filter(Boolean);\n const emails = users.map(u => u.email as string).filter(Boolean);\n\n const allRuleSends = await this.EmailRuleSend.find({ ruleId: rule._id, userId: { $in: userIds } })\n .sort({ sentAt: -1 })\n .lean();\n\n const sendMap = new Map<string, any>();\n for (const send of allRuleSends) {\n const uid = send.userId.toString();\n if (!sendMap.has(uid)) {\n sendMap.set(uid, send);\n }\n }\n\n const uniqueEmails = [...new Set(emails.map(e => e.toLowerCase().trim()))];\n const identifierResults = await processInChunks(\n uniqueEmails,\n async email => {\n const result = await this.config.adapters.findIdentifier(email);\n return result ? { email, ...result } : null;\n },\n IDENTIFIER_CHUNK_SIZE\n );\n\n const identifierMap = new Map<string, { id: string; contactId: string }>();\n for (const result of identifierResults) {\n if (result) {\n identifierMap.set(result.email, { id: result.id, contactId: result.contactId });\n }\n }\n\n const preheadersQ: string[] = template.preheaders || [];\n const compiledVariants = this.templateRenderer.compileBatchVariants(\n template.subjects,\n template.bodies,\n template.textBody,\n preheadersQ\n );\n\n const ruleId = rule._id.toString();\n const templateId = rule.templateId.toString();\n\n let totalProcessed = 0;\n\n for (let i = 0; i < users.length; i++) {\n const user = users[i];\n\n if (runId && i % 10 === 0) {\n const cancelKey = `${this.keyPrefix}run:${runId}:cancel`;\n const cancelled = await this.redis.exists(cancelKey);\n if (cancelled) break;\n }\n\n try {\n const userId = (user._id as any)?.toString();\n const email = user.email as string;\n if (!userId || !email) {\n stats.skipped++;\n this.config.hooks?.onSend?.({ ruleId, ruleName: rule.name, email: email || 'unknown', status: 'invalid' });\n continue;\n }\n\n const lastSend = sendMap.get(userId);\n if (lastSend) {\n if (rule.sendOnce && !rule.resendAfterDays) {\n stats.skipped++;\n this.config.hooks?.onSend?.({ ruleId, ruleName: rule.name, email, status: 'skipped' });\n continue;\n }\n if (rule.resendAfterDays) {\n const daysSince = (Date.now() - new Date(lastSend.sentAt).getTime()) / MS_PER_DAY;\n if (daysSince < rule.resendAfterDays) {\n stats.skipped++;\n this.config.hooks?.onSend?.({ ruleId, ruleName: rule.name, email, status: 'skipped' });\n continue;\n }\n } else {\n stats.skipped++;\n this.config.hooks?.onSend?.({ ruleId, ruleName: rule.name, email, status: 'skipped' });\n continue;\n }\n }\n\n const identifier = identifierMap.get(email.toLowerCase().trim());\n if (!identifier) {\n stats.skipped++;\n this.config.hooks?.onSend?.({ ruleId, ruleName: rule.name, email, status: 'invalid' });\n continue;\n }\n\n if (!this.checkThrottle(rule, userId, email, throttleMap, throttleConfig, stats)) continue;\n\n const agentSelection = await this.config.adapters.selectAgent(identifier.id, { ruleId, templateId });\n if (!agentSelection) {\n stats.skipped++;\n this.config.hooks?.onSend?.({ ruleId, ruleName: rule.name, email, status: 'skipped' });\n continue;\n }\n\n const resolvedData = this.config.adapters.resolveData(user);\n const templateData = { ...(template.fields || {}), ...resolvedData };\n\n const si = Math.floor(Math.random() * compiledVariants.subjectFns.length);\n const bi = Math.floor(Math.random() * compiledVariants.bodyFns.length);\n\n const renderedSubject = compiledVariants.subjectFns[si](templateData);\n const renderedHtml = compiledVariants.bodyFns[bi](templateData);\n const renderedText = compiledVariants.textBodyFn\n ? compiledVariants.textBodyFn(templateData)\n : this.templateRenderer.htmlToText(renderedHtml);\n\n let finalHtml = renderedHtml;\n let finalText = renderedText;\n let finalSubject = renderedSubject;\n\n let pi: number | undefined;\n if (compiledVariants.preheaderFns && compiledVariants.preheaderFns.length > 0) {\n pi = Math.floor(Math.random() * compiledVariants.preheaderFns.length);\n const renderedPreheader = compiledVariants.preheaderFns[pi](templateData);\n if (renderedPreheader) {\n const preheaderHtml = `<div style=\"display:none;font-size:1px;color:#ffffff;line-height:1px;max-height:0px;max-width:0px;opacity:0;overflow:hidden;\">${renderedPreheader}</div>`;\n finalHtml = finalHtml.replace(/(<body[^>]*>)/i, `$1${preheaderHtml}`);\n }\n }\n\n if (this.config.hooks?.beforeSend) {\n try {\n const modified = await this.config.hooks.beforeSend({\n htmlBody: finalHtml,\n textBody: finalText,\n subject: finalSubject,\n account: {\n id: agentSelection.accountId,\n email: agentSelection.email,\n metadata: agentSelection.metadata,\n },\n user: {\n id: String(userId),\n email,\n name: String(user.name || user.firstName || ''),\n },\n });\n finalHtml = modified.htmlBody;\n finalText = modified.textBody;\n finalSubject = modified.subject;\n } catch (hookErr: any) {\n this.logger.error(`beforeSend hook failed for email ${email}: ${hookErr.message}`);\n stats.errors++;\n this.config.hooks?.onSend?.({ ruleId, ruleName: rule.name, email, status: 'error' });\n continue;\n }\n }\n\n await this.config.adapters.sendEmail({\n identifierId: identifier.id,\n contactId: identifier.contactId,\n accountId: agentSelection.accountId,\n subject: finalSubject,\n htmlBody: finalHtml,\n textBody: finalText,\n ruleId,\n autoApprove: rule.autoApprove ?? true\n });\n\n await this.EmailRuleSend.logSend(\n ruleId,\n userId,\n identifier.id,\n undefined,\n { status: 'sent', accountId: agentSelection.accountId, subject: finalSubject, subjectIndex: si, bodyIndex: bi, preheaderIndex: pi }\n );\n\n const current = throttleMap.get(userId) || { today: 0, thisWeek: 0, lastSentDate: null };\n throttleMap.set(userId, {\n today: current.today + 1,\n thisWeek: current.thisWeek + 1,\n lastSentDate: new Date()\n });\n\n stats.sent++;\n this.config.hooks?.onSend?.({ ruleId, ruleName: rule.name, email, status: 'sent' });\n\n totalProcessed++;\n if (runId && totalProcessed % 10 === 0) {\n await this.updateRunSendProgress(runId, stats);\n }\n\n if (i < users.length - 1) {\n const delayMs = this.config.options?.delayBetweenSendsMs || 0;\n const jitterMs = this.config.options?.jitterMs || 0;\n if (delayMs > 0 || jitterMs > 0) {\n const totalDelay = delayMs + Math.floor(Math.random() * (jitterMs + 1));\n if (totalDelay > 0) await new Promise(resolve => setTimeout(resolve, totalDelay));\n }\n }\n } catch (err) {\n stats.errors++;\n this.config.hooks?.onSend?.({ ruleId, ruleName: rule.name, email: (user.email as string) || 'unknown', status: 'error' });\n this.logger.error(`Rule \"${rule.name}\" failed for user ${(user._id as any)?.toString()}`, { error: err });\n }\n }\n\n await this.EmailRule.findByIdAndUpdate(rule._id, {\n $set: { lastRunAt: new Date(), lastRunStats: stats },\n $inc: { totalSent: stats.sent, totalSkipped: stats.skipped }\n });\n\n this.config.hooks?.onRuleComplete?.({ ruleId, ruleName: rule.name, stats });\n\n return stats;\n }\n\n private checkThrottle(\n rule: any,\n userId: string,\n email: string,\n throttleMap: Map<string, UserThrottle>,\n config: any,\n stats: RuleRunStats\n ): boolean {\n if (rule.emailType === EMAIL_TYPE.Transactional || rule.bypassThrottle) return true;\n\n const userThrottle = throttleMap.get(userId) || { today: 0, thisWeek: 0, lastSentDate: null };\n\n if (userThrottle.today >= config.maxPerUserPerDay) {\n stats.skippedByThrottle++;\n this.config.hooks?.onSend?.({ ruleId: rule._id.toString(), ruleName: rule.name, email, status: 'throttled' });\n return false;\n }\n if (userThrottle.thisWeek >= config.maxPerUserPerWeek) {\n stats.skippedByThrottle++;\n this.config.hooks?.onSend?.({ ruleId: rule._id.toString(), ruleName: rule.name, email, status: 'throttled' });\n return false;\n }\n if (userThrottle.lastSentDate) {\n const daysSinceLastSend = (Date.now() - userThrottle.lastSentDate.getTime()) / MS_PER_DAY;\n if (daysSinceLastSend < config.minGapDays) {\n stats.skippedByThrottle++;\n this.config.hooks?.onSend?.({ ruleId: rule._id.toString(), ruleName: rule.name, email, status: 'throttled' });\n return false;\n }\n }\n\n return true;\n }\n\n private getTodayStart(): Date {\n const timezone = this.config.options?.sendWindow?.timezone;\n if (timezone) {\n const now = new Date();\n const parts = new Intl.DateTimeFormat('en-US', {\n timeZone: timezone,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false\n }).formatToParts(now);\n const get = (type: string) => parts.find(p => p.type === type)?.value || '0';\n const tzNowMs = Date.UTC(\n parseInt(get('year')),\n parseInt(get('month')) - 1,\n parseInt(get('day')),\n parseInt(get('hour')),\n parseInt(get('minute')),\n parseInt(get('second'))\n );\n const tzMidnightMs = Date.UTC(\n parseInt(get('year')),\n parseInt(get('month')) - 1,\n parseInt(get('day'))\n );\n const offsetMs = now.getTime() - tzNowMs;\n return new Date(tzMidnightMs + offsetMs);\n }\n const todayStart = new Date();\n todayStart.setHours(0, 0, 0, 0);\n return todayStart;\n }\n\n private async updateRunProgress(runId: string, data: Partial<RunStatusResponse>): Promise<void> {\n const key = `${this.keyPrefix}run:${runId}:progress`;\n const flat: string[] = [];\n for (const [k, v] of Object.entries(data)) {\n if (typeof v === 'object' && v !== null) {\n flat.push(k, JSON.stringify(v));\n } else {\n flat.push(k, String(v));\n }\n }\n if (flat.length > 0) {\n await this.redis.hset(key, ...flat);\n await this.redis.expire(key, 3600);\n }\n }\n\n private async updateRunSendProgress(runId: string, stats: RuleRunStats): Promise<void> {\n const key = `${this.keyPrefix}run:${runId}:progress`;\n const existing = await this.redis.hget(key, 'progress');\n let progress = { rulesTotal: 0, rulesCompleted: 0, sent: 0, failed: 0, skipped: 0, invalid: 0 };\n if (existing) {\n try { progress = JSON.parse(existing); } catch { /* use default */ }\n }\n progress.sent = stats.sent;\n progress.failed = stats.errors;\n progress.skipped = stats.skipped + stats.skippedByThrottle;\n await this.redis.hset(key, 'progress', JSON.stringify(progress));\n await this.redis.expire(key, 3600);\n }\n\n async getStatus(runId: string): Promise<RunStatusResponse | null> {\n const key = `${this.keyPrefix}run:${runId}:progress`;\n const data = await this.redis.hgetall(key);\n if (!data || Object.keys(data).length === 0) return null;\n\n let progress = { rulesTotal: 0, rulesCompleted: 0, sent: 0, failed: 0, skipped: 0, invalid: 0 };\n if (data.progress) {\n try { progress = JSON.parse(data.progress); } catch { /* use default */ }\n }\n\n return {\n runId: data.runId || runId,\n status: (data.status as RunStatusResponse['status']) || 'running',\n currentRule: data.currentRule || '',\n progress,\n startedAt: data.startedAt || '',\n elapsed: parseInt(data.elapsed || '0', 10)\n };\n }\n\n async cancel(runId: string): Promise<{ ok: boolean }> {\n const progressKey = `${this.keyPrefix}run:${runId}:progress`;\n const exists = await this.redis.exists(progressKey);\n if (!exists) return { ok: false };\n\n const cancelKey = `${this.keyPrefix}run:${runId}:cancel`;\n await this.redis.set(cancelKey, '1', 'EX', 3600);\n return { ok: true };\n }\n\n trigger(triggeredBy?: RunTrigger): { runId: string } {\n const runId = crypto.randomUUID();\n this.runAllRules(triggeredBy || RUN_TRIGGER.Manual, runId).catch(err => {\n this.logger.error('Background rule run failed', { error: err, runId });\n this.updateRunProgress(runId, { status: 'failed' } as Partial<RunStatusResponse>).catch(() => {});\n });\n return { runId };\n }\n\n buildThrottleMap(recentSends: any[]): Map<string, UserThrottle> {\n const map = new Map<string, UserThrottle>();\n const todayStart = this.getTodayStart();\n\n for (const send of recentSends) {\n const key = send.userId.toString();\n const current = map.get(key) || { today: 0, thisWeek: 0, lastSentDate: null };\n const sentAt = new Date(send.sentAt);\n\n current.thisWeek++;\n if (sentAt >= todayStart) {\n current.today++;\n }\n if (!current.lastSentDate || sentAt > current.lastSentDate) {\n current.lastSentDate = sentAt;\n }\n\n map.set(key, current);\n }\n\n return map;\n }\n}\n","import { Request } from 'express';\n\nexport function getParam(req: Request, name: string): string {\n const val = req.params[name];\n return Array.isArray(val) ? val[0] : val;\n}\n\nexport function getQueryString(req: Request, name: string): string | undefined {\n const val = req.query[name];\n if (val === undefined) return undefined;\n return Array.isArray(val) ? String(val[0]) : String(val);\n}\n","import { Request, Response } from 'express';\nimport { TEMPLATE_CATEGORY, TEMPLATE_AUDIENCE } from '../constants';\n\nimport type { TemplateService } from '../services/template.service';\nimport { getParam } from '../utils/express-helpers';\n\nfunction isValidValue(allowed: readonly string[], value: unknown): boolean {\n return typeof value === 'string' && (allowed as readonly string[]).includes(value);\n}\n\nfunction getErrorStatus(message: string): number {\n if (message.includes('already exists') || message.includes('validation failed')) return 400;\n if (message.includes('not found')) return 404;\n return 500;\n}\n\nexport interface TemplateControllerOptions {\n platforms?: string[];\n categories?: string[];\n audiences?: string[];\n}\n\nexport function createTemplateController(templateService: TemplateService, options?: TemplateControllerOptions) {\n const platformValues = options?.platforms;\n const validCategories = options?.categories || Object.values(TEMPLATE_CATEGORY);\n const validAudiences = options?.audiences || Object.values(TEMPLATE_AUDIENCE);\n\n async function list(req: Request, res: Response) {\n try {\n const { category, audience, platform, isActive } = req.query;\n const templates = await templateService.list({\n category: category as string | undefined,\n audience: audience as string | undefined,\n platform: platform as string | undefined,\n isActive: isActive !== undefined ? isActive === 'true' : undefined\n });\n res.json({ success: true, data: { templates } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n }\n\n async function getById(req: Request, res: Response) {\n try {\n const template = await templateService.getById(getParam(req, 'id'));\n if (!template) {\n return res.status(404).json({ success: false, error: 'Template not found' });\n }\n res.json({ success: true, data: { template } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n }\n\n async function create(req: Request, res: Response) {\n try {\n const { name, subjects, bodies, category, audience, platform, preheaders } = req.body;\n\n if (!name || !subjects || subjects.length === 0 || !bodies || bodies.length === 0 || !category || !audience || !platform) {\n return res.status(400).json({ success: false, error: 'name, subjects, bodies, category, audience, and platform are required' });\n }\n\n if (!isValidValue(validCategories, category)) {\n return res.status(400).json({ success: false, error: `Invalid category. Must be one of: ${validCategories.join(', ')}` });\n }\n if (!isValidValue(validAudiences, audience)) {\n return res.status(400).json({ success: false, error: `Invalid audience. Must be one of: ${validAudiences.join(', ')}` });\n }\n if (platformValues && !platformValues.includes(platform)) {\n return res.status(400).json({ success: false, error: `Invalid platform. Must be one of: ${platformValues.join(', ')}` });\n }\n\n const template = await templateService.create(req.body);\n res.status(201).json({ success: true, data: { template } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(getErrorStatus(message)).json({ success: false, error: message });\n }\n }\n\n async function update(req: Request, res: Response) {\n try {\n const template = await templateService.update(getParam(req, 'id'), req.body);\n if (!template) {\n return res.status(404).json({ success: false, error: 'Template not found' });\n }\n res.json({ success: true, data: { template } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(getErrorStatus(message)).json({ success: false, error: message });\n }\n }\n\n async function remove(req: Request, res: Response) {\n try {\n const deleted = await templateService.delete(getParam(req, 'id'));\n if (!deleted) {\n return res.status(404).json({ success: false, error: 'Template not found' });\n }\n res.json({ success: true });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n }\n\n async function toggleActive(req: Request, res: Response) {\n try {\n const template = await templateService.toggleActive(getParam(req, 'id'));\n if (!template) {\n return res.status(404).json({ success: false, error: 'Template not found' });\n }\n res.json({ success: true, data: { template } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n }\n\n async function preview(req: Request, res: Response) {\n try {\n const { sampleData } = req.body;\n const result = await templateService.preview(getParam(req, 'id'), sampleData || {});\n if (!result) {\n return res.status(404).json({ success: false, error: 'Template not found' });\n }\n res.json({ success: true, data: result });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n }\n\n async function previewRaw(req: Request, res: Response) {\n try {\n const { subject, body, textBody, sampleData } = req.body;\n if (!subject || !body) {\n return res.status(400).json({ success: false, error: 'subject and body are required' });\n }\n const result = await templateService.previewRaw(subject, body, sampleData || {}, textBody);\n res.json({ success: true, data: result });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n }\n\n async function validate(req: Request, res: Response) {\n try {\n const { body: templateBody } = req.body;\n if (!templateBody) {\n return res.status(400).json({ success: false, error: 'body is required' });\n }\n const result = await templateService.validate(templateBody);\n res.json({ success: true, data: result });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n }\n\n async function sendTestEmail(req: Request, res: Response) {\n try {\n const { testEmail, sampleData } = req.body;\n if (!testEmail) {\n return res.status(400).json({ success: false, error: 'testEmail is required' });\n }\n const result = await templateService.sendTestEmail(getParam(req, 'id'), testEmail, sampleData || {});\n if (!result.success) {\n return res.status(400).json({ success: false, error: result.error });\n }\n res.json({ success: true });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n }\n\n return { list, getById, create, update, remove, toggleActive, preview, previewRaw, validate, sendTestEmail };\n}\n","import { Request, Response } from 'express';\nimport { TEMPLATE_AUDIENCE, EMAIL_TYPE } from '../constants';\nimport type { RuleService } from '../services/rule.service';\nimport { getParam } from '../utils/express-helpers';\n\nfunction isValidValue(allowed: readonly string[], value: unknown): boolean {\n return typeof value === 'string' && (allowed as readonly string[]).includes(value);\n}\n\nfunction getErrorStatus(message: string): number {\n if (message.includes('not found')) return 404;\n if (message.includes('mismatch') || message.includes('validation failed') || message.includes('Cannot activate')) return 400;\n return 500;\n}\n\nexport interface RuleControllerOptions {\n platforms?: string[];\n audiences?: string[];\n}\n\nexport function createRuleController(ruleService: RuleService, options?: RuleControllerOptions) {\n const platformValues = options?.platforms;\n const validAudiences = options?.audiences || Object.values(TEMPLATE_AUDIENCE);\n const validEmailTypes = Object.values(EMAIL_TYPE);\n\n async function list(_req: Request, res: Response) {\n try {\n const rules = await ruleService.list();\n res.json({ success: true, data: { rules } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n }\n\n async function getById(req: Request, res: Response) {\n try {\n const rule = await ruleService.getById(getParam(req, 'id'));\n if (!rule) {\n return res.status(404).json({ success: false, error: 'Rule not found' });\n }\n res.json({ success: true, data: { rule } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n }\n\n async function create(req: Request, res: Response) {\n try {\n const { name, target, templateId } = req.body;\n\n if (!name || !target || !templateId) {\n return res.status(400).json({ success: false, error: 'name, target, and templateId are required' });\n }\n\n const mode = target.mode || 'query';\n\n if (mode === 'list') {\n if (!Array.isArray(target.identifiers) || target.identifiers.length === 0) {\n return res.status(400).json({ success: false, error: 'target.identifiers must be a non-empty array for list mode' });\n }\n } else {\n if (!target.role || !isValidValue(validAudiences, target.role)) {\n return res.status(400).json({ success: false, error: `Invalid target.role. Must be one of: ${validAudiences.join(', ')}` });\n }\n if (platformValues && !platformValues.includes(target.platform)) {\n return res.status(400).json({ success: false, error: `Invalid target.platform. Must be one of: ${platformValues.join(', ')}` });\n }\n if (!Array.isArray(target.conditions)) {\n return res.status(400).json({ success: false, error: 'target.conditions must be an array' });\n }\n }\n\n if (req.body.emailType && !isValidValue(validEmailTypes, req.body.emailType)) {\n return res.status(400).json({ success: false, error: `Invalid emailType. Must be one of: ${validEmailTypes.join(', ')}` });\n }\n\n const rule = await ruleService.create(req.body);\n res.status(201).json({ success: true, data: { rule } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(getErrorStatus(message)).json({ success: false, error: message });\n }\n }\n\n async function update(req: Request, res: Response) {\n try {\n const { target, emailType } = req.body;\n\n if (target) {\n const mode = target.mode || 'query';\n if (mode === 'list') {\n if (target.identifiers && (!Array.isArray(target.identifiers) || target.identifiers.length === 0)) {\n return res.status(400).json({ success: false, error: 'target.identifiers must be a non-empty array for list mode' });\n }\n } else {\n if (target.role && !isValidValue(validAudiences, target.role)) {\n return res.status(400).json({ success: false, error: `Invalid target.role. Must be one of: ${validAudiences.join(', ')}` });\n }\n if (target.platform && platformValues && !platformValues.includes(target.platform)) {\n return res.status(400).json({ success: false, error: `Invalid target.platform. Must be one of: ${platformValues.join(', ')}` });\n }\n if (target.conditions && !Array.isArray(target.conditions)) {\n return res.status(400).json({ success: false, error: 'target.conditions must be an array' });\n }\n }\n }\n\n if (emailType && !isValidValue(validEmailTypes, emailType)) {\n return res.status(400).json({ success: false, error: `Invalid emailType. Must be one of: ${validEmailTypes.join(', ')}` });\n }\n\n const rule = await ruleService.update(getParam(req, 'id'), req.body);\n if (!rule) {\n return res.status(404).json({ success: false, error: 'Rule not found' });\n }\n res.json({ success: true, data: { rule } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(getErrorStatus(message)).json({ success: false, error: message });\n }\n }\n\n async function remove(req: Request, res: Response) {\n try {\n const result = await ruleService.delete(getParam(req, 'id'));\n if (!result.deleted && !result.disabled) {\n return res.status(404).json({ success: false, error: 'Rule not found' });\n }\n res.json({ success: true, data: result });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n }\n\n async function toggleActive(req: Request, res: Response) {\n try {\n const rule = await ruleService.toggleActive(getParam(req, 'id'));\n if (!rule) {\n return res.status(404).json({ success: false, error: 'Rule not found' });\n }\n res.json({ success: true, data: { rule } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(getErrorStatus(message)).json({ success: false, error: message });\n }\n }\n\n async function dryRun(req: Request, res: Response) {\n try {\n const result = await ruleService.dryRun(getParam(req, 'id'));\n res.json({ success: true, data: result });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(getErrorStatus(message)).json({ success: false, error: message });\n }\n }\n\n async function runHistory(req: Request, res: Response) {\n try {\n const limitParam = req.query.limit;\n const limit = parseInt(String(Array.isArray(limitParam) ? limitParam[0] : limitParam), 10) || 20;\n const logs = await ruleService.getRunHistory(limit);\n res.json({ success: true, data: { logs } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n }\n\n return { list, getById, create, update, remove, toggleActive, dryRun, runHistory };\n}\n","import { Request, Response } from 'express';\nimport { RUN_TRIGGER } from '../constants';\nimport type { RuleRunnerService } from '../services/rule-runner.service';\nimport type { EmailRuleRunLogModel } from '../schemas/run-log.schema';\nimport type { LogAdapter } from '../types/config.types';\nimport { getParam } from '../utils/express-helpers';\n\nconst defaultLogger: LogAdapter = {\n info: () => {},\n warn: () => {},\n error: () => {}\n};\n\nexport function createRunnerController(\n runnerService: RuleRunnerService,\n EmailRuleRunLog: EmailRuleRunLogModel,\n logger?: LogAdapter\n) {\n const log = logger || defaultLogger;\n\n async function triggerManualRun(_req: Request, res: Response) {\n const { runId } = runnerService.trigger(RUN_TRIGGER.Manual);\n res.json({ success: true, data: { message: 'Rule run triggered', runId } });\n }\n\n async function getLatestRun(_req: Request, res: Response) {\n try {\n const latestRun = await EmailRuleRunLog.findOne().sort({ runAt: -1 });\n res.json({ success: true, data: { latestRun } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n }\n\n async function getStatusByRunId(req: Request, res: Response) {\n try {\n const status = await runnerService.getStatus(getParam(req, 'runId'));\n if (!status) {\n res.status(404).json({ success: false, error: 'Run not found' });\n return;\n }\n res.json({ success: true, data: status });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n }\n\n async function cancelRun(req: Request, res: Response) {\n try {\n const result = await runnerService.cancel(getParam(req, 'runId'));\n if (!result.ok) {\n res.status(404).json({ success: false, error: 'Run not found' });\n return;\n }\n res.json({ success: true, data: { message: 'Cancel requested' } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n }\n\n return { triggerManualRun, getLatestRun, getStatusByRunId, cancelRun };\n}\n","import { Request, Response } from 'express';\nimport type { EmailThrottleConfigModel } from '../schemas/throttle-config.schema';\n\nexport function createSettingsController(EmailThrottleConfig: EmailThrottleConfigModel) {\n\n async function getThrottleConfig(_req: Request, res: Response) {\n try {\n const config = await EmailThrottleConfig.getConfig();\n res.json({ success: true, data: { config } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n }\n\n async function updateThrottleConfig(req: Request, res: Response) {\n try {\n const { maxPerUserPerDay, maxPerUserPerWeek, minGapDays } = req.body;\n\n const updates: Record<string, number> = {};\n if (maxPerUserPerDay !== undefined) {\n if (!Number.isInteger(maxPerUserPerDay) || maxPerUserPerDay < 1) {\n return res.status(400).json({ success: false, error: 'maxPerUserPerDay must be a positive integer' });\n }\n updates.maxPerUserPerDay = maxPerUserPerDay;\n }\n if (maxPerUserPerWeek !== undefined) {\n if (!Number.isInteger(maxPerUserPerWeek) || maxPerUserPerWeek < 1) {\n return res.status(400).json({ success: false, error: 'maxPerUserPerWeek must be a positive integer' });\n }\n updates.maxPerUserPerWeek = maxPerUserPerWeek;\n }\n if (minGapDays !== undefined) {\n if (!Number.isInteger(minGapDays) || minGapDays < 0) {\n return res.status(400).json({ success: false, error: 'minGapDays must be a non-negative integer' });\n }\n updates.minGapDays = minGapDays;\n }\n\n if (Object.keys(updates).length === 0) {\n return res.status(400).json({ success: false, error: 'No valid fields to update' });\n }\n\n const config = await EmailThrottleConfig.getConfig();\n const finalDaily = updates.maxPerUserPerDay ?? config.maxPerUserPerDay;\n const finalWeekly = updates.maxPerUserPerWeek ?? config.maxPerUserPerWeek;\n if (finalWeekly < finalDaily) {\n return res.status(400).json({ success: false, error: 'maxPerUserPerWeek must be >= maxPerUserPerDay' });\n }\n\n const updated = await EmailThrottleConfig.findByIdAndUpdate(\n config._id,\n { $set: updates },\n { new: true }\n );\n\n res.json({ success: true, data: { config: updated } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n }\n\n return { getThrottleConfig, updateThrottleConfig };\n}\n","import { Router } from 'express';\nimport { createTemplateController } from '../controllers/template.controller';\nimport { createRuleController } from '../controllers/rule.controller';\nimport { createRunnerController } from '../controllers/runner.controller';\nimport { createSettingsController } from '../controllers/settings.controller';\nimport type { TemplateService } from '../services/template.service';\nimport type { RuleService } from '../services/rule.service';\nimport type { RuleRunnerService } from '../services/rule-runner.service';\nimport type { EmailRuleRunLogModel } from '../schemas/run-log.schema';\nimport type { EmailThrottleConfigModel } from '../schemas/throttle-config.schema';\nimport type { LogAdapter } from '../types/config.types';\n\nexport interface RoutesDeps {\n templateService: TemplateService;\n ruleService: RuleService;\n runnerService: RuleRunnerService;\n EmailRuleRunLog: EmailRuleRunLogModel;\n EmailThrottleConfig: EmailThrottleConfigModel;\n platformValues?: string[];\n categoryValues?: string[];\n audienceValues?: string[];\n logger?: LogAdapter;\n}\n\nexport function createRoutes(deps: RoutesDeps): Router {\n const router = Router();\n\n const templateCtrl = createTemplateController(deps.templateService, {\n platforms: deps.platformValues,\n categories: deps.categoryValues,\n audiences: deps.audienceValues,\n });\n const ruleCtrl = createRuleController(deps.ruleService, {\n platforms: deps.platformValues,\n audiences: deps.audienceValues,\n });\n const runnerCtrl = createRunnerController(deps.runnerService, deps.EmailRuleRunLog, deps.logger);\n const settingsCtrl = createSettingsController(deps.EmailThrottleConfig);\n\n const templateRouter = Router();\n templateRouter.get('/', templateCtrl.list);\n templateRouter.post('/', templateCtrl.create);\n templateRouter.post('/validate', templateCtrl.validate);\n templateRouter.post('/preview', templateCtrl.previewRaw);\n templateRouter.get('/:id', templateCtrl.getById);\n templateRouter.put('/:id', templateCtrl.update);\n templateRouter.delete('/:id', templateCtrl.remove);\n templateRouter.patch('/:id/toggle', templateCtrl.toggleActive);\n templateRouter.post('/:id/preview', templateCtrl.preview);\n templateRouter.post('/:id/test-email', templateCtrl.sendTestEmail);\n\n const ruleRouter = Router();\n ruleRouter.get('/', ruleCtrl.list);\n ruleRouter.post('/', ruleCtrl.create);\n ruleRouter.get('/run-history', ruleCtrl.runHistory);\n ruleRouter.get('/:id', ruleCtrl.getById);\n ruleRouter.patch('/:id', ruleCtrl.update);\n ruleRouter.delete('/:id', ruleCtrl.remove);\n ruleRouter.patch('/:id/toggle', ruleCtrl.toggleActive);\n ruleRouter.post('/:id/dry-run', ruleCtrl.dryRun);\n\n const runnerRouter = Router();\n runnerRouter.post('/', runnerCtrl.triggerManualRun);\n runnerRouter.get('/status', runnerCtrl.getLatestRun);\n runnerRouter.get('/status/:runId', runnerCtrl.getStatusByRunId);\n runnerRouter.post('/cancel/:runId', runnerCtrl.cancelRun);\n\n const settingsRouter = Router();\n settingsRouter.get('/throttle', settingsCtrl.getThrottleConfig);\n settingsRouter.patch('/throttle', settingsCtrl.updateThrottleConfig);\n\n router.use('/templates', templateRouter);\n router.use('/rules', ruleRouter);\n router.use('/runner', runnerRouter);\n router.use('/settings', settingsRouter);\n\n return router;\n}\n","import { z } from 'zod';\nimport { loggerSchema, baseDbSchema, baseRedisSchema } from '@astralibx/core';\nimport { ConfigValidationError } from '../errors';\n\nconst configSchema = z.object({\n db: baseDbSchema,\n redis: baseRedisSchema,\n adapters: z.object({\n queryUsers: z.function(),\n resolveData: z.function(),\n sendEmail: z.function(),\n selectAgent: z.function(),\n findIdentifier: z.function(),\n sendTestEmail: z.function().optional(),\n }),\n platforms: z.array(z.string()).optional(),\n audiences: z.array(z.string()).optional(),\n categories: z.array(z.string()).optional(),\n logger: loggerSchema.optional(),\n options: z.object({\n lockTTLMs: z.number().positive().optional(),\n defaultMaxPerRun: z.number().positive().optional(),\n sendWindow: z.object({\n startHour: z.number().min(0).max(23),\n endHour: z.number().min(0).max(23),\n timezone: z.string(),\n }).optional(),\n delayBetweenSendsMs: z.number().min(0).optional(),\n jitterMs: z.number().min(0).optional(),\n }).optional(),\n hooks: z.object({\n onRunStart: z.function().optional(),\n onRuleStart: z.function().optional(),\n onSend: z.function().optional(),\n onRuleComplete: z.function().optional(),\n onRunComplete: z.function().optional(),\n }).optional(),\n});\n\nexport function validateConfig(raw: unknown): void {\n const result = configSchema.safeParse(raw);\n if (!result.success) {\n const issues = result.error.issues\n .map((i) => ` ${i.path.join('.')}: ${i.message}`)\n .join('\\n');\n throw new ConfigValidationError(\n `Invalid EmailRuleEngineConfig:\\n${issues}`,\n result.error.issues[0]?.path.join('.') ?? '',\n );\n }\n}\n","import type { EmailRuleEngineConfig } from './types/config.types';\nimport { createEmailTemplateSchema, type EmailTemplateModel } from './schemas/template.schema';\nimport { createEmailRuleSchema, type EmailRuleModel } from './schemas/rule.schema';\nimport { createEmailRuleSendSchema, type EmailRuleSendModel } from './schemas/rule-send.schema';\nimport { createEmailRuleRunLogSchema, type EmailRuleRunLogModel } from './schemas/run-log.schema';\nimport { createEmailThrottleConfigSchema, type EmailThrottleConfigModel } from './schemas/throttle-config.schema';\nimport { TemplateService } from './services/template.service';\nimport { RuleService } from './services/rule.service';\nimport { RuleRunnerService } from './services/rule-runner.service';\nimport { createRoutes } from './routes';\nimport { validateConfig } from './validation/config.schema';\nimport type { Router } from 'express';\n\n/**\n * Engine instance with Express routes and programmatic service access.\n */\nexport interface EmailRuleEngine {\n routes: Router;\n runner: RuleRunnerService;\n templateService: TemplateService;\n ruleService: RuleService;\n models: {\n EmailTemplate: EmailTemplateModel;\n EmailRule: EmailRuleModel;\n EmailRuleSend: EmailRuleSendModel;\n EmailRuleRunLog: EmailRuleRunLogModel;\n EmailThrottleConfig: EmailThrottleConfigModel;\n };\n}\n\n/**\n * Creates an email rule engine instance with routes, services, and models.\n *\n * @param config - Engine configuration including DB, Redis, adapters, and options.\n * @returns Engine instance with Express routes and programmatic service access.\n * @throws {ConfigValidationError} If the provided config is invalid.\n *\n * @example\n * ```typescript\n * const engine = createEmailRuleEngine({\n * db: { connection: mongoose.createConnection(uri) },\n * redis: { connection: new Redis() },\n * adapters: { queryUsers, resolveData, sendEmail, selectAgent, findIdentifier },\n * });\n * app.use('/api/email-rules', engine.routes);\n * ```\n */\nexport function createEmailRuleEngine(config: EmailRuleEngineConfig): EmailRuleEngine {\n validateConfig(config);\n\n const conn = config.db.connection;\n const prefix = config.db.collectionPrefix || '';\n\n const EmailTemplate = conn.model<any>(\n `${prefix}EmailTemplate`,\n createEmailTemplateSchema(config.platforms, config.audiences, config.categories, prefix)\n ) as EmailTemplateModel;\n\n const EmailRule = conn.model<any>(\n `${prefix}EmailRule`,\n createEmailRuleSchema(config.platforms, config.audiences, prefix)\n ) as EmailRuleModel;\n\n const EmailRuleSend = conn.model<any>(\n `${prefix}EmailRuleSend`,\n createEmailRuleSendSchema(prefix)\n ) as EmailRuleSendModel;\n\n const EmailRuleRunLog = conn.model<any>(\n `${prefix}EmailRuleRunLog`,\n createEmailRuleRunLogSchema(prefix)\n ) as EmailRuleRunLogModel;\n\n const EmailThrottleConfig = conn.model<any>(\n `${prefix}EmailThrottleConfig`,\n createEmailThrottleConfigSchema(prefix)\n ) as EmailThrottleConfigModel;\n\n const templateService = new TemplateService(EmailTemplate, config);\n const ruleService = new RuleService(EmailRule, EmailTemplate, EmailRuleRunLog, config);\n const runnerService = new RuleRunnerService(\n EmailRule, EmailTemplate, EmailRuleSend, EmailRuleRunLog, EmailThrottleConfig, config\n );\n\n const routes = createRoutes({\n templateService,\n ruleService,\n runnerService,\n EmailRuleRunLog,\n EmailThrottleConfig,\n platformValues: config.platforms,\n categoryValues: config.categories,\n audienceValues: config.audiences,\n logger: config.logger,\n });\n\n return {\n routes,\n runner: runnerService,\n templateService,\n ruleService,\n models: { EmailTemplate, EmailRule, EmailRuleSend, EmailRuleRunLog, EmailThrottleConfig }\n };\n}\n\nexport * from './types';\nexport * from './constants';\nexport * from './errors';\nexport { validateConfig } from './validation/config.schema';\nexport * from './schemas';\nexport { TemplateRenderService, type RenderResult, type CompiledTemplate } from './services/template-render.service';\nexport { TemplateService } from './services/template.service';\nexport { RuleService } from './services/rule.service';\nexport { RuleRunnerService } from './services/rule-runner.service';\nexport { RedisLock } from './utils/redis-lock';\n"]}
package/dist/index.d.mts CHANGED
@@ -70,7 +70,7 @@ interface RuleRunStats {
70
70
  }
71
71
  interface QueryTarget {
72
72
  mode: 'query';
73
- role: TemplateAudience;
73
+ role: string;
74
74
  platform: string;
75
75
  conditions: RuleCondition[];
76
76
  }
@@ -289,8 +289,8 @@ interface EmailTemplate {
289
289
  name: string;
290
290
  slug: string;
291
291
  description?: string;
292
- category: TemplateCategory;
293
- audience: TemplateAudience;
292
+ category: string;
293
+ audience: string;
294
294
  platform: string;
295
295
  textBody?: string;
296
296
  subjects: string[];
@@ -307,8 +307,8 @@ interface CreateEmailTemplateInput {
307
307
  name: string;
308
308
  slug: string;
309
309
  description?: string;
310
- category: TemplateCategory;
311
- audience: TemplateAudience;
310
+ category: string;
311
+ audience: string;
312
312
  platform: string;
313
313
  textBody?: string;
314
314
  subjects: string[];
@@ -320,8 +320,8 @@ interface CreateEmailTemplateInput {
320
320
  interface UpdateEmailTemplateInput {
321
321
  name?: string;
322
322
  description?: string;
323
- category?: TemplateCategory;
324
- audience?: TemplateAudience;
323
+ category?: string;
324
+ audience?: string;
325
325
  platform?: string;
326
326
  textBody?: string;
327
327
  subjects?: string[];
@@ -338,8 +338,8 @@ type EmailTemplateDocument = HydratedDocument<IEmailTemplate>;
338
338
  interface EmailTemplateStatics {
339
339
  findBySlug(slug: string): Promise<EmailTemplateDocument | null>;
340
340
  findActive(): Promise<EmailTemplateDocument[]>;
341
- findByCategory(category: TemplateCategory): Promise<EmailTemplateDocument[]>;
342
- findByAudience(audience: TemplateAudience): Promise<EmailTemplateDocument[]>;
341
+ findByCategory(category: string): Promise<EmailTemplateDocument[]>;
342
+ findByAudience(audience: string): Promise<EmailTemplateDocument[]>;
343
343
  createTemplate(input: CreateEmailTemplateInput): Promise<EmailTemplateDocument>;
344
344
  }
345
345
  type EmailTemplateModel = Model<IEmailTemplate> & EmailTemplateStatics;
@@ -491,8 +491,8 @@ declare class TemplateService {
491
491
  private renderService;
492
492
  constructor(EmailTemplate: EmailTemplateModel, config: EmailRuleEngineConfig);
493
493
  list(filters?: {
494
- category?: TemplateCategory;
495
- audience?: TemplateAudience;
494
+ category?: string;
495
+ audience?: string;
496
496
  platform?: string;
497
497
  isActive?: boolean;
498
498
  }): Promise<EmailTemplateDocument[]>;