@astralibx/email-rule-engine 1.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.
Files changed (106) hide show
  1. package/README.md +192 -0
  2. package/dist/controllers/index.d.ts +5 -0
  3. package/dist/controllers/index.d.ts.map +1 -0
  4. package/dist/controllers/index.js +12 -0
  5. package/dist/controllers/index.js.map +1 -0
  6. package/dist/controllers/rule.controller.d.ts +13 -0
  7. package/dist/controllers/rule.controller.d.ts.map +1 -0
  8. package/dist/controllers/rule.controller.js +142 -0
  9. package/dist/controllers/rule.controller.js.map +1 -0
  10. package/dist/controllers/runner.controller.d.ts +8 -0
  11. package/dist/controllers/runner.controller.d.ts.map +1 -0
  12. package/dist/controllers/runner.controller.js +22 -0
  13. package/dist/controllers/runner.controller.js.map +1 -0
  14. package/dist/controllers/settings.controller.d.ts +7 -0
  15. package/dist/controllers/settings.controller.d.ts.map +1 -0
  16. package/dist/controllers/settings.controller.js +56 -0
  17. package/dist/controllers/settings.controller.js.map +1 -0
  18. package/dist/controllers/template.controller.d.ts +15 -0
  19. package/dist/controllers/template.controller.d.ts.map +1 -0
  20. package/dist/controllers/template.controller.js +169 -0
  21. package/dist/controllers/template.controller.js.map +1 -0
  22. package/dist/index.d.ts +32 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +67 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/routes/index.d.ts +16 -0
  27. package/dist/routes/index.d.ts.map +1 -0
  28. package/dist/routes/index.js +47 -0
  29. package/dist/routes/index.js.map +1 -0
  30. package/dist/schemas/index.d.ts +6 -0
  31. package/dist/schemas/index.d.ts.map +1 -0
  32. package/dist/schemas/index.js +14 -0
  33. package/dist/schemas/index.js.map +1 -0
  34. package/dist/schemas/rule-send.schema.d.ts +25 -0
  35. package/dist/schemas/rule-send.schema.d.ts.map +1 -0
  36. package/dist/schemas/rule-send.schema.js +41 -0
  37. package/dist/schemas/rule-send.schema.js.map +1 -0
  38. package/dist/schemas/rule.schema.d.ts +22 -0
  39. package/dist/schemas/rule.schema.d.ts.map +1 -0
  40. package/dist/schemas/rule.schema.js +81 -0
  41. package/dist/schemas/rule.schema.js.map +1 -0
  42. package/dist/schemas/run-log.schema.d.ts +39 -0
  43. package/dist/schemas/run-log.schema.d.ts.map +1 -0
  44. package/dist/schemas/run-log.schema.js +47 -0
  45. package/dist/schemas/run-log.schema.js.map +1 -0
  46. package/dist/schemas/template.schema.d.ts +24 -0
  47. package/dist/schemas/template.schema.d.ts.map +1 -0
  48. package/dist/schemas/template.schema.js +65 -0
  49. package/dist/schemas/template.schema.js.map +1 -0
  50. package/dist/schemas/throttle-config.schema.d.ts +19 -0
  51. package/dist/schemas/throttle-config.schema.d.ts.map +1 -0
  52. package/dist/schemas/throttle-config.schema.js +32 -0
  53. package/dist/schemas/throttle-config.schema.js.map +1 -0
  54. package/dist/services/index.d.ts +5 -0
  55. package/dist/services/index.d.ts.map +1 -0
  56. package/dist/services/index.js +12 -0
  57. package/dist/services/index.js.map +1 -0
  58. package/dist/services/rule-runner.service.d.ts +31 -0
  59. package/dist/services/rule-runner.service.d.ts.map +1 -0
  60. package/dist/services/rule-runner.service.js +253 -0
  61. package/dist/services/rule-runner.service.js.map +1 -0
  62. package/dist/services/rule.service.d.ts +27 -0
  63. package/dist/services/rule.service.d.ts.map +1 -0
  64. package/dist/services/rule.service.js +127 -0
  65. package/dist/services/rule.service.js.map +1 -0
  66. package/dist/services/template-render.service.d.ts +23 -0
  67. package/dist/services/template-render.service.d.ts.map +1 -0
  68. package/dist/services/template-render.service.js +178 -0
  69. package/dist/services/template-render.service.js.map +1 -0
  70. package/dist/services/template.service.d.ts +42 -0
  71. package/dist/services/template.service.d.ts.map +1 -0
  72. package/dist/services/template.service.js +128 -0
  73. package/dist/services/template.service.js.map +1 -0
  74. package/dist/types/config.types.d.ts +50 -0
  75. package/dist/types/config.types.d.ts.map +1 -0
  76. package/dist/types/config.types.js +3 -0
  77. package/dist/types/config.types.js.map +1 -0
  78. package/dist/types/enums.d.ts +43 -0
  79. package/dist/types/enums.d.ts.map +1 -0
  80. package/dist/types/enums.js +40 -0
  81. package/dist/types/enums.js.map +1 -0
  82. package/dist/types/index.d.ts +6 -0
  83. package/dist/types/index.d.ts.map +1 -0
  84. package/dist/types/index.js +11 -0
  85. package/dist/types/index.js.map +1 -0
  86. package/dist/types/rule.types.d.ts +91 -0
  87. package/dist/types/rule.types.d.ts.map +1 -0
  88. package/dist/types/rule.types.js +3 -0
  89. package/dist/types/rule.types.js.map +1 -0
  90. package/dist/types/template.types.d.ts +43 -0
  91. package/dist/types/template.types.d.ts.map +1 -0
  92. package/dist/types/template.types.js +3 -0
  93. package/dist/types/template.types.js.map +1 -0
  94. package/dist/types/throttle.types.d.ts +15 -0
  95. package/dist/types/throttle.types.d.ts.map +1 -0
  96. package/dist/types/throttle.types.js +3 -0
  97. package/dist/types/throttle.types.js.map +1 -0
  98. package/dist/utils/express-helpers.d.ts +4 -0
  99. package/dist/utils/express-helpers.d.ts.map +1 -0
  100. package/dist/utils/express-helpers.js +15 -0
  101. package/dist/utils/express-helpers.js.map +1 -0
  102. package/dist/utils/redis-lock.d.ts +13 -0
  103. package/dist/utils/redis-lock.d.ts.map +1 -0
  104. package/dist/utils/redis-lock.js +36 -0
  105. package/dist/utils/redis-lock.js.map +1 -0
  106. package/package.json +49 -0
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RuleService = void 0;
4
+ const UPDATEABLE_FIELDS = new Set([
5
+ 'name', 'description', 'sortOrder', 'target', 'templateId',
6
+ 'sendOnce', 'resendAfterDays', 'cooldownDays', 'autoApprove',
7
+ 'maxPerRun', 'bypassThrottle', 'emailType'
8
+ ]);
9
+ function validateRuleTemplateCompat(targetRole, targetPlatform, template) {
10
+ const templateAudience = template.audience;
11
+ const templatePlatform = template.platform;
12
+ if (templateAudience !== 'all') {
13
+ if (targetRole === 'all') {
14
+ return `Template "${template.name}" targets ${templateAudience} only, but rule targets all users`;
15
+ }
16
+ if (targetRole !== templateAudience) {
17
+ return `Template targets ${templateAudience}, but rule targets ${targetRole}`;
18
+ }
19
+ }
20
+ if (templatePlatform !== 'both') {
21
+ if (targetPlatform === 'both') {
22
+ return `Template is for ${templatePlatform} only, but rule targets all platforms`;
23
+ }
24
+ if (templatePlatform !== targetPlatform) {
25
+ return `Template is for ${templatePlatform}, but rule targets ${targetPlatform}`;
26
+ }
27
+ }
28
+ return null;
29
+ }
30
+ class RuleService {
31
+ EmailRule;
32
+ EmailTemplate;
33
+ EmailRuleRunLog;
34
+ config;
35
+ constructor(EmailRule, EmailTemplate, EmailRuleRunLog, config) {
36
+ this.EmailRule = EmailRule;
37
+ this.EmailTemplate = EmailTemplate;
38
+ this.EmailRuleRunLog = EmailRuleRunLog;
39
+ this.config = config;
40
+ }
41
+ async list() {
42
+ return this.EmailRule.find()
43
+ .populate('templateId', 'name slug')
44
+ .sort({ sortOrder: 1, createdAt: -1 });
45
+ }
46
+ async getById(id) {
47
+ return this.EmailRule.findById(id);
48
+ }
49
+ async create(input) {
50
+ const template = await this.EmailTemplate.findById(input.templateId);
51
+ if (!template) {
52
+ throw new Error(`Template not found: ${input.templateId}`);
53
+ }
54
+ const compatError = validateRuleTemplateCompat(input.target.role, input.target.platform, template);
55
+ if (compatError) {
56
+ throw new Error(`Audience mismatch: ${compatError}`);
57
+ }
58
+ return this.EmailRule.createRule(input);
59
+ }
60
+ async update(id, input) {
61
+ const rule = await this.EmailRule.findById(id);
62
+ if (!rule)
63
+ return null;
64
+ const templateId = input.templateId ?? rule.templateId.toString();
65
+ const targetRole = input.target?.role ?? rule.target.role;
66
+ const targetPlatform = input.target?.platform ?? rule.target.platform;
67
+ if (input.templateId || input.target) {
68
+ const template = await this.EmailTemplate.findById(templateId);
69
+ if (!template) {
70
+ throw new Error(`Template not found: ${templateId}`);
71
+ }
72
+ const compatError = validateRuleTemplateCompat(targetRole, targetPlatform, template);
73
+ if (compatError) {
74
+ throw new Error(`Audience mismatch: ${compatError}`);
75
+ }
76
+ }
77
+ const setFields = {};
78
+ for (const [key, value] of Object.entries(input)) {
79
+ if (value !== undefined && UPDATEABLE_FIELDS.has(key)) {
80
+ setFields[key] = value;
81
+ }
82
+ }
83
+ return this.EmailRule.findByIdAndUpdate(id, { $set: setFields }, { new: true });
84
+ }
85
+ async delete(id) {
86
+ const rule = await this.EmailRule.findById(id);
87
+ if (!rule)
88
+ return { deleted: false };
89
+ if (rule.totalSent > 0) {
90
+ rule.isActive = false;
91
+ await rule.save();
92
+ return { deleted: false, disabled: true };
93
+ }
94
+ await this.EmailRule.findByIdAndDelete(id);
95
+ return { deleted: true };
96
+ }
97
+ async toggleActive(id) {
98
+ const rule = await this.EmailRule.findById(id);
99
+ if (!rule)
100
+ return null;
101
+ if (!rule.isActive) {
102
+ const template = await this.EmailTemplate.findById(rule.templateId);
103
+ if (!template) {
104
+ throw new Error('Cannot activate rule: linked template not found');
105
+ }
106
+ if (!template.isActive) {
107
+ throw new Error('Cannot activate rule: linked template is inactive');
108
+ }
109
+ }
110
+ rule.isActive = !rule.isActive;
111
+ await rule.save();
112
+ return rule;
113
+ }
114
+ async dryRun(id) {
115
+ const rule = await this.EmailRule.findById(id);
116
+ if (!rule) {
117
+ throw new Error('Rule not found');
118
+ }
119
+ const users = await this.config.adapters.queryUsers(rule.target, 50000);
120
+ return { matchedCount: users.length, ruleId: id };
121
+ }
122
+ async getRunHistory(limit = 20) {
123
+ return this.EmailRuleRunLog.getRecent(limit);
124
+ }
125
+ }
126
+ exports.RuleService = RuleService;
127
+ //# sourceMappingURL=rule.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule.service.js","sourceRoot":"","sources":["../../src/services/rule.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export interface RenderResult {
2
+ html: string;
3
+ text: string;
4
+ subject: string;
5
+ }
6
+ export interface CompiledTemplate {
7
+ subjectFn: HandlebarsTemplateDelegate;
8
+ bodyFn: HandlebarsTemplateDelegate;
9
+ textBodyFn?: HandlebarsTemplateDelegate;
10
+ }
11
+ export declare class TemplateRenderService {
12
+ constructor();
13
+ renderSingle(subject: string, body: string, data: Record<string, unknown>, textBody?: string): RenderResult;
14
+ compileBatch(subject: string, body: string, textBody?: string): CompiledTemplate;
15
+ renderFromCompiled(compiled: CompiledTemplate, data: Record<string, unknown>): RenderResult;
16
+ renderPreview(subject: string, body: string, data: Record<string, unknown>, textBody?: string): RenderResult;
17
+ extractVariables(template: string): string[];
18
+ validateTemplate(body: string): {
19
+ valid: boolean;
20
+ errors: string[];
21
+ };
22
+ }
23
+ //# sourceMappingURL=template-render.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-render.service.d.ts","sourceRoot":"","sources":["../../src/services/template-render.service.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,0BAA0B,CAAC;IACtC,MAAM,EAAE,0BAA0B,CAAC;IACnC,UAAU,CAAC,EAAE,0BAA0B,CAAC;CACzC;AA4GD,qBAAa,qBAAqB;;IAKhC,YAAY,CACV,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,QAAQ,CAAC,EAAE,MAAM,GAChB,YAAY;IAqBf,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,gBAAgB;IAWhF,kBAAkB,CAChB,QAAQ,EAAE,gBAAgB,EAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,YAAY;IAUf,aAAa,CACX,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,QAAQ,CAAC,EAAE,MAAM,GAChB,YAAY;IAIf,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE;IAe5C,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;CAuBrE"}
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TemplateRenderService = void 0;
7
+ const handlebars_1 = __importDefault(require("handlebars"));
8
+ const mjml_1 = __importDefault(require("mjml"));
9
+ const html_to_text_1 = require("html-to-text");
10
+ const MJML_BASE_OPEN = `<mjml>
11
+ <mj-head>
12
+ <mj-attributes>
13
+ <mj-all font-family="Arial, sans-serif" />
14
+ <mj-text font-size="15px" color="#333333" line-height="1.6" />
15
+ </mj-attributes>
16
+ </mj-head>
17
+ <mj-body background-color="#ffffff">
18
+ <mj-section padding="20px">
19
+ <mj-column>
20
+ <mj-text>`;
21
+ const MJML_BASE_CLOSE = ` </mj-text>
22
+ </mj-column>
23
+ </mj-section>
24
+ </mj-body>
25
+ </mjml>`;
26
+ const DATE_FORMAT_OPTIONS = {
27
+ day: 'numeric',
28
+ month: 'short',
29
+ year: 'numeric'
30
+ };
31
+ function registerHelpers() {
32
+ handlebars_1.default.registerHelper('currency', (val) => {
33
+ return `₹${Number(val).toLocaleString('en-IN')}`;
34
+ });
35
+ handlebars_1.default.registerHelper('formatDate', (date) => {
36
+ const d = new Date(date);
37
+ return d.toLocaleDateString('en-IN', DATE_FORMAT_OPTIONS);
38
+ });
39
+ handlebars_1.default.registerHelper('capitalize', (str) => {
40
+ if (!str)
41
+ return '';
42
+ return str.charAt(0).toUpperCase() + str.slice(1);
43
+ });
44
+ handlebars_1.default.registerHelper('eq', (a, b) => a === b);
45
+ handlebars_1.default.registerHelper('neq', (a, b) => a !== b);
46
+ handlebars_1.default.registerHelper('not', (val) => !val);
47
+ handlebars_1.default.registerHelper('gt', (a, b) => a > b);
48
+ handlebars_1.default.registerHelper('lt', (a, b) => a < b);
49
+ handlebars_1.default.registerHelper('gte', (a, b) => a >= b);
50
+ handlebars_1.default.registerHelper('lte', (a, b) => a <= b);
51
+ handlebars_1.default.registerHelper('lowercase', (str) => {
52
+ return str ? str.toLowerCase() : '';
53
+ });
54
+ handlebars_1.default.registerHelper('uppercase', (str) => {
55
+ return str ? str.toUpperCase() : '';
56
+ });
57
+ handlebars_1.default.registerHelper('join', (arr, separator) => {
58
+ if (!Array.isArray(arr))
59
+ return '';
60
+ const sep = typeof separator === 'string' ? separator : ', ';
61
+ return arr.join(sep);
62
+ });
63
+ handlebars_1.default.registerHelper('pluralize', (count, singular, plural) => {
64
+ return count === 1 ? singular : (typeof plural === 'string' ? plural : singular + 's');
65
+ });
66
+ }
67
+ let helpersRegistered = false;
68
+ function ensureHelpers() {
69
+ if (!helpersRegistered) {
70
+ registerHelpers();
71
+ helpersRegistered = true;
72
+ }
73
+ }
74
+ function wrapInMjml(body) {
75
+ if (body.trim().startsWith('<mjml')) {
76
+ return body;
77
+ }
78
+ return `${MJML_BASE_OPEN}${body}${MJML_BASE_CLOSE}`;
79
+ }
80
+ function compileMjml(mjmlSource) {
81
+ const result = (0, mjml_1.default)(mjmlSource, {
82
+ validationLevel: 'soft',
83
+ minify: false
84
+ });
85
+ if (result.errors && result.errors.length > 0) {
86
+ const criticalErrors = result.errors.filter((e) => e.tagName !== undefined);
87
+ if (criticalErrors.length > 0) {
88
+ throw new Error(`MJML compilation errors: ${criticalErrors.map(e => e.message).join('; ')}`);
89
+ }
90
+ }
91
+ return result.html;
92
+ }
93
+ function htmlToPlainText(html) {
94
+ return (0, html_to_text_1.convert)(html, {
95
+ wordwrap: 80,
96
+ selectors: [
97
+ { selector: 'a', options: { hideLinkHrefIfSameAsText: true } },
98
+ { selector: 'img', format: 'skip' }
99
+ ]
100
+ });
101
+ }
102
+ class TemplateRenderService {
103
+ constructor() {
104
+ ensureHelpers();
105
+ }
106
+ renderSingle(subject, body, data, textBody) {
107
+ const subjectFn = handlebars_1.default.compile(subject);
108
+ const resolvedSubject = subjectFn(data);
109
+ const bodyFn = handlebars_1.default.compile(body);
110
+ const resolvedBody = bodyFn(data);
111
+ const mjmlSource = wrapInMjml(resolvedBody);
112
+ const html = compileMjml(mjmlSource);
113
+ let text;
114
+ if (textBody) {
115
+ const textFn = handlebars_1.default.compile(textBody);
116
+ text = textFn(data);
117
+ }
118
+ else {
119
+ text = htmlToPlainText(html);
120
+ }
121
+ return { html, text, subject: resolvedSubject };
122
+ }
123
+ compileBatch(subject, body, textBody) {
124
+ const mjmlSource = wrapInMjml(body);
125
+ const htmlWithHandlebars = compileMjml(mjmlSource);
126
+ const subjectFn = handlebars_1.default.compile(subject);
127
+ const bodyFn = handlebars_1.default.compile(htmlWithHandlebars);
128
+ const textBodyFn = textBody ? handlebars_1.default.compile(textBody) : undefined;
129
+ return { subjectFn, bodyFn, textBodyFn };
130
+ }
131
+ renderFromCompiled(compiled, data) {
132
+ const subject = compiled.subjectFn(data);
133
+ const html = compiled.bodyFn(data);
134
+ const text = compiled.textBodyFn
135
+ ? compiled.textBodyFn(data)
136
+ : htmlToPlainText(html);
137
+ return { html, text, subject };
138
+ }
139
+ renderPreview(subject, body, data, textBody) {
140
+ return this.renderSingle(subject, body, data, textBody);
141
+ }
142
+ extractVariables(template) {
143
+ const regex = /\{\{(?!#|\/|!|>)([^}]+)\}\}/g;
144
+ const variables = new Set();
145
+ let match;
146
+ while ((match = regex.exec(template)) !== null) {
147
+ const variable = match[1].trim();
148
+ if (!variable.startsWith('else')) {
149
+ variables.add(variable);
150
+ }
151
+ }
152
+ return Array.from(variables).sort();
153
+ }
154
+ validateTemplate(body) {
155
+ const errors = [];
156
+ try {
157
+ handlebars_1.default.precompile(body);
158
+ }
159
+ catch (e) {
160
+ errors.push(`Handlebars syntax error: ${e.message}`);
161
+ }
162
+ const mjmlSource = wrapInMjml(body);
163
+ try {
164
+ const result = (0, mjml_1.default)(mjmlSource, { validationLevel: 'strict' });
165
+ if (result.errors && result.errors.length > 0) {
166
+ for (const err of result.errors) {
167
+ errors.push(`MJML error: ${err.message}`);
168
+ }
169
+ }
170
+ }
171
+ catch (e) {
172
+ errors.push(`MJML compilation error: ${e.message}`);
173
+ }
174
+ return { valid: errors.length === 0, errors };
175
+ }
176
+ }
177
+ exports.TemplateRenderService = TemplateRenderService;
178
+ //# sourceMappingURL=template-render.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-render.service.js","sourceRoot":"","sources":["../../src/services/template-render.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import type { EmailTemplateModel, EmailTemplateDocument } from '../schemas/template.schema';
2
+ import type { CreateEmailTemplateInput, UpdateEmailTemplateInput } from '../types/template.types';
3
+ import type { TemplateCategory, TemplateAudience } from '../types/enums';
4
+ import type { EmailRuleEngineConfig } from '../types/config.types';
5
+ export declare class TemplateService {
6
+ private EmailTemplate;
7
+ private config;
8
+ private renderService;
9
+ constructor(EmailTemplate: EmailTemplateModel, config: EmailRuleEngineConfig);
10
+ list(filters?: {
11
+ category?: TemplateCategory;
12
+ audience?: TemplateAudience;
13
+ platform?: string;
14
+ isActive?: boolean;
15
+ }): Promise<EmailTemplateDocument[]>;
16
+ getById(id: string): Promise<EmailTemplateDocument | null>;
17
+ getBySlug(slug: string): Promise<EmailTemplateDocument | null>;
18
+ create(input: CreateEmailTemplateInput): Promise<EmailTemplateDocument>;
19
+ update(id: string, input: UpdateEmailTemplateInput): Promise<EmailTemplateDocument | null>;
20
+ delete(id: string): Promise<boolean>;
21
+ toggleActive(id: string): Promise<EmailTemplateDocument | null>;
22
+ preview(id: string, sampleData: Record<string, unknown>): Promise<{
23
+ html: string;
24
+ text: string;
25
+ subject: string;
26
+ } | null>;
27
+ previewRaw(subject: string, body: string, sampleData: Record<string, unknown>, textBody?: string): Promise<{
28
+ html: string;
29
+ text: string;
30
+ subject: string;
31
+ }>;
32
+ validate(body: string): Promise<{
33
+ valid: boolean;
34
+ errors: string[];
35
+ variables: string[];
36
+ }>;
37
+ sendTestEmail(id: string, testEmail: string, sampleData: Record<string, unknown>): Promise<{
38
+ success: boolean;
39
+ error?: string;
40
+ }>;
41
+ }
42
+ //# sourceMappingURL=template.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.service.d.ts","sourceRoot":"","sources":["../../src/services/template.service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAC5F,OAAO,KAAK,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAClG,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAUnE,qBAAa,eAAe;IAIxB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,MAAM;IAJhB,OAAO,CAAC,aAAa,CAA+B;gBAG1C,aAAa,EAAE,kBAAkB,EACjC,MAAM,EAAE,qBAAqB;IAGjC,IAAI,CAAC,OAAO,CAAC,EAAE;QACnB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;QAC5B,QAAQ,CAAC,EAAE,gBAAgB,CAAC;QAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAW9B,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAI1D,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAI9D,MAAM,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAwBvE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAwC1F,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpC,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IAS/D,OAAO,CACX,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAY5D,UAAU,CACd,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAIrD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAM1F,aAAa,CACjB,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CA6BjD"}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TemplateService = void 0;
4
+ const template_render_service_1 = require("./template-render.service");
5
+ function slugify(name) {
6
+ return name
7
+ .toLowerCase()
8
+ .trim()
9
+ .replace(/[^a-z0-9]+/g, '-')
10
+ .replace(/^-|-$/g, '');
11
+ }
12
+ class TemplateService {
13
+ EmailTemplate;
14
+ config;
15
+ renderService = new template_render_service_1.TemplateRenderService();
16
+ constructor(EmailTemplate, config) {
17
+ this.EmailTemplate = EmailTemplate;
18
+ this.config = config;
19
+ }
20
+ async list(filters) {
21
+ const query = {};
22
+ if (filters?.category)
23
+ query['category'] = filters.category;
24
+ if (filters?.audience)
25
+ query['audience'] = filters.audience;
26
+ if (filters?.platform)
27
+ query['platform'] = filters.platform;
28
+ if (filters?.isActive !== undefined)
29
+ query['isActive'] = filters.isActive;
30
+ return this.EmailTemplate.find(query).sort({ category: 1, name: 1 });
31
+ }
32
+ async getById(id) {
33
+ return this.EmailTemplate.findById(id);
34
+ }
35
+ async getBySlug(slug) {
36
+ return this.EmailTemplate.findBySlug(slug);
37
+ }
38
+ async create(input) {
39
+ const slug = input.slug || slugify(input.name);
40
+ const existing = await this.EmailTemplate.findBySlug(slug);
41
+ if (existing) {
42
+ throw new Error(`Template with slug "${slug}" already exists`);
43
+ }
44
+ const validation = this.renderService.validateTemplate(input.body);
45
+ if (!validation.valid) {
46
+ throw new Error(`Template validation failed: ${validation.errors.join('; ')}`);
47
+ }
48
+ const variables = input.variables || this.renderService.extractVariables(`${input.subject} ${input.body} ${input.textBody || ''}`);
49
+ return this.EmailTemplate.createTemplate({
50
+ ...input,
51
+ slug,
52
+ variables
53
+ });
54
+ }
55
+ async update(id, input) {
56
+ const template = await this.EmailTemplate.findById(id);
57
+ if (!template)
58
+ return null;
59
+ if (input.body) {
60
+ const validation = this.renderService.validateTemplate(input.body);
61
+ if (!validation.valid) {
62
+ throw new Error(`Template validation failed: ${validation.errors.join('; ')}`);
63
+ }
64
+ }
65
+ if (input.body || input.subject || input.textBody) {
66
+ const subject = input.subject ?? template.subject;
67
+ const body = input.body ?? template.body;
68
+ const textBody = input.textBody ?? template.textBody;
69
+ input.variables = this.renderService.extractVariables(`${subject} ${body} ${textBody || ''}`);
70
+ }
71
+ const setFields = {};
72
+ for (const [key, value] of Object.entries(input)) {
73
+ if (value !== undefined) {
74
+ setFields[key] = value;
75
+ }
76
+ }
77
+ const update = { $set: setFields };
78
+ if (input.body || input.subject || input.textBody) {
79
+ update['$inc'] = { version: 1 };
80
+ }
81
+ return this.EmailTemplate.findByIdAndUpdate(id, update, { new: true });
82
+ }
83
+ async delete(id) {
84
+ const result = await this.EmailTemplate.findByIdAndDelete(id);
85
+ return result !== null;
86
+ }
87
+ async toggleActive(id) {
88
+ const template = await this.EmailTemplate.findById(id);
89
+ if (!template)
90
+ return null;
91
+ template.isActive = !template.isActive;
92
+ await template.save();
93
+ return template;
94
+ }
95
+ async preview(id, sampleData) {
96
+ const template = await this.EmailTemplate.findById(id);
97
+ if (!template)
98
+ return null;
99
+ return this.renderService.renderPreview(template.subject, template.body, sampleData, template.textBody);
100
+ }
101
+ async previewRaw(subject, body, sampleData, textBody) {
102
+ return this.renderService.renderPreview(subject, body, sampleData, textBody);
103
+ }
104
+ async validate(body) {
105
+ const validation = this.renderService.validateTemplate(body);
106
+ const variables = this.renderService.extractVariables(body);
107
+ return { ...validation, variables };
108
+ }
109
+ async sendTestEmail(id, testEmail, sampleData) {
110
+ if (!this.config.adapters.sendTestEmail) {
111
+ return { success: false, error: 'Test email sending not configured' };
112
+ }
113
+ const template = await this.EmailTemplate.findById(id);
114
+ if (!template) {
115
+ return { success: false, error: 'Template not found' };
116
+ }
117
+ const rendered = this.renderService.renderSingle(template.subject, template.body, sampleData, template.textBody);
118
+ try {
119
+ await this.config.adapters.sendTestEmail(testEmail, `[TEST] ${rendered.subject}`, rendered.html, rendered.text);
120
+ return { success: true };
121
+ }
122
+ catch (error) {
123
+ return { success: false, error: error.message };
124
+ }
125
+ }
126
+ }
127
+ exports.TemplateService = TemplateService;
128
+ //# sourceMappingURL=template.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.service.js","sourceRoot":"","sources":["../../src/services/template.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { Connection } from 'mongoose';
2
+ import type { Redis } from 'ioredis';
3
+ import { RuleTarget } from './rule.types';
4
+ export interface SendEmailParams {
5
+ identifierId: string;
6
+ contactId: string;
7
+ accountId: string;
8
+ subject: string;
9
+ htmlBody: string;
10
+ textBody: string;
11
+ ruleId: string;
12
+ autoApprove: boolean;
13
+ }
14
+ export interface AgentSelection {
15
+ accountId: string;
16
+ }
17
+ export interface RecipientIdentifier {
18
+ id: string;
19
+ contactId: string;
20
+ }
21
+ export interface LogAdapter {
22
+ info: (msg: string, meta?: Record<string, unknown>) => void;
23
+ warn: (msg: string, meta?: Record<string, unknown>) => void;
24
+ error: (msg: string, meta?: Record<string, unknown>) => void;
25
+ }
26
+ export interface EmailRuleEngineConfig {
27
+ db: {
28
+ connection: Connection;
29
+ collectionPrefix?: string;
30
+ };
31
+ redis: {
32
+ connection: Redis;
33
+ keyPrefix?: string;
34
+ };
35
+ adapters: {
36
+ queryUsers: (target: RuleTarget, limit: number) => Promise<Record<string, unknown>[]>;
37
+ resolveData: (user: Record<string, unknown>) => Record<string, unknown>;
38
+ sendEmail: (params: SendEmailParams) => Promise<void>;
39
+ selectAgent: (identifierId: string) => Promise<AgentSelection | null>;
40
+ findIdentifier: (email: string) => Promise<RecipientIdentifier | null>;
41
+ sendTestEmail?: (to: string, subject: string, html: string, text: string) => Promise<void>;
42
+ };
43
+ platforms?: string[];
44
+ logger?: LogAdapter;
45
+ options?: {
46
+ lockTTLMs?: number;
47
+ defaultMaxPerRun?: number;
48
+ };
49
+ }
50
+ //# sourceMappingURL=config.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.types.d.ts","sourceRoot":"","sources":["../../src/types/config.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC5D,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC5D,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAC9D;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE;QACF,UAAU,EAAE,UAAU,CAAC;QACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IAEF,KAAK,EAAE;QACL,UAAU,EAAE,KAAK,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IAEF,QAAQ,EAAE;QACR,UAAU,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QACtF,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACxE,SAAS,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACtD,WAAW,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;QACtE,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;QACvE,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAC5F,CAAC;IAEF,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB,MAAM,CAAC,EAAE,UAAU,CAAC;IAEpB,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=config.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.types.js","sourceRoot":"","sources":["../../src/types/config.types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,43 @@
1
+ export declare const TemplateCategory: {
2
+ readonly Onboarding: "onboarding";
3
+ readonly Engagement: "engagement";
4
+ readonly Transactional: "transactional";
5
+ readonly ReEngagement: "re-engagement";
6
+ readonly Announcement: "announcement";
7
+ };
8
+ export type TemplateCategory = typeof TemplateCategory[keyof typeof TemplateCategory];
9
+ export declare const TemplateAudience: {
10
+ readonly Customer: "customer";
11
+ readonly Provider: "provider";
12
+ readonly All: "all";
13
+ };
14
+ export type TemplateAudience = typeof TemplateAudience[keyof typeof TemplateAudience];
15
+ export declare const RuleOperator: {
16
+ readonly Eq: "eq";
17
+ readonly Neq: "neq";
18
+ readonly Gt: "gt";
19
+ readonly Gte: "gte";
20
+ readonly Lt: "lt";
21
+ readonly Lte: "lte";
22
+ readonly Exists: "exists";
23
+ readonly NotExists: "not_exists";
24
+ readonly In: "in";
25
+ readonly NotIn: "not_in";
26
+ readonly Contains: "contains";
27
+ };
28
+ export type RuleOperator = typeof RuleOperator[keyof typeof RuleOperator];
29
+ export declare const EmailType: {
30
+ readonly Automated: "automated";
31
+ readonly Transactional: "transactional";
32
+ };
33
+ export type EmailType = typeof EmailType[keyof typeof EmailType];
34
+ export declare const RunTrigger: {
35
+ readonly Cron: "cron";
36
+ readonly Manual: "manual";
37
+ };
38
+ export type RunTrigger = typeof RunTrigger[keyof typeof RunTrigger];
39
+ export declare const ThrottleWindow: {
40
+ readonly Rolling: "rolling";
41
+ };
42
+ export type ThrottleWindow = typeof ThrottleWindow[keyof typeof ThrottleWindow];
43
+ //# sourceMappingURL=enums.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enums.d.ts","sourceRoot":"","sources":["../../src/types/enums.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gBAAgB;;;;;;CAMnB,CAAC;AACX,MAAM,MAAM,gBAAgB,GAAG,OAAO,gBAAgB,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAC;AAEtF,eAAO,MAAM,gBAAgB;;;;CAInB,CAAC;AACX,MAAM,MAAM,gBAAgB,GAAG,OAAO,gBAAgB,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAC;AAEtF,eAAO,MAAM,YAAY;;;;;;;;;;;;CAYf,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,OAAO,YAAY,CAAC,MAAM,OAAO,YAAY,CAAC,CAAC;AAE1E,eAAO,MAAM,SAAS;;;CAGZ,CAAC;AACX,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,MAAM,OAAO,SAAS,CAAC,CAAC;AAEjE,eAAO,MAAM,UAAU;;;CAGb,CAAC;AACX,MAAM,MAAM,UAAU,GAAG,OAAO,UAAU,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AAEpE,eAAO,MAAM,cAAc;;CAEjB,CAAC;AACX,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAC,MAAM,OAAO,cAAc,CAAC,CAAC"}