@carlonicora/nestjs-neo4jsonapi 6.3.0 → 6.5.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 (195) hide show
  1. package/dist/agents/graph/services/graph.search.service.d.ts +6 -0
  2. package/dist/agents/graph/services/graph.search.service.d.ts.map +1 -1
  3. package/dist/agents/graph/services/graph.search.service.js +51 -10
  4. package/dist/agents/graph/services/graph.search.service.js.map +1 -1
  5. package/dist/bootstrap/app.module.factory.d.ts.map +1 -1
  6. package/dist/bootstrap/app.module.factory.js +1 -0
  7. package/dist/bootstrap/app.module.factory.js.map +1 -1
  8. package/dist/bootstrap/bootstrap.options.d.ts +20 -0
  9. package/dist/bootstrap/bootstrap.options.d.ts.map +1 -1
  10. package/dist/core/email/services/email.service.d.ts +2 -0
  11. package/dist/core/email/services/email.service.d.ts.map +1 -1
  12. package/dist/core/email/services/email.service.js +18 -8
  13. package/dist/core/email/services/email.service.js.map +1 -1
  14. package/dist/core/email/templates/en/emailAutomation.hbs +24 -0
  15. package/dist/foundations/auth/controllers/auth.controller.d.ts +2 -2
  16. package/dist/foundations/auth/controllers/auth.controller.d.ts.map +1 -1
  17. package/dist/foundations/auth/controllers/auth.controller.js +8 -6
  18. package/dist/foundations/auth/controllers/auth.controller.js.map +1 -1
  19. package/dist/foundations/auth/events/auth.events.d.ts +12 -0
  20. package/dist/foundations/auth/events/auth.events.d.ts.map +1 -0
  21. package/dist/foundations/auth/events/auth.events.js +6 -0
  22. package/dist/foundations/auth/events/auth.events.js.map +1 -0
  23. package/dist/foundations/auth/index.d.ts +2 -0
  24. package/dist/foundations/auth/index.d.ts.map +1 -1
  25. package/dist/foundations/auth/index.js +3 -1
  26. package/dist/foundations/auth/index.js.map +1 -1
  27. package/dist/foundations/auth/services/auth.service.d.ts +5 -3
  28. package/dist/foundations/auth/services/auth.service.d.ts.map +1 -1
  29. package/dist/foundations/auth/services/auth.service.js +13 -4
  30. package/dist/foundations/auth/services/auth.service.js.map +1 -1
  31. package/dist/foundations/community/repositories/community.repository.d.ts +6 -0
  32. package/dist/foundations/community/repositories/community.repository.d.ts.map +1 -1
  33. package/dist/foundations/community/repositories/community.repository.js +42 -9
  34. package/dist/foundations/community/repositories/community.repository.js.map +1 -1
  35. package/dist/foundations/email-automation/controllers/email-automation-step.controller.d.ts +22 -0
  36. package/dist/foundations/email-automation/controllers/email-automation-step.controller.d.ts.map +1 -0
  37. package/dist/foundations/email-automation/controllers/email-automation-step.controller.js +152 -0
  38. package/dist/foundations/email-automation/controllers/email-automation-step.controller.js.map +1 -0
  39. package/dist/foundations/email-automation/controllers/email-automation.controller.d.ts +29 -0
  40. package/dist/foundations/email-automation/controllers/email-automation.controller.d.ts.map +1 -0
  41. package/dist/foundations/email-automation/controllers/email-automation.controller.js +183 -0
  42. package/dist/foundations/email-automation/controllers/email-automation.controller.js.map +1 -0
  43. package/dist/foundations/email-automation/controllers/email-automation.public.controller.d.ts +20 -0
  44. package/dist/foundations/email-automation/controllers/email-automation.public.controller.d.ts.map +1 -0
  45. package/dist/foundations/email-automation/controllers/email-automation.public.controller.js +63 -0
  46. package/dist/foundations/email-automation/controllers/email-automation.public.controller.js.map +1 -0
  47. package/dist/foundations/email-automation/cron/email-automation-sender.cron.d.ts +9 -0
  48. package/dist/foundations/email-automation/cron/email-automation-sender.cron.d.ts.map +1 -0
  49. package/dist/foundations/email-automation/cron/email-automation-sender.cron.js +44 -0
  50. package/dist/foundations/email-automation/cron/email-automation-sender.cron.js.map +1 -0
  51. package/dist/foundations/email-automation/dtos/email-automation-step.dto.d.ts +8 -0
  52. package/dist/foundations/email-automation/dtos/email-automation-step.dto.d.ts.map +1 -0
  53. package/dist/foundations/email-automation/dtos/email-automation-step.dto.js +36 -0
  54. package/dist/foundations/email-automation/dtos/email-automation-step.dto.js.map +1 -0
  55. package/dist/foundations/email-automation/dtos/email-automation-step.patch.dto.d.ts +16 -0
  56. package/dist/foundations/email-automation/dtos/email-automation-step.patch.dto.d.ts.map +1 -0
  57. package/dist/foundations/email-automation/dtos/email-automation-step.patch.dto.js +72 -0
  58. package/dist/foundations/email-automation/dtos/email-automation-step.patch.dto.js.map +1 -0
  59. package/dist/foundations/email-automation/dtos/email-automation-step.post.dto.d.ts +21 -0
  60. package/dist/foundations/email-automation/dtos/email-automation-step.post.dto.d.ts.map +1 -0
  61. package/dist/foundations/email-automation/dtos/email-automation-step.post.dto.js +88 -0
  62. package/dist/foundations/email-automation/dtos/email-automation-step.post.dto.js.map +1 -0
  63. package/dist/foundations/email-automation/dtos/email-automation-unsubscribe.dto.d.ts +11 -0
  64. package/dist/foundations/email-automation/dtos/email-automation-unsubscribe.dto.d.ts.map +1 -0
  65. package/dist/foundations/email-automation/dtos/email-automation-unsubscribe.dto.js +47 -0
  66. package/dist/foundations/email-automation/dtos/email-automation-unsubscribe.dto.js.map +1 -0
  67. package/dist/foundations/email-automation/dtos/email-automation.dto.d.ts +8 -0
  68. package/dist/foundations/email-automation/dtos/email-automation.dto.d.ts.map +1 -0
  69. package/dist/foundations/email-automation/dtos/email-automation.dto.js +36 -0
  70. package/dist/foundations/email-automation/dtos/email-automation.dto.js.map +1 -0
  71. package/dist/foundations/email-automation/dtos/email-automation.patch.dto.d.ts +16 -0
  72. package/dist/foundations/email-automation/dtos/email-automation.patch.dto.d.ts.map +1 -0
  73. package/dist/foundations/email-automation/dtos/email-automation.patch.dto.js +72 -0
  74. package/dist/foundations/email-automation/dtos/email-automation.patch.dto.js.map +1 -0
  75. package/dist/foundations/email-automation/dtos/email-automation.post.dto.d.ts +16 -0
  76. package/dist/foundations/email-automation/dtos/email-automation.post.dto.d.ts.map +1 -0
  77. package/dist/foundations/email-automation/dtos/email-automation.post.dto.js +72 -0
  78. package/dist/foundations/email-automation/dtos/email-automation.post.dto.js.map +1 -0
  79. package/dist/foundations/email-automation/email-automation.module.d.ts +35 -0
  80. package/dist/foundations/email-automation/email-automation.module.d.ts.map +1 -0
  81. package/dist/foundations/email-automation/email-automation.module.js +122 -0
  82. package/dist/foundations/email-automation/email-automation.module.js.map +1 -0
  83. package/dist/foundations/email-automation/entities/email-automation-enrollment.d.ts +55 -0
  84. package/dist/foundations/email-automation/entities/email-automation-enrollment.d.ts.map +1 -0
  85. package/dist/foundations/email-automation/entities/email-automation-enrollment.js +74 -0
  86. package/dist/foundations/email-automation/entities/email-automation-enrollment.js.map +1 -0
  87. package/dist/foundations/email-automation/entities/email-automation-enrollment.meta.d.ts +3 -0
  88. package/dist/foundations/email-automation/entities/email-automation-enrollment.meta.d.ts.map +1 -0
  89. package/dist/foundations/email-automation/entities/email-automation-enrollment.meta.js +10 -0
  90. package/dist/foundations/email-automation/entities/email-automation-enrollment.meta.js.map +1 -0
  91. package/dist/foundations/email-automation/entities/email-automation-step.d.ts +32 -0
  92. package/dist/foundations/email-automation/entities/email-automation-step.d.ts.map +1 -0
  93. package/dist/foundations/email-automation/entities/email-automation-step.js +55 -0
  94. package/dist/foundations/email-automation/entities/email-automation-step.js.map +1 -0
  95. package/dist/foundations/email-automation/entities/email-automation-step.meta.d.ts +3 -0
  96. package/dist/foundations/email-automation/entities/email-automation-step.meta.d.ts.map +1 -0
  97. package/dist/foundations/email-automation/entities/email-automation-step.meta.js +10 -0
  98. package/dist/foundations/email-automation/entities/email-automation-step.meta.js.map +1 -0
  99. package/dist/foundations/email-automation/entities/email-automation-trigger.d.ts +11 -0
  100. package/dist/foundations/email-automation/entities/email-automation-trigger.d.ts.map +1 -0
  101. package/dist/foundations/email-automation/entities/email-automation-trigger.js +15 -0
  102. package/dist/foundations/email-automation/entities/email-automation-trigger.js.map +1 -0
  103. package/dist/foundations/email-automation/entities/email-automation-trigger.meta.d.ts +6 -0
  104. package/dist/foundations/email-automation/entities/email-automation-trigger.meta.d.ts.map +1 -0
  105. package/dist/foundations/email-automation/entities/email-automation-trigger.meta.js +13 -0
  106. package/dist/foundations/email-automation/entities/email-automation-trigger.meta.js.map +1 -0
  107. package/dist/foundations/email-automation/entities/email-automation.d.ts +26 -0
  108. package/dist/foundations/email-automation/entities/email-automation.d.ts.map +1 -0
  109. package/dist/foundations/email-automation/entities/email-automation.js +54 -0
  110. package/dist/foundations/email-automation/entities/email-automation.js.map +1 -0
  111. package/dist/foundations/email-automation/entities/email-automation.meta.d.ts +7 -0
  112. package/dist/foundations/email-automation/entities/email-automation.meta.d.ts.map +1 -0
  113. package/dist/foundations/email-automation/entities/email-automation.meta.js +14 -0
  114. package/dist/foundations/email-automation/entities/email-automation.meta.js.map +1 -0
  115. package/dist/foundations/email-automation/entities/email-opt-out.d.ts +9 -0
  116. package/dist/foundations/email-automation/entities/email-opt-out.d.ts.map +1 -0
  117. package/dist/foundations/email-automation/entities/email-opt-out.js +17 -0
  118. package/dist/foundations/email-automation/entities/email-opt-out.js.map +1 -0
  119. package/dist/foundations/email-automation/entities/email-opt-out.meta.d.ts +3 -0
  120. package/dist/foundations/email-automation/entities/email-opt-out.meta.d.ts.map +1 -0
  121. package/dist/foundations/email-automation/entities/email-opt-out.meta.js +10 -0
  122. package/dist/foundations/email-automation/entities/email-opt-out.meta.js.map +1 -0
  123. package/dist/foundations/email-automation/index.d.ts +32 -0
  124. package/dist/foundations/email-automation/index.d.ts.map +1 -0
  125. package/dist/foundations/email-automation/index.js +56 -0
  126. package/dist/foundations/email-automation/index.js.map +1 -0
  127. package/dist/foundations/email-automation/interfaces/email-automation.config.interface.d.ts +49 -0
  128. package/dist/foundations/email-automation/interfaces/email-automation.config.interface.d.ts.map +1 -0
  129. package/dist/foundations/email-automation/interfaces/email-automation.config.interface.js +14 -0
  130. package/dist/foundations/email-automation/interfaces/email-automation.config.interface.js.map +1 -0
  131. package/dist/foundations/email-automation/repositories/email-automation-enrollment.repository.d.ts +150 -0
  132. package/dist/foundations/email-automation/repositories/email-automation-enrollment.repository.d.ts.map +1 -0
  133. package/dist/foundations/email-automation/repositories/email-automation-enrollment.repository.js +379 -0
  134. package/dist/foundations/email-automation/repositories/email-automation-enrollment.repository.js.map +1 -0
  135. package/dist/foundations/email-automation/repositories/email-automation-step.repository.d.ts +64 -0
  136. package/dist/foundations/email-automation/repositories/email-automation-step.repository.d.ts.map +1 -0
  137. package/dist/foundations/email-automation/repositories/email-automation-step.repository.js +156 -0
  138. package/dist/foundations/email-automation/repositories/email-automation-step.repository.js.map +1 -0
  139. package/dist/foundations/email-automation/repositories/email-automation.repository.d.ts +36 -0
  140. package/dist/foundations/email-automation/repositories/email-automation.repository.d.ts.map +1 -0
  141. package/dist/foundations/email-automation/repositories/email-automation.repository.js +93 -0
  142. package/dist/foundations/email-automation/repositories/email-automation.repository.js.map +1 -0
  143. package/dist/foundations/email-automation/repositories/email-opt-out.repository.d.ts +25 -0
  144. package/dist/foundations/email-automation/repositories/email-opt-out.repository.d.ts.map +1 -0
  145. package/dist/foundations/email-automation/repositories/email-opt-out.repository.js +69 -0
  146. package/dist/foundations/email-automation/repositories/email-opt-out.repository.js.map +1 -0
  147. package/dist/foundations/email-automation/services/email-automation-renderer.service.d.ts +35 -0
  148. package/dist/foundations/email-automation/services/email-automation-renderer.service.d.ts.map +1 -0
  149. package/dist/foundations/email-automation/services/email-automation-renderer.service.js +109 -0
  150. package/dist/foundations/email-automation/services/email-automation-renderer.service.js.map +1 -0
  151. package/dist/foundations/email-automation/services/email-automation-sender.service.d.ts +31 -0
  152. package/dist/foundations/email-automation/services/email-automation-sender.service.d.ts.map +1 -0
  153. package/dist/foundations/email-automation/services/email-automation-sender.service.js +129 -0
  154. package/dist/foundations/email-automation/services/email-automation-sender.service.js.map +1 -0
  155. package/dist/foundations/email-automation/services/email-automation-step.service.d.ts +60 -0
  156. package/dist/foundations/email-automation/services/email-automation-step.service.d.ts.map +1 -0
  157. package/dist/foundations/email-automation/services/email-automation-step.service.js +101 -0
  158. package/dist/foundations/email-automation/services/email-automation-step.service.js.map +1 -0
  159. package/dist/foundations/email-automation/services/email-automation-trigger.service.d.ts +28 -0
  160. package/dist/foundations/email-automation/services/email-automation-trigger.service.d.ts.map +1 -0
  161. package/dist/foundations/email-automation/services/email-automation-trigger.service.js +125 -0
  162. package/dist/foundations/email-automation/services/email-automation-trigger.service.js.map +1 -0
  163. package/dist/foundations/email-automation/services/email-automation-unsubscribe.service.d.ts +53 -0
  164. package/dist/foundations/email-automation/services/email-automation-unsubscribe.service.d.ts.map +1 -0
  165. package/dist/foundations/email-automation/services/email-automation-unsubscribe.service.js +67 -0
  166. package/dist/foundations/email-automation/services/email-automation-unsubscribe.service.js.map +1 -0
  167. package/dist/foundations/email-automation/services/email-automation.service.d.ts +53 -0
  168. package/dist/foundations/email-automation/services/email-automation.service.d.ts.map +1 -0
  169. package/dist/foundations/email-automation/services/email-automation.service.js +90 -0
  170. package/dist/foundations/email-automation/services/email-automation.service.js.map +1 -0
  171. package/dist/foundations/email-automation/triggers/built-in.triggers.d.ts +10 -0
  172. package/dist/foundations/email-automation/triggers/built-in.triggers.d.ts.map +1 -0
  173. package/dist/foundations/email-automation/triggers/built-in.triggers.js +50 -0
  174. package/dist/foundations/email-automation/triggers/built-in.triggers.js.map +1 -0
  175. package/dist/foundations/foundations.modules.d.ts +3 -0
  176. package/dist/foundations/foundations.modules.d.ts.map +1 -1
  177. package/dist/foundations/foundations.modules.js +7 -1
  178. package/dist/foundations/foundations.modules.js.map +1 -1
  179. package/dist/foundations/index.d.ts +1 -0
  180. package/dist/foundations/index.d.ts.map +1 -1
  181. package/dist/foundations/index.js +1 -0
  182. package/dist/foundations/index.js.map +1 -1
  183. package/dist/foundations/waitlist/events/waitlist.events.d.ts +7 -0
  184. package/dist/foundations/waitlist/events/waitlist.events.d.ts.map +1 -0
  185. package/dist/foundations/waitlist/events/waitlist.events.js +6 -0
  186. package/dist/foundations/waitlist/events/waitlist.events.js.map +1 -0
  187. package/dist/foundations/waitlist/index.d.ts +2 -0
  188. package/dist/foundations/waitlist/index.d.ts.map +1 -1
  189. package/dist/foundations/waitlist/index.js +4 -1
  190. package/dist/foundations/waitlist/index.js.map +1 -1
  191. package/dist/foundations/waitlist/services/waitlist.service.d.ts +3 -1
  192. package/dist/foundations/waitlist/services/waitlist.service.d.ts.map +1 -1
  193. package/dist/foundations/waitlist/services/waitlist.service.js +27 -14
  194. package/dist/foundations/waitlist/services/waitlist.service.js.map +1 -1
  195. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-automation.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/email-automation/repositories/email-automation.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,kDAAkD,CAAC;AACnF,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAK1F,qBACa,yBAA0B,SAAQ,kBAAkB,CAC/D,eAAe,EACf,OAAO,yBAAyB,CAAC,aAAa,CAC/C;IACC,SAAS,CAAC,QAAQ,CAAC,UAAU;;;;;;;;;OAA6B;gBAE9C,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU;IAIzF;;;OAGG;IACH,SAAS,CAAC,oBAAoB,IAAI,MAAM;IA0BxC;;OAEG;IACG,mBAAmB,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAiBlF;;OAEG;IACG,uBAAuB,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAgB3F"}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.EmailAutomationRepository = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const nestjs_cls_1 = require("nestjs-cls");
15
+ const abstract_repository_1 = require("../../../core/neo4j/abstracts/abstract.repository");
16
+ const neo4j_service_1 = require("../../../core/neo4j/services/neo4j.service");
17
+ const security_service_1 = require("../../../core/security/services/security.service");
18
+ const email_automation_1 = require("../entities/email-automation");
19
+ const email_automation_enrollment_meta_1 = require("../entities/email-automation-enrollment.meta");
20
+ const email_automation_step_meta_1 = require("../entities/email-automation-step.meta");
21
+ const email_automation_meta_1 = require("../entities/email-automation.meta");
22
+ let EmailAutomationRepository = class EmailAutomationRepository extends abstract_repository_1.AbstractRepository {
23
+ constructor(neo4j, securityService, clsService) {
24
+ super(neo4j, securityService, clsService);
25
+ this.descriptor = email_automation_1.EmailAutomationDescriptor;
26
+ }
27
+ /**
28
+ * Adds the computed counts (stepCount, activeCount, completedCount,
29
+ * unsubscribedCount) to the default automation + steps return.
30
+ */
31
+ buildReturnStatement() {
32
+ const { nodeName } = email_automation_meta_1.emailAutomationMeta;
33
+ return `
34
+ CALL {
35
+ WITH ${nodeName}
36
+ OPTIONAL MATCH (${nodeName})-[:HAS_STEP]->(countedStep:${email_automation_step_meta_1.emailAutomationStepMeta.labelName})
37
+ RETURN count(countedStep) AS stepCount
38
+ }
39
+ CALL {
40
+ WITH ${nodeName}
41
+ OPTIONAL MATCH (${nodeName})-[:HAS_ENROLLMENT]->(countedEnrollment:${email_automation_enrollment_meta_1.emailAutomationEnrollmentMeta.labelName})
42
+ RETURN count(CASE WHEN countedEnrollment.status = "active" THEN 1 END) AS activeCount,
43
+ count(CASE WHEN countedEnrollment.status = "completed" THEN 1 END) AS completedCount,
44
+ count(CASE WHEN countedEnrollment.status = "unsubscribed" THEN 1 END) AS unsubscribedCount
45
+ }
46
+ OPTIONAL MATCH (${nodeName})-[:HAS_STEP]->(${nodeName}_steps:${email_automation_step_meta_1.emailAutomationStepMeta.labelName})
47
+ RETURN ${nodeName},
48
+ ${nodeName}_steps,
49
+ stepCount,
50
+ activeCount,
51
+ completedCount,
52
+ unsubscribedCount
53
+ `;
54
+ }
55
+ /**
56
+ * Active automations a trigger enrols people into, oldest first.
57
+ */
58
+ async findActiveByTrigger(params) {
59
+ const { nodeName } = email_automation_meta_1.emailAutomationMeta;
60
+ const query = this.neo4j.initQuery({ serialiser: email_automation_1.EmailAutomationDescriptor.model });
61
+ query.queryParams = { ...query.queryParams, trigger: params.trigger };
62
+ query.query += `
63
+ ${this.buildDefaultMatch()}
64
+ WHERE ${nodeName}.isActive = true AND ${nodeName}.trigger = $trigger
65
+ WITH ${nodeName}
66
+ ORDER BY ${nodeName}.createdAt ASC
67
+ ${this.buildReturnStatement()}
68
+ `;
69
+ return this.neo4j.readMany(query);
70
+ }
71
+ /**
72
+ * Active automations a trigger takes people out of.
73
+ */
74
+ async findActiveByExitTrigger(params) {
75
+ const { nodeName } = email_automation_meta_1.emailAutomationMeta;
76
+ const query = this.neo4j.initQuery({ serialiser: email_automation_1.EmailAutomationDescriptor.model });
77
+ query.queryParams = { ...query.queryParams, exitTrigger: params.exitTrigger };
78
+ query.query += `
79
+ ${this.buildDefaultMatch()}
80
+ WHERE ${nodeName}.isActive = true AND ${nodeName}.exitTrigger = $exitTrigger
81
+ WITH ${nodeName}
82
+ ORDER BY ${nodeName}.createdAt ASC
83
+ ${this.buildReturnStatement()}
84
+ `;
85
+ return this.neo4j.readMany(query);
86
+ }
87
+ };
88
+ exports.EmailAutomationRepository = EmailAutomationRepository;
89
+ exports.EmailAutomationRepository = EmailAutomationRepository = __decorate([
90
+ (0, common_1.Injectable)(),
91
+ __metadata("design:paramtypes", [neo4j_service_1.Neo4jService, security_service_1.SecurityService, nestjs_cls_1.ClsService])
92
+ ], EmailAutomationRepository);
93
+ //# sourceMappingURL=email-automation.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-automation.repository.js","sourceRoot":"","sources":["../../../../src/foundations/email-automation/repositories/email-automation.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,2CAAwC;AACxC,2FAAuF;AACvF,8EAA0E;AAC1E,uFAAmF;AACnF,mEAA0F;AAC1F,mGAA6F;AAC7F,uFAAiF;AACjF,6EAAwE;AAGjE,IAAM,yBAAyB,GAA/B,MAAM,yBAA0B,SAAQ,wCAG9C;IAGC,YAAY,KAAmB,EAAE,eAAgC,EAAE,UAAsB;QACvF,KAAK,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;QAHzB,eAAU,GAAG,4CAAyB,CAAC;IAI1D,CAAC;IAED;;;OAGG;IACO,oBAAoB;QAC5B,MAAM,EAAE,QAAQ,EAAE,GAAG,2CAAmB,CAAC;QAEzC,OAAO;;eAEI,QAAQ;0BACG,QAAQ,+BAA+B,oDAAuB,CAAC,SAAS;;;;eAInF,QAAQ;0BACG,QAAQ,2CAA2C,gEAA6B,CAAC,SAAS;;;;;wBAK5F,QAAQ,mBAAmB,QAAQ,UAAU,oDAAuB,CAAC,SAAS;eACvF,QAAQ;UACb,QAAQ;;;;;KAKb,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,MAA2B;QACnD,MAAM,EAAE,QAAQ,EAAE,GAAG,2CAAmB,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,4CAAyB,CAAC,KAAK,EAAE,CAAC,CAAC;QAEpF,KAAK,CAAC,WAAW,GAAG,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QAEtE,KAAK,CAAC,KAAK,IAAI;QACX,IAAI,CAAC,iBAAiB,EAAE;cAClB,QAAQ,wBAAwB,QAAQ;aACzC,QAAQ;iBACJ,QAAQ;QACjB,IAAI,CAAC,oBAAoB,EAAE;KAC9B,CAAC;QAEF,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,uBAAuB,CAAC,MAA+B;QAC3D,MAAM,EAAE,QAAQ,EAAE,GAAG,2CAAmB,CAAC;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,4CAAyB,CAAC,KAAK,EAAE,CAAC,CAAC;QAEpF,KAAK,CAAC,WAAW,GAAG,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;QAE9E,KAAK,CAAC,KAAK,IAAI;QACX,IAAI,CAAC,iBAAiB,EAAE;cAClB,QAAQ,wBAAwB,QAAQ;aACzC,QAAQ;iBACJ,QAAQ;QACjB,IAAI,CAAC,oBAAoB,EAAE;KAC9B,CAAC;QAEF,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;CACF,CAAA;AA/EY,8DAAyB;oCAAzB,yBAAyB;IADrC,IAAA,mBAAU,GAAE;qCAOQ,4BAAY,EAAmB,kCAAe,EAAc,uBAAU;GAN9E,yBAAyB,CA+ErC"}
@@ -0,0 +1,25 @@
1
+ import { ClsService } from "nestjs-cls";
2
+ import { AbstractRepository } from "../../../core/neo4j/abstracts/abstract.repository";
3
+ import { Neo4jService } from "../../../core/neo4j/services/neo4j.service";
4
+ import { SecurityService } from "../../../core/security/services/security.service";
5
+ import { EmailOptOut, EmailOptOutDescriptor } from "../entities/email-opt-out";
6
+ export declare class EmailOptOutRepository extends AbstractRepository<EmailOptOut, typeof EmailOptOutDescriptor.relationships> {
7
+ protected readonly descriptor: import("../../..").EntityDescriptor<EmailOptOut, {}>;
8
+ constructor(neo4j: Neo4jService, securityService: SecurityService, clsService: ClsService);
9
+ /**
10
+ * The opt-out of an email address (case-insensitive).
11
+ */
12
+ findByEmail(params: {
13
+ email: string;
14
+ }): Promise<EmailOptOut | null>;
15
+ /**
16
+ * Records an opt-out once per (lower-cased) email; a repeat keeps the first record.
17
+ */
18
+ createOptOut(params: {
19
+ id: string;
20
+ email: string;
21
+ optedOutAt: Date;
22
+ source: "link" | "header";
23
+ }): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=email-opt-out.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-opt-out.repository.d.ts","sourceRoot":"","sources":["../../../../src/foundations/email-automation/repositories/email-opt-out.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mDAAmD,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,kDAAkD,CAAC;AACnF,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAG/E,qBACa,qBAAsB,SAAQ,kBAAkB,CAAC,WAAW,EAAE,OAAO,qBAAqB,CAAC,aAAa,CAAC;IACpH,SAAS,CAAC,QAAQ,CAAC,UAAU,uDAAyB;gBAE1C,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,UAAU,EAAE,UAAU;IAIzF;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAgBzE;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE;QACzB,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,IAAI,CAAC;QACjB,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;KAC3B,GAAG,OAAO,CAAC,IAAI,CAAC;CAuBlB"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.EmailOptOutRepository = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const nestjs_cls_1 = require("nestjs-cls");
15
+ const abstract_repository_1 = require("../../../core/neo4j/abstracts/abstract.repository");
16
+ const neo4j_service_1 = require("../../../core/neo4j/services/neo4j.service");
17
+ const security_service_1 = require("../../../core/security/services/security.service");
18
+ const email_opt_out_1 = require("../entities/email-opt-out");
19
+ const email_opt_out_meta_1 = require("../entities/email-opt-out.meta");
20
+ let EmailOptOutRepository = class EmailOptOutRepository extends abstract_repository_1.AbstractRepository {
21
+ constructor(neo4j, securityService, clsService) {
22
+ super(neo4j, securityService, clsService);
23
+ this.descriptor = email_opt_out_1.EmailOptOutDescriptor;
24
+ }
25
+ /**
26
+ * The opt-out of an email address (case-insensitive).
27
+ */
28
+ async findByEmail(params) {
29
+ const { nodeName } = email_opt_out_meta_1.emailOptOutMeta;
30
+ const query = this.neo4j.initQuery({ serialiser: email_opt_out_1.EmailOptOutDescriptor.model });
31
+ query.queryParams = { ...query.queryParams, email: params.email.toLowerCase() };
32
+ query.query += `
33
+ ${this.buildDefaultMatch()}
34
+ WHERE toLower(${nodeName}.email) = $email
35
+ WITH ${nodeName}
36
+ ${this.buildReturnStatement()}
37
+ `;
38
+ return this.neo4j.readOne(query);
39
+ }
40
+ /**
41
+ * Records an opt-out once per (lower-cased) email; a repeat keeps the first record.
42
+ */
43
+ async createOptOut(params) {
44
+ const { nodeName, labelName } = email_opt_out_meta_1.emailOptOutMeta;
45
+ const query = this.neo4j.initQuery();
46
+ query.queryParams = {
47
+ ...query.queryParams,
48
+ id: params.id,
49
+ email: params.email,
50
+ optedOutAt: params.optedOutAt.toISOString(),
51
+ source: params.source,
52
+ };
53
+ query.query += `
54
+ MERGE (${nodeName}:${labelName} {email: toLower($email)})
55
+ ON CREATE SET ${nodeName}.id = $id,
56
+ ${nodeName}.optedOutAt = datetime($optedOutAt),
57
+ ${nodeName}.source = $source,
58
+ ${nodeName}.createdAt = datetime(),
59
+ ${nodeName}.updatedAt = datetime()
60
+ `;
61
+ await this.neo4j.writeOne(query);
62
+ }
63
+ };
64
+ exports.EmailOptOutRepository = EmailOptOutRepository;
65
+ exports.EmailOptOutRepository = EmailOptOutRepository = __decorate([
66
+ (0, common_1.Injectable)(),
67
+ __metadata("design:paramtypes", [neo4j_service_1.Neo4jService, security_service_1.SecurityService, nestjs_cls_1.ClsService])
68
+ ], EmailOptOutRepository);
69
+ //# sourceMappingURL=email-opt-out.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-opt-out.repository.js","sourceRoot":"","sources":["../../../../src/foundations/email-automation/repositories/email-opt-out.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,2CAAwC;AACxC,2FAAuF;AACvF,8EAA0E;AAC1E,uFAAmF;AACnF,6DAA+E;AAC/E,uEAAiE;AAG1D,IAAM,qBAAqB,GAA3B,MAAM,qBAAsB,SAAQ,wCAA2E;IAGpH,YAAY,KAAmB,EAAE,eAAgC,EAAE,UAAsB;QACvF,KAAK,CAAC,KAAK,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;QAHzB,eAAU,GAAG,qCAAqB,CAAC;IAItD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,MAAyB;QACzC,MAAM,EAAE,QAAQ,EAAE,GAAG,oCAAe,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,UAAU,EAAE,qCAAqB,CAAC,KAAK,EAAE,CAAC,CAAC;QAEhF,KAAK,CAAC,WAAW,GAAG,EAAE,GAAG,KAAK,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;QAEhF,KAAK,CAAC,KAAK,IAAI;QACX,IAAI,CAAC,iBAAiB,EAAE;sBACV,QAAQ;aACjB,QAAQ;QACb,IAAI,CAAC,oBAAoB,EAAE;KAC9B,CAAC;QAEF,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,MAKlB;QACC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,oCAAe,CAAC;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QAErC,KAAK,CAAC,WAAW,GAAG;YAClB,GAAG,KAAK,CAAC,WAAW;YACpB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE;YAC3C,MAAM,EAAE,MAAM,CAAC,MAAM;SACtB,CAAC;QAEF,KAAK,CAAC,KAAK,IAAI;eACJ,QAAQ,IAAI,SAAS;sBACd,QAAQ;sBACR,QAAQ;sBACR,QAAQ;sBACR,QAAQ;sBACR,QAAQ;KACzB,CAAC;QAEF,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;CACF,CAAA;AAzDY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;qCAIQ,4BAAY,EAAmB,kCAAe,EAAc,uBAAU;GAH9E,qBAAqB,CAyDjC"}
@@ -0,0 +1,35 @@
1
+ import { ConfigService } from "@nestjs/config";
2
+ import { BaseConfigInterface } from "../../../config/interfaces";
3
+ import { EmailAutomation } from "../entities/email-automation";
4
+ import { EmailAutomationEnrollment } from "../entities/email-automation-enrollment";
5
+ import { EmailAutomationStep } from "../entities/email-automation-step";
6
+ export type EmailAutomationRendered = {
7
+ subject: string;
8
+ content: string;
9
+ headers: Record<string, string>;
10
+ replyTo?: string;
11
+ unsubscribeUrl: string;
12
+ unsubscribeAllUrl: string;
13
+ };
14
+ /**
15
+ * Renders one automation step for one enrolment: the subject and the HTML body
16
+ * fragment (`content`) that the `emailAutomation` template wraps with the app's
17
+ * header, the unsubscribe links and the footer.
18
+ *
19
+ * Variables: `{{name}}`, `{{email}}`, `{{url}}`, `{{unsubscribeUrl}}`, `{{unsubscribeAllUrl}}`.
20
+ * `name` and `email` are HTML-escaped, so a recipient value can never inject markup.
21
+ * The three URLs are built here from config and a UUID token, so they are passed
22
+ * unescaped: escaping would turn `?scope=all` into `?scope&#x3D;all`, which breaks
23
+ * Markdown autolinks. Raw HTML written in the body is escaped too: the body is Markdown.
24
+ */
25
+ export declare class EmailAutomationRenderer {
26
+ private readonly configService;
27
+ constructor(configService: ConfigService<BaseConfigInterface>);
28
+ render(params: {
29
+ step: EmailAutomationStep;
30
+ enrollment: EmailAutomationEnrollment;
31
+ automation: EmailAutomation;
32
+ locale: string;
33
+ }): Promise<EmailAutomationRendered>;
34
+ }
35
+ //# sourceMappingURL=email-automation-renderer.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-automation-renderer.service.d.ts","sourceRoot":"","sources":["../../../../src/foundations/email-automation/services/email-automation-renderer.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,EAAE,mBAAmB,EAA0C,MAAM,4BAA4B,CAAC;AACzG,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAGxE,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;CAC3B,CAAC;AAUF;;;;;;;;;;GAUG;AACH,qBACa,uBAAuB;IACtB,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa,CAAC,mBAAmB,CAAC;IAExE,MAAM,CAAC,MAAM,EAAE;QACnB,IAAI,EAAE,mBAAmB,CAAC;QAC1B,UAAU,EAAE,yBAAyB,CAAC;QACtC,UAAU,EAAE,eAAe,CAAC;QAC5B,MAAM,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,uBAAuB,CAAC;CAqCrC"}
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.EmailAutomationRenderer = void 0;
46
+ const common_1 = require("@nestjs/common");
47
+ const config_1 = require("@nestjs/config");
48
+ const Handlebars = __importStar(require("handlebars"));
49
+ const email_automation_meta_1 = require("../entities/email-automation.meta");
50
+ const escapeHtml = (value) => value
51
+ .replace(/&/g, "&amp;")
52
+ .replace(/</g, "&lt;")
53
+ .replace(/>/g, "&gt;")
54
+ .replace(/"/g, "&quot;")
55
+ .replace(/'/g, "&#39;");
56
+ /**
57
+ * Renders one automation step for one enrolment: the subject and the HTML body
58
+ * fragment (`content`) that the `emailAutomation` template wraps with the app's
59
+ * header, the unsubscribe links and the footer.
60
+ *
61
+ * Variables: `{{name}}`, `{{email}}`, `{{url}}`, `{{unsubscribeUrl}}`, `{{unsubscribeAllUrl}}`.
62
+ * `name` and `email` are HTML-escaped, so a recipient value can never inject markup.
63
+ * The three URLs are built here from config and a UUID token, so they are passed
64
+ * unescaped: escaping would turn `?scope=all` into `?scope&#x3D;all`, which breaks
65
+ * Markdown autolinks. Raw HTML written in the body is escaped too: the body is Markdown.
66
+ */
67
+ let EmailAutomationRenderer = class EmailAutomationRenderer {
68
+ constructor(configService) {
69
+ this.configService = configService;
70
+ }
71
+ async render(params) {
72
+ const { step, enrollment, automation, locale } = params;
73
+ const appUrl = this.configService.get("app").url;
74
+ const apiUrl = this.configService.get("api").url;
75
+ const token = enrollment.unsubscribeToken;
76
+ const unsubscribeUrl = `${appUrl}${locale}/unsubscribe/${token}`;
77
+ const unsubscribeAllUrl = `${unsubscribeUrl}?scope=all`;
78
+ const vars = {
79
+ name: enrollment.name ?? enrollment.email.split("@")[0],
80
+ email: enrollment.email,
81
+ url: new Handlebars.SafeString(appUrl),
82
+ unsubscribeUrl: new Handlebars.SafeString(unsubscribeUrl),
83
+ unsubscribeAllUrl: new Handlebars.SafeString(unsubscribeAllUrl),
84
+ };
85
+ // The subject is a plain-text header, not HTML: escaping would show `&amp;` in the inbox.
86
+ const subject = Handlebars.compile(step.subject, { noEscape: true })(vars);
87
+ const markdown = Handlebars.compile(step.body)(vars);
88
+ const { Marked } = await import("marked");
89
+ const marked = new Marked({ renderer: { html: ({ text }) => escapeHtml(text) } });
90
+ const content = marked.parse(markdown, { async: false });
91
+ return {
92
+ subject,
93
+ content,
94
+ headers: {
95
+ "List-Unsubscribe": `<${apiUrl}${email_automation_meta_1.emailAutomationMeta.endpoint}/${email_automation_meta_1.EMAIL_AUTOMATION_UNSUBSCRIBE_SEGMENT}/${token}?scope=all>`,
96
+ "List-Unsubscribe-Post": "List-Unsubscribe=One-Click",
97
+ },
98
+ ...(automation.replyTo ? { replyTo: automation.replyTo } : {}),
99
+ unsubscribeUrl,
100
+ unsubscribeAllUrl,
101
+ };
102
+ }
103
+ };
104
+ exports.EmailAutomationRenderer = EmailAutomationRenderer;
105
+ exports.EmailAutomationRenderer = EmailAutomationRenderer = __decorate([
106
+ (0, common_1.Injectable)(),
107
+ __metadata("design:paramtypes", [config_1.ConfigService])
108
+ ], EmailAutomationRenderer);
109
+ //# sourceMappingURL=email-automation-renderer.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-automation-renderer.service.js","sourceRoot":"","sources":["../../../../src/foundations/email-automation/services/email-automation-renderer.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { EmailService } from "../../../core/email/services/email.service";
2
+ import { AppLoggingService } from "../../../core/logging/services/logging.service";
3
+ import { ResponseLanguageService } from "../../user/services/response-language.service";
4
+ import { EmailAutomationEnrollmentRepository } from "../repositories/email-automation-enrollment.repository";
5
+ import { EmailAutomationStepRepository } from "../repositories/email-automation-step.repository";
6
+ import { EmailOptOutRepository } from "../repositories/email-opt-out.repository";
7
+ import { EmailAutomationRenderer } from "./email-automation-renderer.service";
8
+ export declare class EmailAutomationSenderService {
9
+ private readonly enrollmentRepository;
10
+ private readonly stepRepository;
11
+ private readonly optOutRepository;
12
+ private readonly renderer;
13
+ private readonly emailService;
14
+ private readonly responseLanguage;
15
+ private readonly logger;
16
+ constructor(enrollmentRepository: EmailAutomationEnrollmentRepository, stepRepository: EmailAutomationStepRepository, optOutRepository: EmailOptOutRepository, renderer: EmailAutomationRenderer, emailService: EmailService, responseLanguage: ResponseLanguageService, logger: AppLoggingService);
17
+ /**
18
+ * Sends every due email of the active automations, one enrolment at a time.
19
+ * A failure on one enrolment is logged and the loop continues.
20
+ */
21
+ processDue(params: {
22
+ now: Date;
23
+ limit: number;
24
+ }): Promise<{
25
+ sent: number;
26
+ skipped: number;
27
+ failed: number;
28
+ }>;
29
+ private processOne;
30
+ }
31
+ //# sourceMappingURL=email-automation-sender.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-automation-sender.service.d.ts","sourceRoot":"","sources":["../../../../src/foundations/email-automation/services/email-automation-sender.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AACnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AAExF,OAAO,EAAE,mCAAmC,EAAE,MAAM,wDAAwD,CAAC;AAC7G,OAAO,EAAE,6BAA6B,EAAE,MAAM,kDAAkD,CAAC;AACjG,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAO9E,qBACa,4BAA4B;IAErC,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBANN,oBAAoB,EAAE,mCAAmC,EACzD,cAAc,EAAE,6BAA6B,EAC7C,gBAAgB,EAAE,qBAAqB,EACvC,QAAQ,EAAE,uBAAuB,EACjC,YAAY,EAAE,YAAY,EAC1B,gBAAgB,EAAE,uBAAuB,EACzC,MAAM,EAAE,iBAAiB;IAG5C;;;OAGG;IACG,UAAU,CAAC,MAAM,EAAE;QAAE,GAAG,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;YAoBpG,UAAU;CAoFzB"}
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.EmailAutomationSenderService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const email_service_1 = require("../../../core/email/services/email.service");
15
+ const logging_service_1 = require("../../../core/logging/services/logging.service");
16
+ const response_language_service_1 = require("../../user/services/response-language.service");
17
+ const email_automation_enrollment_repository_1 = require("../repositories/email-automation-enrollment.repository");
18
+ const email_automation_step_repository_1 = require("../repositories/email-automation-step.repository");
19
+ const email_opt_out_repository_1 = require("../repositories/email-opt-out.repository");
20
+ const email_automation_renderer_service_1 = require("./email-automation-renderer.service");
21
+ const HOUR_MS = 60 * 60 * 1000;
22
+ const MAX_ATTEMPTS = 3;
23
+ let EmailAutomationSenderService = class EmailAutomationSenderService {
24
+ constructor(enrollmentRepository, stepRepository, optOutRepository, renderer, emailService, responseLanguage, logger) {
25
+ this.enrollmentRepository = enrollmentRepository;
26
+ this.stepRepository = stepRepository;
27
+ this.optOutRepository = optOutRepository;
28
+ this.renderer = renderer;
29
+ this.emailService = emailService;
30
+ this.responseLanguage = responseLanguage;
31
+ this.logger = logger;
32
+ }
33
+ /**
34
+ * Sends every due email of the active automations, one enrolment at a time.
35
+ * A failure on one enrolment is logged and the loop continues.
36
+ */
37
+ async processDue(params) {
38
+ const counts = { sent: 0, skipped: 0, failed: 0 };
39
+ const dueEnrollments = await this.enrollmentRepository.findDue({ now: params.now, limit: params.limit });
40
+ for (const enrollment of dueEnrollments) {
41
+ try {
42
+ const outcome = await this.processOne({ enrollment, now: params.now });
43
+ counts[outcome]++;
44
+ }
45
+ catch (error) {
46
+ counts.failed++;
47
+ this.logger.error(`Failed to process email automation enrollment ${enrollment.id}: ${error.message}`, "EmailAutomationSenderService");
48
+ }
49
+ }
50
+ return counts;
51
+ }
52
+ async processOne(params) {
53
+ const { enrollment, now } = params;
54
+ const optOut = await this.optOutRepository.findByEmail({ email: enrollment.email });
55
+ if (optOut) {
56
+ await this.enrollmentRepository.finish({ enrollmentId: enrollment.id, status: "unsubscribed", finishedAt: now });
57
+ return "skipped";
58
+ }
59
+ if (!enrollment.currentStep?.id || !enrollment.automation) {
60
+ this.logger.warn(`Email automation enrollment ${enrollment.id} has no current step or automation`, "EmailAutomationSenderService");
61
+ return "skipped";
62
+ }
63
+ // Loaded in full: the step's body and its `next` step (with its delay) are needed below.
64
+ const step = await this.stepRepository.findById({ id: enrollment.currentStep.id });
65
+ if (!step) {
66
+ this.logger.warn(`Email automation step ${enrollment.currentStep.id} of enrollment ${enrollment.id} not found`, "EmailAutomationSenderService");
67
+ return "skipped";
68
+ }
69
+ // A previous run died between the send and the bookkeeping: never send the same step twice.
70
+ const alreadySent = await this.enrollmentRepository.hasSent({ enrollmentId: enrollment.id, stepId: step.id });
71
+ if (!alreadySent) {
72
+ try {
73
+ const locale = (await this.responseLanguage.resolveForEmail({ email: enrollment.email })) ?? "en";
74
+ const rendered = await this.renderer.render({
75
+ step,
76
+ enrollment,
77
+ automation: enrollment.automation,
78
+ locale,
79
+ });
80
+ await this.emailService.sendEmail("emailAutomation", {
81
+ to: enrollment.email,
82
+ subject: rendered.subject,
83
+ content: rendered.content,
84
+ replyTo: rendered.replyTo,
85
+ headers: rendered.headers,
86
+ unsubscribeUrl: rendered.unsubscribeUrl,
87
+ unsubscribeAllUrl: rendered.unsubscribeAllUrl,
88
+ }, locale);
89
+ }
90
+ catch (error) {
91
+ const message = error.message;
92
+ this.logger.error(`Failed to send email automation step ${step.id} to enrollment ${enrollment.id}: ${message}`, "EmailAutomationSenderService");
93
+ await this.enrollmentRepository.recordFailure({
94
+ enrollmentId: enrollment.id,
95
+ error: message,
96
+ nextSendAt: new Date(now.getTime() + HOUR_MS),
97
+ });
98
+ if ((enrollment.attempts ?? 0) + 1 >= MAX_ATTEMPTS) {
99
+ await this.enrollmentRepository.finish({ enrollmentId: enrollment.id, status: "failed", finishedAt: now });
100
+ }
101
+ return "failed";
102
+ }
103
+ await this.enrollmentRepository.markSent({ enrollmentId: enrollment.id, stepId: step.id, sentAt: now });
104
+ }
105
+ if (step.next?.id) {
106
+ await this.enrollmentRepository.advance({
107
+ enrollmentId: enrollment.id,
108
+ nextStepId: step.next.id,
109
+ nextSendAt: new Date(now.getTime() + (step.next.delayHours ?? 0) * HOUR_MS),
110
+ });
111
+ }
112
+ else {
113
+ await this.enrollmentRepository.finish({ enrollmentId: enrollment.id, status: "completed", finishedAt: now });
114
+ }
115
+ return alreadySent ? "skipped" : "sent";
116
+ }
117
+ };
118
+ exports.EmailAutomationSenderService = EmailAutomationSenderService;
119
+ exports.EmailAutomationSenderService = EmailAutomationSenderService = __decorate([
120
+ (0, common_1.Injectable)(),
121
+ __metadata("design:paramtypes", [email_automation_enrollment_repository_1.EmailAutomationEnrollmentRepository,
122
+ email_automation_step_repository_1.EmailAutomationStepRepository,
123
+ email_opt_out_repository_1.EmailOptOutRepository,
124
+ email_automation_renderer_service_1.EmailAutomationRenderer,
125
+ email_service_1.EmailService,
126
+ response_language_service_1.ResponseLanguageService,
127
+ logging_service_1.AppLoggingService])
128
+ ], EmailAutomationSenderService);
129
+ //# sourceMappingURL=email-automation-sender.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-automation-sender.service.js","sourceRoot":"","sources":["../../../../src/foundations/email-automation/services/email-automation-sender.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ import { ClsService } from "nestjs-cls";
2
+ import { JsonApiListDocument, JsonApiSingleDocument } from "../../../core/jsonapi/interfaces/jsonapi.document.interface";
3
+ import { JsonApiService } from "../../../core/jsonapi/services/jsonapi.service";
4
+ import { AbstractService } from "../../../core/neo4j/abstracts/abstract.service";
5
+ import { EmailAutomationStep, EmailAutomationStepDescriptor } from "../entities/email-automation-step";
6
+ import { EmailAutomationEnrollmentRepository } from "../repositories/email-automation-enrollment.repository";
7
+ import { EmailAutomationStepRepository } from "../repositories/email-automation-step.repository";
8
+ export declare class EmailAutomationStepService extends AbstractService<EmailAutomationStep, typeof EmailAutomationStepDescriptor.relationships> {
9
+ private readonly stepRepository;
10
+ private readonly enrollmentRepository;
11
+ protected readonly descriptor: import("../../..").EntityDescriptor<EmailAutomationStep, {
12
+ automation: {
13
+ model: import("../../..").DataMeta;
14
+ direction: "in";
15
+ relationship: string;
16
+ cardinality: "one";
17
+ required: true;
18
+ dtoKey: string;
19
+ };
20
+ next: {
21
+ model: import("../../..").DataMeta;
22
+ direction: "out";
23
+ relationship: string;
24
+ cardinality: "one";
25
+ required: false;
26
+ dtoKey: string;
27
+ };
28
+ }>;
29
+ constructor(jsonApiService: JsonApiService, stepRepository: EmailAutomationStepRepository, clsService: ClsService, enrollmentRepository: EmailAutomationEnrollmentRepository);
30
+ findByAutomation(params: {
31
+ automationId: string;
32
+ query: any;
33
+ }): Promise<JsonApiListDocument>;
34
+ /**
35
+ * Points a step at its successor, or clears it when `nextStepId` is null.
36
+ * The chain stays linear: both steps in one automation, no self link, no
37
+ * second incoming link on the successor, no loop.
38
+ */
39
+ setNext(params: {
40
+ stepId: string;
41
+ nextStepId: string | null;
42
+ }): Promise<JsonApiSingleDocument>;
43
+ /**
44
+ * The id of the automation a step belongs to, so callers can refresh the
45
+ * automation's cached entry after a change to its chain.
46
+ */
47
+ findAutomationId(params: {
48
+ stepId: string;
49
+ }): Promise<string | undefined>;
50
+ /**
51
+ * Removes a step and closes the gap: the previous step points at the
52
+ * successor, and people waiting on the step move to the successor (or
53
+ * complete when the step was the last one). Returns the id of the parent
54
+ * automation.
55
+ */
56
+ deleteStep(params: {
57
+ id: string;
58
+ }): Promise<string | undefined>;
59
+ }
60
+ //# sourceMappingURL=email-automation-step.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-automation-step.service.d.ts","sourceRoot":"","sources":["../../../../src/foundations/email-automation/services/email-automation-step.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,6DAA6D,CAAC;AAErE,OAAO,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AACvG,OAAO,EAAE,mCAAmC,EAAE,MAAM,wDAAwD,CAAC;AAC7G,OAAO,EAAE,6BAA6B,EAAE,MAAM,kDAAkD,CAAC;AAEjG,qBACa,0BAA2B,SAAQ,eAAe,CAC7D,mBAAmB,EACnB,OAAO,6BAA6B,CAAC,aAAa,CACnD;IAKG,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IANvC,SAAS,CAAC,QAAQ,CAAC,UAAU;;;;;;;;;;;;;;;;;OAAiC;gBAG5D,cAAc,EAAE,cAAc,EACb,cAAc,EAAE,6BAA6B,EAC9D,UAAU,EAAE,UAAU,EACL,oBAAoB,EAAE,mCAAmC;IAKtE,gBAAgB,CAAC,MAAM,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAQlG;;;;OAIG;IACG,OAAO,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAgCpG;;;OAGG;IACG,gBAAgB,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAK/E;;;;;OAKG;IACG,UAAU,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CAiBtE"}