@astralibx/email-rule-engine 1.2.2 → 3.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 (109) hide show
  1. package/README.md +93 -46
  2. package/dist/index.d.mts +607 -0
  3. package/dist/index.d.ts +595 -20
  4. package/dist/index.js +1731 -65
  5. package/dist/index.js.map +1 -1
  6. package/dist/index.mjs +1699 -0
  7. package/dist/index.mjs.map +1 -0
  8. package/package.json +27 -8
  9. package/dist/controllers/index.d.ts +0 -5
  10. package/dist/controllers/index.d.ts.map +0 -1
  11. package/dist/controllers/index.js +0 -12
  12. package/dist/controllers/index.js.map +0 -1
  13. package/dist/controllers/rule.controller.d.ts +0 -13
  14. package/dist/controllers/rule.controller.d.ts.map +0 -1
  15. package/dist/controllers/rule.controller.js +0 -142
  16. package/dist/controllers/rule.controller.js.map +0 -1
  17. package/dist/controllers/runner.controller.d.ts +0 -8
  18. package/dist/controllers/runner.controller.d.ts.map +0 -1
  19. package/dist/controllers/runner.controller.js +0 -22
  20. package/dist/controllers/runner.controller.js.map +0 -1
  21. package/dist/controllers/settings.controller.d.ts +0 -7
  22. package/dist/controllers/settings.controller.d.ts.map +0 -1
  23. package/dist/controllers/settings.controller.js +0 -56
  24. package/dist/controllers/settings.controller.js.map +0 -1
  25. package/dist/controllers/template.controller.d.ts +0 -15
  26. package/dist/controllers/template.controller.d.ts.map +0 -1
  27. package/dist/controllers/template.controller.js +0 -169
  28. package/dist/controllers/template.controller.js.map +0 -1
  29. package/dist/index.d.ts.map +0 -1
  30. package/dist/routes/index.d.ts +0 -16
  31. package/dist/routes/index.d.ts.map +0 -1
  32. package/dist/routes/index.js +0 -47
  33. package/dist/routes/index.js.map +0 -1
  34. package/dist/schemas/index.d.ts +0 -6
  35. package/dist/schemas/index.d.ts.map +0 -1
  36. package/dist/schemas/index.js +0 -14
  37. package/dist/schemas/index.js.map +0 -1
  38. package/dist/schemas/rule-send.schema.d.ts +0 -25
  39. package/dist/schemas/rule-send.schema.d.ts.map +0 -1
  40. package/dist/schemas/rule-send.schema.js +0 -41
  41. package/dist/schemas/rule-send.schema.js.map +0 -1
  42. package/dist/schemas/rule.schema.d.ts +0 -22
  43. package/dist/schemas/rule.schema.d.ts.map +0 -1
  44. package/dist/schemas/rule.schema.js +0 -81
  45. package/dist/schemas/rule.schema.js.map +0 -1
  46. package/dist/schemas/run-log.schema.d.ts +0 -39
  47. package/dist/schemas/run-log.schema.d.ts.map +0 -1
  48. package/dist/schemas/run-log.schema.js +0 -47
  49. package/dist/schemas/run-log.schema.js.map +0 -1
  50. package/dist/schemas/template.schema.d.ts +0 -24
  51. package/dist/schemas/template.schema.d.ts.map +0 -1
  52. package/dist/schemas/template.schema.js +0 -65
  53. package/dist/schemas/template.schema.js.map +0 -1
  54. package/dist/schemas/throttle-config.schema.d.ts +0 -19
  55. package/dist/schemas/throttle-config.schema.d.ts.map +0 -1
  56. package/dist/schemas/throttle-config.schema.js +0 -32
  57. package/dist/schemas/throttle-config.schema.js.map +0 -1
  58. package/dist/services/index.d.ts +0 -5
  59. package/dist/services/index.d.ts.map +0 -1
  60. package/dist/services/index.js +0 -12
  61. package/dist/services/index.js.map +0 -1
  62. package/dist/services/rule-runner.service.d.ts +0 -31
  63. package/dist/services/rule-runner.service.d.ts.map +0 -1
  64. package/dist/services/rule-runner.service.js +0 -279
  65. package/dist/services/rule-runner.service.js.map +0 -1
  66. package/dist/services/rule.service.d.ts +0 -27
  67. package/dist/services/rule.service.d.ts.map +0 -1
  68. package/dist/services/rule.service.js +0 -127
  69. package/dist/services/rule.service.js.map +0 -1
  70. package/dist/services/template-render.service.d.ts +0 -23
  71. package/dist/services/template-render.service.d.ts.map +0 -1
  72. package/dist/services/template-render.service.js +0 -178
  73. package/dist/services/template-render.service.js.map +0 -1
  74. package/dist/services/template.service.d.ts +0 -42
  75. package/dist/services/template.service.d.ts.map +0 -1
  76. package/dist/services/template.service.js +0 -128
  77. package/dist/services/template.service.js.map +0 -1
  78. package/dist/types/config.types.d.ts +0 -85
  79. package/dist/types/config.types.d.ts.map +0 -1
  80. package/dist/types/config.types.js +0 -3
  81. package/dist/types/config.types.js.map +0 -1
  82. package/dist/types/enums.d.ts +0 -43
  83. package/dist/types/enums.d.ts.map +0 -1
  84. package/dist/types/enums.js +0 -40
  85. package/dist/types/enums.js.map +0 -1
  86. package/dist/types/index.d.ts +0 -6
  87. package/dist/types/index.d.ts.map +0 -1
  88. package/dist/types/index.js +0 -11
  89. package/dist/types/index.js.map +0 -1
  90. package/dist/types/rule.types.d.ts +0 -91
  91. package/dist/types/rule.types.d.ts.map +0 -1
  92. package/dist/types/rule.types.js +0 -3
  93. package/dist/types/rule.types.js.map +0 -1
  94. package/dist/types/template.types.d.ts +0 -43
  95. package/dist/types/template.types.d.ts.map +0 -1
  96. package/dist/types/template.types.js +0 -3
  97. package/dist/types/template.types.js.map +0 -1
  98. package/dist/types/throttle.types.d.ts +0 -15
  99. package/dist/types/throttle.types.d.ts.map +0 -1
  100. package/dist/types/throttle.types.js +0 -3
  101. package/dist/types/throttle.types.js.map +0 -1
  102. package/dist/utils/express-helpers.d.ts +0 -4
  103. package/dist/utils/express-helpers.d.ts.map +0 -1
  104. package/dist/utils/express-helpers.js +0 -15
  105. package/dist/utils/express-helpers.js.map +0 -1
  106. package/dist/utils/redis-lock.d.ts +0 -13
  107. package/dist/utils/redis-lock.d.ts.map +0 -1
  108. package/dist/utils/redis-lock.js +0 -36
  109. package/dist/utils/redis-lock.js.map +0 -1
@@ -1,178 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"template-render.service.js","sourceRoot":"","sources":["../../src/services/template-render.service.ts"],"names":[],"mappings":"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"}
@@ -1,42 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,128 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"template.service.js","sourceRoot":"","sources":["../../src/services/template.service.ts"],"names":[],"mappings":"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"}
@@ -1,85 +0,0 @@
1
- import type { Connection } from 'mongoose';
2
- import type { Redis } from 'ioredis';
3
- import type { RuleTarget, RuleRunStats, PerRuleStats } 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
- audiences?: string[];
45
- logger?: LogAdapter;
46
- options?: {
47
- lockTTLMs?: number;
48
- defaultMaxPerRun?: number;
49
- sendWindow?: {
50
- startHour: number;
51
- endHour: number;
52
- timezone: string;
53
- };
54
- delayBetweenSendsMs?: number;
55
- jitterMs?: number;
56
- };
57
- hooks?: {
58
- onRunStart?: (info: {
59
- rulesCount: number;
60
- triggeredBy: string;
61
- }) => void;
62
- onRuleStart?: (info: {
63
- ruleId: string;
64
- ruleName: string;
65
- matchedCount: number;
66
- }) => void;
67
- onSend?: (info: {
68
- ruleId: string;
69
- ruleName: string;
70
- email: string;
71
- status: 'sent' | 'error';
72
- }) => void;
73
- onRuleComplete?: (info: {
74
- ruleId: string;
75
- ruleName: string;
76
- stats: RuleRunStats;
77
- }) => void;
78
- onRunComplete?: (info: {
79
- duration: number;
80
- totalStats: RuleRunStats;
81
- perRuleStats: PerRuleStats[];
82
- }) => void;
83
- };
84
- }
85
- //# sourceMappingURL=config.types.d.ts.map
@@ -1 +0,0 @@
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,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE3E,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,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;QAC1B,UAAU,CAAC,EAAE;YACX,SAAS,EAAE,MAAM,CAAC;YAClB,OAAO,EAAE,MAAM,CAAC;YAChB,QAAQ,EAAE,MAAM,CAAC;SAClB,CAAC;QACF,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IAEF,KAAK,CAAC,EAAE;QACN,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;QACzE,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAC;QACzF,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,KAAK,IAAI,CAAC;QACvG,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,YAAY,CAAA;SAAE,KAAK,IAAI,CAAC;QAC3F,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE;YAAE,QAAQ,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,YAAY,CAAC;YAAC,YAAY,EAAE,YAAY,EAAE,CAAA;SAAE,KAAK,IAAI,CAAC;KAC9G,CAAC;CACH"}
@@ -1,3 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- //# sourceMappingURL=config.types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.types.js","sourceRoot":"","sources":["../../src/types/config.types.ts"],"names":[],"mappings":""}
@@ -1,43 +0,0 @@
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
@@ -1 +0,0 @@
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"}
@@ -1,40 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ThrottleWindow = exports.RunTrigger = exports.EmailType = exports.RuleOperator = exports.TemplateAudience = exports.TemplateCategory = void 0;
4
- exports.TemplateCategory = {
5
- Onboarding: 'onboarding',
6
- Engagement: 'engagement',
7
- Transactional: 'transactional',
8
- ReEngagement: 're-engagement',
9
- Announcement: 'announcement'
10
- };
11
- exports.TemplateAudience = {
12
- Customer: 'customer',
13
- Provider: 'provider',
14
- All: 'all'
15
- };
16
- exports.RuleOperator = {
17
- Eq: 'eq',
18
- Neq: 'neq',
19
- Gt: 'gt',
20
- Gte: 'gte',
21
- Lt: 'lt',
22
- Lte: 'lte',
23
- Exists: 'exists',
24
- NotExists: 'not_exists',
25
- In: 'in',
26
- NotIn: 'not_in',
27
- Contains: 'contains'
28
- };
29
- exports.EmailType = {
30
- Automated: 'automated',
31
- Transactional: 'transactional'
32
- };
33
- exports.RunTrigger = {
34
- Cron: 'cron',
35
- Manual: 'manual'
36
- };
37
- exports.ThrottleWindow = {
38
- Rolling: 'rolling'
39
- };
40
- //# sourceMappingURL=enums.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"enums.js","sourceRoot":"","sources":["../../src/types/enums.ts"],"names":[],"mappings":";;;AAAa,QAAA,gBAAgB,GAAG;IAC9B,UAAU,EAAE,YAAY;IACxB,UAAU,EAAE,YAAY;IACxB,aAAa,EAAE,eAAe;IAC9B,YAAY,EAAE,eAAe;IAC7B,YAAY,EAAE,cAAc;CACpB,CAAC;AAGE,QAAA,gBAAgB,GAAG;IAC9B,QAAQ,EAAE,UAAU;IACpB,QAAQ,EAAE,UAAU;IACpB,GAAG,EAAE,KAAK;CACF,CAAC;AAGE,QAAA,YAAY,GAAG;IAC1B,EAAE,EAAE,IAAI;IACR,GAAG,EAAE,KAAK;IACV,EAAE,EAAE,IAAI;IACR,GAAG,EAAE,KAAK;IACV,EAAE,EAAE,IAAI;IACR,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,YAAY;IACvB,EAAE,EAAE,IAAI;IACR,KAAK,EAAE,QAAQ;IACf,QAAQ,EAAE,UAAU;CACZ,CAAC;AAGE,QAAA,SAAS,GAAG;IACvB,SAAS,EAAE,WAAW;IACtB,aAAa,EAAE,eAAe;CACtB,CAAC;AAGE,QAAA,UAAU,GAAG;IACxB,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;CACR,CAAC;AAGE,QAAA,cAAc,GAAG;IAC5B,OAAO,EAAE,SAAS;CACV,CAAC"}
@@ -1,6 +0,0 @@
1
- export { TemplateCategory, TemplateAudience, RuleOperator, EmailType, RunTrigger, ThrottleWindow } from './enums';
2
- export type { EmailTemplate, CreateEmailTemplateInput, UpdateEmailTemplateInput } from './template.types';
3
- export type { RuleCondition, RuleRunStats, RuleTarget, EmailRule, CreateEmailRuleInput, UpdateEmailRuleInput, EmailRuleSend, PerRuleStats, EmailRuleRunLog } from './rule.types';
4
- export type { EmailThrottleConfig, UpdateEmailThrottleConfigInput } from './throttle.types';
5
- export type { EmailRuleEngineConfig, SendEmailParams, AgentSelection, RecipientIdentifier, LogAdapter } from './config.types';
6
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAClH,YAAY,EACV,aAAa,EAAE,wBAAwB,EAAE,wBAAwB,EAClE,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,aAAa,EAAE,YAAY,EAAE,UAAU,EACvC,SAAS,EAAE,oBAAoB,EAAE,oBAAoB,EACrD,aAAa,EAAE,YAAY,EAAE,eAAe,EAC7C,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,mBAAmB,EAAE,8BAA8B,EAAE,MAAM,kBAAkB,CAAC;AAC5F,YAAY,EACV,qBAAqB,EAAE,eAAe,EAAE,cAAc,EACtD,mBAAmB,EAAE,UAAU,EAChC,MAAM,gBAAgB,CAAC"}
@@ -1,11 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ThrottleWindow = exports.RunTrigger = exports.EmailType = exports.RuleOperator = exports.TemplateAudience = exports.TemplateCategory = void 0;
4
- var enums_1 = require("./enums");
5
- Object.defineProperty(exports, "TemplateCategory", { enumerable: true, get: function () { return enums_1.TemplateCategory; } });
6
- Object.defineProperty(exports, "TemplateAudience", { enumerable: true, get: function () { return enums_1.TemplateAudience; } });
7
- Object.defineProperty(exports, "RuleOperator", { enumerable: true, get: function () { return enums_1.RuleOperator; } });
8
- Object.defineProperty(exports, "EmailType", { enumerable: true, get: function () { return enums_1.EmailType; } });
9
- Object.defineProperty(exports, "RunTrigger", { enumerable: true, get: function () { return enums_1.RunTrigger; } });
10
- Object.defineProperty(exports, "ThrottleWindow", { enumerable: true, get: function () { return enums_1.ThrottleWindow; } });
11
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";;;AAAA,iCAAkH;AAAzG,yGAAA,gBAAgB,OAAA;AAAE,yGAAA,gBAAgB,OAAA;AAAE,qGAAA,YAAY,OAAA;AAAE,kGAAA,SAAS,OAAA;AAAE,mGAAA,UAAU,OAAA;AAAE,uGAAA,cAAc,OAAA"}