@astralibx/email-rule-engine 1.2.2 → 3.0.1
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.
- package/README.md +93 -46
- package/dist/index.d.mts +607 -0
- package/dist/index.d.ts +595 -20
- package/dist/index.js +1731 -65
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1699 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +26 -8
- package/dist/controllers/index.d.ts +0 -5
- package/dist/controllers/index.d.ts.map +0 -1
- package/dist/controllers/index.js +0 -12
- package/dist/controllers/index.js.map +0 -1
- package/dist/controllers/rule.controller.d.ts +0 -13
- package/dist/controllers/rule.controller.d.ts.map +0 -1
- package/dist/controllers/rule.controller.js +0 -142
- package/dist/controllers/rule.controller.js.map +0 -1
- package/dist/controllers/runner.controller.d.ts +0 -8
- package/dist/controllers/runner.controller.d.ts.map +0 -1
- package/dist/controllers/runner.controller.js +0 -22
- package/dist/controllers/runner.controller.js.map +0 -1
- package/dist/controllers/settings.controller.d.ts +0 -7
- package/dist/controllers/settings.controller.d.ts.map +0 -1
- package/dist/controllers/settings.controller.js +0 -56
- package/dist/controllers/settings.controller.js.map +0 -1
- package/dist/controllers/template.controller.d.ts +0 -15
- package/dist/controllers/template.controller.d.ts.map +0 -1
- package/dist/controllers/template.controller.js +0 -169
- package/dist/controllers/template.controller.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/routes/index.d.ts +0 -16
- package/dist/routes/index.d.ts.map +0 -1
- package/dist/routes/index.js +0 -47
- package/dist/routes/index.js.map +0 -1
- package/dist/schemas/index.d.ts +0 -6
- package/dist/schemas/index.d.ts.map +0 -1
- package/dist/schemas/index.js +0 -14
- package/dist/schemas/index.js.map +0 -1
- package/dist/schemas/rule-send.schema.d.ts +0 -25
- package/dist/schemas/rule-send.schema.d.ts.map +0 -1
- package/dist/schemas/rule-send.schema.js +0 -41
- package/dist/schemas/rule-send.schema.js.map +0 -1
- package/dist/schemas/rule.schema.d.ts +0 -22
- package/dist/schemas/rule.schema.d.ts.map +0 -1
- package/dist/schemas/rule.schema.js +0 -81
- package/dist/schemas/rule.schema.js.map +0 -1
- package/dist/schemas/run-log.schema.d.ts +0 -39
- package/dist/schemas/run-log.schema.d.ts.map +0 -1
- package/dist/schemas/run-log.schema.js +0 -47
- package/dist/schemas/run-log.schema.js.map +0 -1
- package/dist/schemas/template.schema.d.ts +0 -24
- package/dist/schemas/template.schema.d.ts.map +0 -1
- package/dist/schemas/template.schema.js +0 -65
- package/dist/schemas/template.schema.js.map +0 -1
- package/dist/schemas/throttle-config.schema.d.ts +0 -19
- package/dist/schemas/throttle-config.schema.d.ts.map +0 -1
- package/dist/schemas/throttle-config.schema.js +0 -32
- package/dist/schemas/throttle-config.schema.js.map +0 -1
- package/dist/services/index.d.ts +0 -5
- package/dist/services/index.d.ts.map +0 -1
- package/dist/services/index.js +0 -12
- package/dist/services/index.js.map +0 -1
- package/dist/services/rule-runner.service.d.ts +0 -31
- package/dist/services/rule-runner.service.d.ts.map +0 -1
- package/dist/services/rule-runner.service.js +0 -279
- package/dist/services/rule-runner.service.js.map +0 -1
- package/dist/services/rule.service.d.ts +0 -27
- package/dist/services/rule.service.d.ts.map +0 -1
- package/dist/services/rule.service.js +0 -127
- package/dist/services/rule.service.js.map +0 -1
- package/dist/services/template-render.service.d.ts +0 -23
- package/dist/services/template-render.service.d.ts.map +0 -1
- package/dist/services/template-render.service.js +0 -178
- package/dist/services/template-render.service.js.map +0 -1
- package/dist/services/template.service.d.ts +0 -42
- package/dist/services/template.service.d.ts.map +0 -1
- package/dist/services/template.service.js +0 -128
- package/dist/services/template.service.js.map +0 -1
- package/dist/types/config.types.d.ts +0 -85
- package/dist/types/config.types.d.ts.map +0 -1
- package/dist/types/config.types.js +0 -3
- package/dist/types/config.types.js.map +0 -1
- package/dist/types/enums.d.ts +0 -43
- package/dist/types/enums.d.ts.map +0 -1
- package/dist/types/enums.js +0 -40
- package/dist/types/enums.js.map +0 -1
- package/dist/types/index.d.ts +0 -6
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -11
- package/dist/types/index.js.map +0 -1
- package/dist/types/rule.types.d.ts +0 -91
- package/dist/types/rule.types.d.ts.map +0 -1
- package/dist/types/rule.types.js +0 -3
- package/dist/types/rule.types.js.map +0 -1
- package/dist/types/template.types.d.ts +0 -43
- package/dist/types/template.types.d.ts.map +0 -1
- package/dist/types/template.types.js +0 -3
- package/dist/types/template.types.js.map +0 -1
- package/dist/types/throttle.types.d.ts +0 -15
- package/dist/types/throttle.types.d.ts.map +0 -1
- package/dist/types/throttle.types.js +0 -3
- package/dist/types/throttle.types.js.map +0 -1
- package/dist/utils/express-helpers.d.ts +0 -4
- package/dist/utils/express-helpers.d.ts.map +0 -1
- package/dist/utils/express-helpers.js +0 -15
- package/dist/utils/express-helpers.js.map +0 -1
- package/dist/utils/redis-lock.d.ts +0 -13
- package/dist/utils/redis-lock.d.ts.map +0 -1
- package/dist/utils/redis-lock.js +0 -36
- package/dist/utils/redis-lock.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AA0BA,sDAmDC;AA5ED,+DAA+F;AAC/F,uDAAmF;AACnF,iEAAgG;AAChG,6DAAkG;AAClG,6EAAkH;AAClH,kEAA8D;AAC9D,0DAAsD;AACtD,wEAAmE;AACnE,qCAAwC;AAiBxC,SAAgB,qBAAqB,CAAC,MAA6B;IACjE,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC;IAClC,MAAM,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC,gBAAgB,IAAI,EAAE,CAAC;IAEhD,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAC9B,GAAG,MAAM,eAAe,EACxB,IAAA,2CAAyB,EAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CACxC,CAAC;IAExB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAC1B,GAAG,MAAM,WAAW,EACpB,IAAA,mCAAqB,EAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CACxC,CAAC;IAEpB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAC9B,GAAG,MAAM,eAAe,EACxB,IAAA,4CAAyB,GAAE,CACN,CAAC;IAExB,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAChC,GAAG,MAAM,iBAAiB,EAC1B,IAAA,4CAA2B,GAAE,CACN,CAAC;IAE1B,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CACpC,GAAG,MAAM,qBAAqB,EAC9B,IAAA,wDAA+B,GAAE,CACN,CAAC;IAE9B,MAAM,eAAe,GAAG,IAAI,kCAAe,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IACnE,MAAM,WAAW,GAAG,IAAI,0BAAW,CAAC,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,CAAC,CAAC;IACvF,MAAM,aAAa,GAAG,IAAI,uCAAiB,CACzC,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,CACtF,CAAC;IAEF,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC;QAC1B,eAAe;QACf,WAAW;QACX,aAAa;QACb,eAAe;QACf,mBAAmB;QACnB,cAAc,EAAE,MAAM,CAAC,SAAS;KACjC,CAAC,CAAC;IAEH,OAAO;QACL,MAAM;QACN,MAAM,EAAE,aAAa;QACrB,eAAe;QACf,WAAW;QACX,MAAM,EAAE,EAAE,aAAa,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,mBAAmB,EAAE;KAC1F,CAAC;AACJ,CAAC;AAED,0CAAwB;AACxB,4CAA0B;AAC1B,8EAAqH;AAA5G,gIAAA,qBAAqB,OAAA;AAC9B,gEAA8D;AAArD,mHAAA,eAAe,OAAA;AACxB,wDAAsD;AAA7C,2GAAA,WAAW,OAAA;AACpB,sEAAmE;AAA1D,wHAAA,iBAAiB,OAAA;AAC1B,iDAA+C;AAAtC,uGAAA,SAAS,OAAA"}
|
|
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","defaultLogger","Router","z","baseDbSchema","baseRedisSchema","loggerSchema"],"mappings":"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","file":"index.js","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 { TemplateCategory, TemplateAudience } 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: TemplateCategory): Promise<EmailTemplateDocument[]>;\n findByAudience(audience: TemplateAudience): 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 subject: { type: String, required: true },\n body: { type: String, required: true },\n textBody: String,\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: TemplateCategory) {\n return this.find({ category, isActive: true }).sort({ name: 1 });\n },\n\n findByAudience(audience: TemplateAudience) {\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 subject: input.subject,\n body: input.body,\n textBody: input.textBody,\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 role: { type: String, enum: audienceValues || Object.values(TEMPLATE_AUDIENCE), required: true },\n platform: {\n type: String,\n required: true,\n ...(platformValues ? { enum: platformValues } : {})\n },\n conditions: [RuleConditionSchema]\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 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 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 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; 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 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; 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 runAt: Date;\n triggeredBy: string;\n duration: number;\n rulesProcessed: number;\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 runAt: { type: Date, required: true, default: () => new Date() },\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 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 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 { TemplateCategory, TemplateAudience } from '../constants';\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 'subject', 'body', 'textBody', 'variables', 'isActive'\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?: TemplateCategory;\n audience?: TemplateAudience;\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 validation = this.renderService.validateTemplate(input.body);\n if (!validation.valid) {\n throw new TemplateSyntaxError(`Template validation failed: ${validation.errors.join('; ')}`, validation.errors);\n }\n\n const variables = input.variables || this.renderService.extractVariables(\n `${input.subject} ${input.body} ${input.textBody || ''}`\n );\n\n return this.EmailTemplate.createTemplate({\n ...input,\n slug,\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.body) {\n const validation = this.renderService.validateTemplate(input.body);\n if (!validation.valid) {\n throw new TemplateSyntaxError(`Template validation failed: ${validation.errors.join('; ')}`, validation.errors);\n }\n }\n\n if (input.body || input.subject || input.textBody) {\n const subject = input.subject ?? template.subject;\n const body = input.body ?? template.body;\n const textBody = input.textBody ?? template.textBody;\n\n input.variables = this.renderService.extractVariables(\n `${subject} ${body} ${textBody || ''}`\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 const update: Record<string, unknown> = { $set: setFields };\n if (input.body || input.subject || input.textBody) {\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.subject,\n template.body,\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.subject,\n template.body,\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 } from '../types/rule.types';\nimport type { TemplateAudience } from '../constants';\nimport type { EmailRuleEngineConfig } from '../types/config.types';\nimport { TemplateNotFoundError, RuleNotFoundError, RuleTemplateIncompatibleError } from '../errors';\n\nconst UPDATEABLE_FIELDS = new Set([\n 'name', 'description', 'sortOrder', 'target', 'templateId',\n 'sendOnce', 'resendAfterDays', 'cooldownDays', 'autoApprove',\n 'maxPerRun', 'bypassThrottle', 'emailType'\n]);\n\nfunction validateRuleTemplateCompat(\n targetRole: TemplateAudience,\n targetPlatform: string,\n template: EmailTemplateDocument\n): string | null {\n const templateAudience = template.audience as TemplateAudience;\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 const compatError = validateRuleTemplateCompat(\n input.target.role,\n input.target.platform,\n template\n );\n if (compatError) {\n throw new RuleTemplateIncompatibleError(compatError);\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 const targetRole = input.target?.role ?? rule.target.role;\n const targetPlatform = input.target?.platform ?? rule.target.platform;\n\n if (input.templateId || input.target) {\n const template = await this.EmailTemplate.findById(templateId);\n if (!template) {\n throw new TemplateNotFoundError(templateId);\n }\n\n const compatError = validateRuleTemplateCompat(targetRole, targetPlatform, 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 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 type { EmailRuleEngineConfig, LogAdapter } from '../types/config.types';\n\nconst MS_PER_DAY = 86400000;\nconst DEFAULT_LOCK_TTL_MS = 30 * 60 * 1000;\nconst IDENTIFIER_CHUNK_SIZE = 50;\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\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 const keyPrefix = config.redis.keyPrefix || '';\n const lockTTL = config.options?.lockTTLMs || DEFAULT_LOCK_TTL_MS;\n this.lock = new RedisLock(\n config.redis.connection,\n `${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): Promise<void> {\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;\n }\n }\n\n const lockAcquired = await this.lock.acquire();\n if (!lockAcquired) {\n this.logger.warn('Rule runner already executing, skipping');\n return;\n }\n\n const runStartTime = Date.now();\n\n try {\n const throttleConfig = await this.EmailThrottleConfig.getConfig();\n const activeRules = await this.EmailRule.findActive();\n\n this.config.hooks?.onRunStart?.({ rulesCount: activeRules.length, triggeredBy });\n\n if (activeRules.length === 0) {\n this.logger.info('No active rules to process');\n await this.EmailRuleRunLog.create({\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 });\n return;\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\n for (const rule of activeRules) {\n const stats = await this.executeRule(rule, throttleMap, throttleConfig, templateMap);\n perRuleStats.push({\n ruleId: rule._id.toString(),\n ruleName: rule.name,\n ...stats\n });\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 runAt: new Date(),\n triggeredBy,\n duration: Date.now() - runStartTime,\n rulesProcessed: activeRules.length,\n totalStats,\n perRuleStats\n });\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 } finally {\n await this.lock.release();\n }\n }\n\n async executeRule(\n rule: any,\n throttleMap: Map<string, UserThrottle>,\n throttleConfig: any,\n templateMap?: Map<string, any>\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 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 compiled = this.templateRenderer.compileBatch(\n template.subject,\n template.body,\n template.textBody\n );\n\n const ruleId = rule._id.toString();\n const templateId = rule.templateId.toString();\n\n for (let i = 0; i < users.length; i++) {\n const user = users[i];\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 templateData = this.config.adapters.resolveData(user);\n const rendered = this.templateRenderer.renderFromCompiled(compiled, templateData);\n\n await this.config.adapters.sendEmail({\n identifierId: identifier.id,\n contactId: identifier.contactId,\n accountId: agentSelection.accountId,\n subject: rendered.subject,\n htmlBody: rendered.html,\n textBody: rendered.text,\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: rendered.subject }\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 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 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';\nimport type { TemplateCategory, TemplateAudience } from '../constants';\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 TemplateCategory | undefined,\n audience: audience as TemplateAudience | 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, subject, body, category, audience, platform } = req.body;\n\n if (!name || !subject || !body || !category || !audience || !platform) {\n return res.status(400).json({ success: false, error: 'name, subject, body, category, audience, and platform are required' });\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 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 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?.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 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';\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 runnerService.runAllRules(RUN_TRIGGER.Manual).catch(err => {\n log.error('Manual rule run failed', { error: err });\n });\n res.json({ success: true, data: { message: 'Rule run triggered' } });\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 return { triggerManualRun, getLatestRun };\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\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"]}
|