@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.
- package/dist/agents/graph/services/graph.search.service.d.ts +6 -0
- package/dist/agents/graph/services/graph.search.service.d.ts.map +1 -1
- package/dist/agents/graph/services/graph.search.service.js +51 -10
- package/dist/agents/graph/services/graph.search.service.js.map +1 -1
- package/dist/bootstrap/app.module.factory.d.ts.map +1 -1
- package/dist/bootstrap/app.module.factory.js +1 -0
- package/dist/bootstrap/app.module.factory.js.map +1 -1
- package/dist/bootstrap/bootstrap.options.d.ts +20 -0
- package/dist/bootstrap/bootstrap.options.d.ts.map +1 -1
- package/dist/core/email/services/email.service.d.ts +2 -0
- package/dist/core/email/services/email.service.d.ts.map +1 -1
- package/dist/core/email/services/email.service.js +18 -8
- package/dist/core/email/services/email.service.js.map +1 -1
- package/dist/core/email/templates/en/emailAutomation.hbs +24 -0
- package/dist/foundations/auth/controllers/auth.controller.d.ts +2 -2
- package/dist/foundations/auth/controllers/auth.controller.d.ts.map +1 -1
- package/dist/foundations/auth/controllers/auth.controller.js +8 -6
- package/dist/foundations/auth/controllers/auth.controller.js.map +1 -1
- package/dist/foundations/auth/events/auth.events.d.ts +12 -0
- package/dist/foundations/auth/events/auth.events.d.ts.map +1 -0
- package/dist/foundations/auth/events/auth.events.js +6 -0
- package/dist/foundations/auth/events/auth.events.js.map +1 -0
- package/dist/foundations/auth/index.d.ts +2 -0
- package/dist/foundations/auth/index.d.ts.map +1 -1
- package/dist/foundations/auth/index.js +3 -1
- package/dist/foundations/auth/index.js.map +1 -1
- package/dist/foundations/auth/services/auth.service.d.ts +5 -3
- package/dist/foundations/auth/services/auth.service.d.ts.map +1 -1
- package/dist/foundations/auth/services/auth.service.js +13 -4
- package/dist/foundations/auth/services/auth.service.js.map +1 -1
- package/dist/foundations/community/repositories/community.repository.d.ts +6 -0
- package/dist/foundations/community/repositories/community.repository.d.ts.map +1 -1
- package/dist/foundations/community/repositories/community.repository.js +42 -9
- package/dist/foundations/community/repositories/community.repository.js.map +1 -1
- package/dist/foundations/email-automation/controllers/email-automation-step.controller.d.ts +22 -0
- package/dist/foundations/email-automation/controllers/email-automation-step.controller.d.ts.map +1 -0
- package/dist/foundations/email-automation/controllers/email-automation-step.controller.js +152 -0
- package/dist/foundations/email-automation/controllers/email-automation-step.controller.js.map +1 -0
- package/dist/foundations/email-automation/controllers/email-automation.controller.d.ts +29 -0
- package/dist/foundations/email-automation/controllers/email-automation.controller.d.ts.map +1 -0
- package/dist/foundations/email-automation/controllers/email-automation.controller.js +183 -0
- package/dist/foundations/email-automation/controllers/email-automation.controller.js.map +1 -0
- package/dist/foundations/email-automation/controllers/email-automation.public.controller.d.ts +20 -0
- package/dist/foundations/email-automation/controllers/email-automation.public.controller.d.ts.map +1 -0
- package/dist/foundations/email-automation/controllers/email-automation.public.controller.js +63 -0
- package/dist/foundations/email-automation/controllers/email-automation.public.controller.js.map +1 -0
- package/dist/foundations/email-automation/cron/email-automation-sender.cron.d.ts +9 -0
- package/dist/foundations/email-automation/cron/email-automation-sender.cron.d.ts.map +1 -0
- package/dist/foundations/email-automation/cron/email-automation-sender.cron.js +44 -0
- package/dist/foundations/email-automation/cron/email-automation-sender.cron.js.map +1 -0
- package/dist/foundations/email-automation/dtos/email-automation-step.dto.d.ts +8 -0
- package/dist/foundations/email-automation/dtos/email-automation-step.dto.d.ts.map +1 -0
- package/dist/foundations/email-automation/dtos/email-automation-step.dto.js +36 -0
- package/dist/foundations/email-automation/dtos/email-automation-step.dto.js.map +1 -0
- package/dist/foundations/email-automation/dtos/email-automation-step.patch.dto.d.ts +16 -0
- package/dist/foundations/email-automation/dtos/email-automation-step.patch.dto.d.ts.map +1 -0
- package/dist/foundations/email-automation/dtos/email-automation-step.patch.dto.js +72 -0
- package/dist/foundations/email-automation/dtos/email-automation-step.patch.dto.js.map +1 -0
- package/dist/foundations/email-automation/dtos/email-automation-step.post.dto.d.ts +21 -0
- package/dist/foundations/email-automation/dtos/email-automation-step.post.dto.d.ts.map +1 -0
- package/dist/foundations/email-automation/dtos/email-automation-step.post.dto.js +88 -0
- package/dist/foundations/email-automation/dtos/email-automation-step.post.dto.js.map +1 -0
- package/dist/foundations/email-automation/dtos/email-automation-unsubscribe.dto.d.ts +11 -0
- package/dist/foundations/email-automation/dtos/email-automation-unsubscribe.dto.d.ts.map +1 -0
- package/dist/foundations/email-automation/dtos/email-automation-unsubscribe.dto.js +47 -0
- package/dist/foundations/email-automation/dtos/email-automation-unsubscribe.dto.js.map +1 -0
- package/dist/foundations/email-automation/dtos/email-automation.dto.d.ts +8 -0
- package/dist/foundations/email-automation/dtos/email-automation.dto.d.ts.map +1 -0
- package/dist/foundations/email-automation/dtos/email-automation.dto.js +36 -0
- package/dist/foundations/email-automation/dtos/email-automation.dto.js.map +1 -0
- package/dist/foundations/email-automation/dtos/email-automation.patch.dto.d.ts +16 -0
- package/dist/foundations/email-automation/dtos/email-automation.patch.dto.d.ts.map +1 -0
- package/dist/foundations/email-automation/dtos/email-automation.patch.dto.js +72 -0
- package/dist/foundations/email-automation/dtos/email-automation.patch.dto.js.map +1 -0
- package/dist/foundations/email-automation/dtos/email-automation.post.dto.d.ts +16 -0
- package/dist/foundations/email-automation/dtos/email-automation.post.dto.d.ts.map +1 -0
- package/dist/foundations/email-automation/dtos/email-automation.post.dto.js +72 -0
- package/dist/foundations/email-automation/dtos/email-automation.post.dto.js.map +1 -0
- package/dist/foundations/email-automation/email-automation.module.d.ts +35 -0
- package/dist/foundations/email-automation/email-automation.module.d.ts.map +1 -0
- package/dist/foundations/email-automation/email-automation.module.js +122 -0
- package/dist/foundations/email-automation/email-automation.module.js.map +1 -0
- package/dist/foundations/email-automation/entities/email-automation-enrollment.d.ts +55 -0
- package/dist/foundations/email-automation/entities/email-automation-enrollment.d.ts.map +1 -0
- package/dist/foundations/email-automation/entities/email-automation-enrollment.js +74 -0
- package/dist/foundations/email-automation/entities/email-automation-enrollment.js.map +1 -0
- package/dist/foundations/email-automation/entities/email-automation-enrollment.meta.d.ts +3 -0
- package/dist/foundations/email-automation/entities/email-automation-enrollment.meta.d.ts.map +1 -0
- package/dist/foundations/email-automation/entities/email-automation-enrollment.meta.js +10 -0
- package/dist/foundations/email-automation/entities/email-automation-enrollment.meta.js.map +1 -0
- package/dist/foundations/email-automation/entities/email-automation-step.d.ts +32 -0
- package/dist/foundations/email-automation/entities/email-automation-step.d.ts.map +1 -0
- package/dist/foundations/email-automation/entities/email-automation-step.js +55 -0
- package/dist/foundations/email-automation/entities/email-automation-step.js.map +1 -0
- package/dist/foundations/email-automation/entities/email-automation-step.meta.d.ts +3 -0
- package/dist/foundations/email-automation/entities/email-automation-step.meta.d.ts.map +1 -0
- package/dist/foundations/email-automation/entities/email-automation-step.meta.js +10 -0
- package/dist/foundations/email-automation/entities/email-automation-step.meta.js.map +1 -0
- package/dist/foundations/email-automation/entities/email-automation-trigger.d.ts +11 -0
- package/dist/foundations/email-automation/entities/email-automation-trigger.d.ts.map +1 -0
- package/dist/foundations/email-automation/entities/email-automation-trigger.js +15 -0
- package/dist/foundations/email-automation/entities/email-automation-trigger.js.map +1 -0
- package/dist/foundations/email-automation/entities/email-automation-trigger.meta.d.ts +6 -0
- package/dist/foundations/email-automation/entities/email-automation-trigger.meta.d.ts.map +1 -0
- package/dist/foundations/email-automation/entities/email-automation-trigger.meta.js +13 -0
- package/dist/foundations/email-automation/entities/email-automation-trigger.meta.js.map +1 -0
- package/dist/foundations/email-automation/entities/email-automation.d.ts +26 -0
- package/dist/foundations/email-automation/entities/email-automation.d.ts.map +1 -0
- package/dist/foundations/email-automation/entities/email-automation.js +54 -0
- package/dist/foundations/email-automation/entities/email-automation.js.map +1 -0
- package/dist/foundations/email-automation/entities/email-automation.meta.d.ts +7 -0
- package/dist/foundations/email-automation/entities/email-automation.meta.d.ts.map +1 -0
- package/dist/foundations/email-automation/entities/email-automation.meta.js +14 -0
- package/dist/foundations/email-automation/entities/email-automation.meta.js.map +1 -0
- package/dist/foundations/email-automation/entities/email-opt-out.d.ts +9 -0
- package/dist/foundations/email-automation/entities/email-opt-out.d.ts.map +1 -0
- package/dist/foundations/email-automation/entities/email-opt-out.js +17 -0
- package/dist/foundations/email-automation/entities/email-opt-out.js.map +1 -0
- package/dist/foundations/email-automation/entities/email-opt-out.meta.d.ts +3 -0
- package/dist/foundations/email-automation/entities/email-opt-out.meta.d.ts.map +1 -0
- package/dist/foundations/email-automation/entities/email-opt-out.meta.js +10 -0
- package/dist/foundations/email-automation/entities/email-opt-out.meta.js.map +1 -0
- package/dist/foundations/email-automation/index.d.ts +32 -0
- package/dist/foundations/email-automation/index.d.ts.map +1 -0
- package/dist/foundations/email-automation/index.js +56 -0
- package/dist/foundations/email-automation/index.js.map +1 -0
- package/dist/foundations/email-automation/interfaces/email-automation.config.interface.d.ts +49 -0
- package/dist/foundations/email-automation/interfaces/email-automation.config.interface.d.ts.map +1 -0
- package/dist/foundations/email-automation/interfaces/email-automation.config.interface.js +14 -0
- package/dist/foundations/email-automation/interfaces/email-automation.config.interface.js.map +1 -0
- package/dist/foundations/email-automation/repositories/email-automation-enrollment.repository.d.ts +150 -0
- package/dist/foundations/email-automation/repositories/email-automation-enrollment.repository.d.ts.map +1 -0
- package/dist/foundations/email-automation/repositories/email-automation-enrollment.repository.js +379 -0
- package/dist/foundations/email-automation/repositories/email-automation-enrollment.repository.js.map +1 -0
- package/dist/foundations/email-automation/repositories/email-automation-step.repository.d.ts +64 -0
- package/dist/foundations/email-automation/repositories/email-automation-step.repository.d.ts.map +1 -0
- package/dist/foundations/email-automation/repositories/email-automation-step.repository.js +156 -0
- package/dist/foundations/email-automation/repositories/email-automation-step.repository.js.map +1 -0
- package/dist/foundations/email-automation/repositories/email-automation.repository.d.ts +36 -0
- package/dist/foundations/email-automation/repositories/email-automation.repository.d.ts.map +1 -0
- package/dist/foundations/email-automation/repositories/email-automation.repository.js +93 -0
- package/dist/foundations/email-automation/repositories/email-automation.repository.js.map +1 -0
- package/dist/foundations/email-automation/repositories/email-opt-out.repository.d.ts +25 -0
- package/dist/foundations/email-automation/repositories/email-opt-out.repository.d.ts.map +1 -0
- package/dist/foundations/email-automation/repositories/email-opt-out.repository.js +69 -0
- package/dist/foundations/email-automation/repositories/email-opt-out.repository.js.map +1 -0
- package/dist/foundations/email-automation/services/email-automation-renderer.service.d.ts +35 -0
- package/dist/foundations/email-automation/services/email-automation-renderer.service.d.ts.map +1 -0
- package/dist/foundations/email-automation/services/email-automation-renderer.service.js +109 -0
- package/dist/foundations/email-automation/services/email-automation-renderer.service.js.map +1 -0
- package/dist/foundations/email-automation/services/email-automation-sender.service.d.ts +31 -0
- package/dist/foundations/email-automation/services/email-automation-sender.service.d.ts.map +1 -0
- package/dist/foundations/email-automation/services/email-automation-sender.service.js +129 -0
- package/dist/foundations/email-automation/services/email-automation-sender.service.js.map +1 -0
- package/dist/foundations/email-automation/services/email-automation-step.service.d.ts +60 -0
- package/dist/foundations/email-automation/services/email-automation-step.service.d.ts.map +1 -0
- package/dist/foundations/email-automation/services/email-automation-step.service.js +101 -0
- package/dist/foundations/email-automation/services/email-automation-step.service.js.map +1 -0
- package/dist/foundations/email-automation/services/email-automation-trigger.service.d.ts +28 -0
- package/dist/foundations/email-automation/services/email-automation-trigger.service.d.ts.map +1 -0
- package/dist/foundations/email-automation/services/email-automation-trigger.service.js +125 -0
- package/dist/foundations/email-automation/services/email-automation-trigger.service.js.map +1 -0
- package/dist/foundations/email-automation/services/email-automation-unsubscribe.service.d.ts +53 -0
- package/dist/foundations/email-automation/services/email-automation-unsubscribe.service.d.ts.map +1 -0
- package/dist/foundations/email-automation/services/email-automation-unsubscribe.service.js +67 -0
- package/dist/foundations/email-automation/services/email-automation-unsubscribe.service.js.map +1 -0
- package/dist/foundations/email-automation/services/email-automation.service.d.ts +53 -0
- package/dist/foundations/email-automation/services/email-automation.service.d.ts.map +1 -0
- package/dist/foundations/email-automation/services/email-automation.service.js +90 -0
- package/dist/foundations/email-automation/services/email-automation.service.js.map +1 -0
- package/dist/foundations/email-automation/triggers/built-in.triggers.d.ts +10 -0
- package/dist/foundations/email-automation/triggers/built-in.triggers.d.ts.map +1 -0
- package/dist/foundations/email-automation/triggers/built-in.triggers.js +50 -0
- package/dist/foundations/email-automation/triggers/built-in.triggers.js.map +1 -0
- package/dist/foundations/foundations.modules.d.ts +3 -0
- package/dist/foundations/foundations.modules.d.ts.map +1 -1
- package/dist/foundations/foundations.modules.js +7 -1
- package/dist/foundations/foundations.modules.js.map +1 -1
- package/dist/foundations/index.d.ts +1 -0
- package/dist/foundations/index.d.ts.map +1 -1
- package/dist/foundations/index.js +1 -0
- package/dist/foundations/index.js.map +1 -1
- package/dist/foundations/waitlist/events/waitlist.events.d.ts +7 -0
- package/dist/foundations/waitlist/events/waitlist.events.d.ts.map +1 -0
- package/dist/foundations/waitlist/events/waitlist.events.js +6 -0
- package/dist/foundations/waitlist/events/waitlist.events.js.map +1 -0
- package/dist/foundations/waitlist/index.d.ts +2 -0
- package/dist/foundations/waitlist/index.d.ts.map +1 -1
- package/dist/foundations/waitlist/index.js +4 -1
- package/dist/foundations/waitlist/index.js.map +1 -1
- package/dist/foundations/waitlist/services/waitlist.service.d.ts +3 -1
- package/dist/foundations/waitlist/services/waitlist.service.d.ts.map +1 -1
- package/dist/foundations/waitlist/services/waitlist.service.js +27 -14
- package/dist/foundations/waitlist/services/waitlist.service.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,101 @@
|
|
|
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.EmailAutomationStepService = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const nestjs_cls_1 = require("nestjs-cls");
|
|
15
|
+
const jsonapi_paginator_1 = require("../../../core/jsonapi/serialisers/jsonapi.paginator");
|
|
16
|
+
const jsonapi_service_1 = require("../../../core/jsonapi/services/jsonapi.service");
|
|
17
|
+
const abstract_service_1 = require("../../../core/neo4j/abstracts/abstract.service");
|
|
18
|
+
const email_automation_step_1 = require("../entities/email-automation-step");
|
|
19
|
+
const email_automation_enrollment_repository_1 = require("../repositories/email-automation-enrollment.repository");
|
|
20
|
+
const email_automation_step_repository_1 = require("../repositories/email-automation-step.repository");
|
|
21
|
+
let EmailAutomationStepService = class EmailAutomationStepService extends abstract_service_1.AbstractService {
|
|
22
|
+
constructor(jsonApiService, stepRepository, clsService, enrollmentRepository) {
|
|
23
|
+
super(jsonApiService, stepRepository, clsService, email_automation_step_1.EmailAutomationStepDescriptor.model);
|
|
24
|
+
this.stepRepository = stepRepository;
|
|
25
|
+
this.enrollmentRepository = enrollmentRepository;
|
|
26
|
+
this.descriptor = email_automation_step_1.EmailAutomationStepDescriptor;
|
|
27
|
+
}
|
|
28
|
+
async findByAutomation(params) {
|
|
29
|
+
const paginator = new jsonapi_paginator_1.JsonApiPaginator(params.query);
|
|
30
|
+
const data = await this.stepRepository.findByAutomation({ automationId: params.automationId });
|
|
31
|
+
return this.jsonApiService.buildList(email_automation_step_1.EmailAutomationStepDescriptor.model, data, paginator);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Points a step at its successor, or clears it when `nextStepId` is null.
|
|
35
|
+
* The chain stays linear: both steps in one automation, no self link, no
|
|
36
|
+
* second incoming link on the successor, no loop.
|
|
37
|
+
*/
|
|
38
|
+
async setNext(params) {
|
|
39
|
+
if (params.nextStepId !== null) {
|
|
40
|
+
if (params.nextStepId === params.stepId)
|
|
41
|
+
throw new common_1.BadRequestException("A step cannot follow itself");
|
|
42
|
+
const step = await this.stepRepository.findById({ id: params.stepId });
|
|
43
|
+
const next = await this.stepRepository.findById({ id: params.nextStepId });
|
|
44
|
+
const automationId = step.automation?.id;
|
|
45
|
+
if (!automationId || automationId !== next.automation?.id)
|
|
46
|
+
throw new common_1.BadRequestException("Both steps must belong to the same automation");
|
|
47
|
+
const steps = await this.stepRepository.findByAutomation({ automationId });
|
|
48
|
+
const chain = steps.map((chainStep) => ({ stepId: chainStep.id, nextId: chainStep.next?.id ?? null }));
|
|
49
|
+
if (chain.some((link) => link.nextId === params.nextStepId && link.stepId !== params.stepId))
|
|
50
|
+
throw new common_1.BadRequestException("The next step already follows another step");
|
|
51
|
+
const nextById = new Map(chain.map((link) => [link.stepId, link.nextId]));
|
|
52
|
+
const visited = new Set();
|
|
53
|
+
let cursor = params.nextStepId;
|
|
54
|
+
while (cursor !== null && !visited.has(cursor)) {
|
|
55
|
+
if (cursor === params.stepId)
|
|
56
|
+
throw new common_1.BadRequestException("The chain cannot loop");
|
|
57
|
+
visited.add(cursor);
|
|
58
|
+
cursor = nextById.get(cursor) ?? null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
await this.stepRepository.setNext({ stepId: params.stepId, nextStepId: params.nextStepId });
|
|
62
|
+
return this.findById({ id: params.stepId });
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* The id of the automation a step belongs to, so callers can refresh the
|
|
66
|
+
* automation's cached entry after a change to its chain.
|
|
67
|
+
*/
|
|
68
|
+
async findAutomationId(params) {
|
|
69
|
+
const step = await this.stepRepository.findById({ id: params.stepId });
|
|
70
|
+
return step.automation?.id;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Removes a step and closes the gap: the previous step points at the
|
|
74
|
+
* successor, and people waiting on the step move to the successor (or
|
|
75
|
+
* complete when the step was the last one). Returns the id of the parent
|
|
76
|
+
* automation.
|
|
77
|
+
*/
|
|
78
|
+
async deleteStep(params) {
|
|
79
|
+
const step = await this.stepRepository.findById({ id: params.id });
|
|
80
|
+
const previous = await this.stepRepository.findPrevious({ stepId: params.id });
|
|
81
|
+
const nextStepId = step.next?.id ?? null;
|
|
82
|
+
if (previous)
|
|
83
|
+
await this.stepRepository.setNext({ stepId: previous.id, nextStepId });
|
|
84
|
+
await this.enrollmentRepository.repointStep({
|
|
85
|
+
fromStepId: params.id,
|
|
86
|
+
toStepId: nextStepId,
|
|
87
|
+
finishedAt: new Date(),
|
|
88
|
+
});
|
|
89
|
+
await this.delete({ id: params.id });
|
|
90
|
+
return step.automation?.id;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
exports.EmailAutomationStepService = EmailAutomationStepService;
|
|
94
|
+
exports.EmailAutomationStepService = EmailAutomationStepService = __decorate([
|
|
95
|
+
(0, common_1.Injectable)(),
|
|
96
|
+
__metadata("design:paramtypes", [jsonapi_service_1.JsonApiService,
|
|
97
|
+
email_automation_step_repository_1.EmailAutomationStepRepository,
|
|
98
|
+
nestjs_cls_1.ClsService,
|
|
99
|
+
email_automation_enrollment_repository_1.EmailAutomationEnrollmentRepository])
|
|
100
|
+
], EmailAutomationStepService);
|
|
101
|
+
//# sourceMappingURL=email-automation-step.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-automation-step.service.js","sourceRoot":"","sources":["../../../../src/foundations/email-automation/services/email-automation-step.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAAiE;AACjE,2CAAwC;AAKxC,2FAAuF;AACvF,oFAAgF;AAChF,qFAAiF;AACjF,6EAAuG;AACvG,mHAA6G;AAC7G,uGAAiG;AAG1F,IAAM,0BAA0B,GAAhC,MAAM,0BAA2B,SAAQ,kCAG/C;IAGC,YACE,cAA8B,EACb,cAA6C,EAC9D,UAAsB,EACL,oBAAyD;QAE1E,KAAK,CAAC,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,qDAA6B,CAAC,KAAK,CAAC,CAAC;QAJtE,mBAAc,GAAd,cAAc,CAA+B;QAE7C,yBAAoB,GAApB,oBAAoB,CAAqC;QANzD,eAAU,GAAG,qDAA6B,CAAC;IAS9D,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,MAA4C;QACjE,MAAM,SAAS,GAAG,IAAI,oCAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAErD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAE/F,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,qDAA6B,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IAC7F,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,MAAqD;QACjE,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAC/B,IAAI,MAAM,CAAC,UAAU,KAAK,MAAM,CAAC,MAAM;gBAAE,MAAM,IAAI,4BAAmB,CAAC,6BAA6B,CAAC,CAAC;YAEtG,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;YACvE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;YAE3E,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,YAAY,IAAI,YAAY,KAAK,IAAI,CAAC,UAAU,EAAE,EAAE;gBACvD,MAAM,IAAI,4BAAmB,CAAC,+CAA+C,CAAC,CAAC;YAEjF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;YAC3E,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;YAEvG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC;gBAC1F,MAAM,IAAI,4BAAmB,CAAC,4CAA4C,CAAC,CAAC;YAE9E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC1E,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;YAClC,IAAI,MAAM,GAAkB,MAAM,CAAC,UAAU,CAAC;YAC9C,OAAO,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC/C,IAAI,MAAM,KAAK,MAAM,CAAC,MAAM;oBAAE,MAAM,IAAI,4BAAmB,CAAC,uBAAuB,CAAC,CAAC;gBACrF,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACpB,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;YACxC,CAAC;QACH,CAAC;QAED,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QAE5F,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,gBAAgB,CAAC,MAA0B;QAC/C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,UAAU,CAAC,MAAsB;QACrC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/E,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC;QAEzC,IAAI,QAAQ;YAAE,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QAErF,MAAM,IAAI,CAAC,oBAAoB,CAAC,WAAW,CAAC;YAC1C,UAAU,EAAE,MAAM,CAAC,EAAE;YACrB,QAAQ,EAAE,UAAU;YACpB,UAAU,EAAE,IAAI,IAAI,EAAE;SACvB,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;QAErC,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC;IAC7B,CAAC;CACF,CAAA;AA5FY,gEAA0B;qCAA1B,0BAA0B;IADtC,IAAA,mBAAU,GAAE;qCAQO,gCAAc;QACG,gEAA6B;QAClD,uBAAU;QACiB,4EAAmC;GAVjE,0BAA0B,CA4FtC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { OnModuleInit } from "@nestjs/common";
|
|
2
|
+
import { EventEmitter2 } from "@nestjs/event-emitter";
|
|
3
|
+
import { AppLoggingService } from "../../../core/logging/services/logging.service";
|
|
4
|
+
import { EmailAutomationModuleConfig, EmailAutomationRecipient, EmailAutomationTriggerDefinition } from "../interfaces/email-automation.config.interface";
|
|
5
|
+
import { EmailAutomationEnrollmentRepository } from "../repositories/email-automation-enrollment.repository";
|
|
6
|
+
import { EmailAutomationStepRepository } from "../repositories/email-automation-step.repository";
|
|
7
|
+
import { EmailAutomationRepository } from "../repositories/email-automation.repository";
|
|
8
|
+
import { EmailOptOutRepository } from "../repositories/email-opt-out.repository";
|
|
9
|
+
/**
|
|
10
|
+
* Listens to the events behind every declared trigger and moves people in and out of automations.
|
|
11
|
+
* On each trigger the exits run first, then the entries, so one trigger can end automation A and
|
|
12
|
+
* start automation B for the same person. Failures are logged and never reach the emitter.
|
|
13
|
+
*/
|
|
14
|
+
export declare class EmailAutomationTriggerService implements OnModuleInit {
|
|
15
|
+
private readonly config;
|
|
16
|
+
private readonly eventEmitter;
|
|
17
|
+
private readonly automationRepository;
|
|
18
|
+
private readonly stepRepository;
|
|
19
|
+
private readonly enrollmentRepository;
|
|
20
|
+
private readonly optOutRepository;
|
|
21
|
+
private readonly logger;
|
|
22
|
+
constructor(config: EmailAutomationModuleConfig, eventEmitter: EventEmitter2, automationRepository: EmailAutomationRepository, stepRepository: EmailAutomationStepRepository, enrollmentRepository: EmailAutomationEnrollmentRepository, optOutRepository: EmailOptOutRepository, logger: AppLoggingService);
|
|
23
|
+
onModuleInit(): void;
|
|
24
|
+
handle(def: EmailAutomationTriggerDefinition, payload: unknown): Promise<void>;
|
|
25
|
+
exit(triggerKey: string, recipient: EmailAutomationRecipient): Promise<void>;
|
|
26
|
+
enter(triggerKey: string, recipient: EmailAutomationRecipient): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=email-automation-trigger.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-automation-trigger.service.d.ts","sourceRoot":"","sources":["../../../../src/foundations/email-automation/services/email-automation-trigger.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AACnF,OAAO,EAEL,2BAA2B,EAC3B,wBAAwB,EACxB,gCAAgC,EACjC,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAAE,mCAAmC,EAAE,MAAM,wDAAwD,CAAC;AAC7G,OAAO,EAAE,6BAA6B,EAAE,MAAM,kDAAkD,CAAC;AACjG,OAAO,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AAIjF;;;;GAIG;AACH,qBACa,6BAA8B,YAAW,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACxD,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAN2B,MAAM,EAAE,2BAA2B,EACpE,YAAY,EAAE,aAAa,EAC3B,oBAAoB,EAAE,yBAAyB,EAC/C,cAAc,EAAE,6BAA6B,EAC7C,oBAAoB,EAAE,mCAAmC,EACzD,gBAAgB,EAAE,qBAAqB,EACvC,MAAM,EAAE,iBAAiB;IAG5C,YAAY,IAAI,IAAI;IAad,MAAM,CAAC,GAAG,EAAE,gCAAgC,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB9E,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB5E,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;CA+BpF"}
|
|
@@ -0,0 +1,125 @@
|
|
|
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
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var EmailAutomationTriggerService_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.EmailAutomationTriggerService = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const event_emitter_1 = require("@nestjs/event-emitter");
|
|
19
|
+
const crypto_1 = require("crypto");
|
|
20
|
+
const logging_service_1 = require("../../../core/logging/services/logging.service");
|
|
21
|
+
const email_automation_config_interface_1 = require("../interfaces/email-automation.config.interface");
|
|
22
|
+
const email_automation_enrollment_repository_1 = require("../repositories/email-automation-enrollment.repository");
|
|
23
|
+
const email_automation_step_repository_1 = require("../repositories/email-automation-step.repository");
|
|
24
|
+
const email_automation_repository_1 = require("../repositories/email-automation.repository");
|
|
25
|
+
const email_opt_out_repository_1 = require("../repositories/email-opt-out.repository");
|
|
26
|
+
const HOUR_MS = 60 * 60 * 1000;
|
|
27
|
+
/**
|
|
28
|
+
* Listens to the events behind every declared trigger and moves people in and out of automations.
|
|
29
|
+
* On each trigger the exits run first, then the entries, so one trigger can end automation A and
|
|
30
|
+
* start automation B for the same person. Failures are logged and never reach the emitter.
|
|
31
|
+
*/
|
|
32
|
+
let EmailAutomationTriggerService = EmailAutomationTriggerService_1 = class EmailAutomationTriggerService {
|
|
33
|
+
constructor(config, eventEmitter, automationRepository, stepRepository, enrollmentRepository, optOutRepository, logger) {
|
|
34
|
+
this.config = config;
|
|
35
|
+
this.eventEmitter = eventEmitter;
|
|
36
|
+
this.automationRepository = automationRepository;
|
|
37
|
+
this.stepRepository = stepRepository;
|
|
38
|
+
this.enrollmentRepository = enrollmentRepository;
|
|
39
|
+
this.optOutRepository = optOutRepository;
|
|
40
|
+
this.logger = logger;
|
|
41
|
+
}
|
|
42
|
+
onModuleInit() {
|
|
43
|
+
const byEvent = new Map();
|
|
44
|
+
for (const def of this.config.triggers ?? []) {
|
|
45
|
+
byEvent.set(def.event, [...(byEvent.get(def.event) ?? []), def]);
|
|
46
|
+
}
|
|
47
|
+
for (const [event, defs] of byEvent) {
|
|
48
|
+
this.eventEmitter.on(event, async (payload) => {
|
|
49
|
+
for (const def of defs)
|
|
50
|
+
await this.handle(def, payload);
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async handle(def, payload) {
|
|
55
|
+
try {
|
|
56
|
+
const recipient = def.toRecipient(payload);
|
|
57
|
+
if (!recipient)
|
|
58
|
+
return;
|
|
59
|
+
await this.exit(def.key, recipient);
|
|
60
|
+
await this.enter(def.key, recipient);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
this.logger.error(`Email automation trigger "${def.key}" failed`, error instanceof Error ? error : String(error), EmailAutomationTriggerService_1.name);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async exit(triggerKey, recipient) {
|
|
67
|
+
const automations = await this.automationRepository.findActiveByExitTrigger({ exitTrigger: triggerKey });
|
|
68
|
+
for (const automation of automations) {
|
|
69
|
+
const enrollments = await this.enrollmentRepository.findActiveByEmailAndAutomation({
|
|
70
|
+
email: recipient.email,
|
|
71
|
+
automationId: automation.id,
|
|
72
|
+
});
|
|
73
|
+
for (const enrollment of enrollments) {
|
|
74
|
+
await this.enrollmentRepository.finish({
|
|
75
|
+
enrollmentId: enrollment.id,
|
|
76
|
+
status: "exited",
|
|
77
|
+
finishedAt: new Date(),
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async enter(triggerKey, recipient) {
|
|
83
|
+
if (!recipient.marketingConsent)
|
|
84
|
+
return;
|
|
85
|
+
const automations = await this.automationRepository.findActiveByTrigger({ trigger: triggerKey });
|
|
86
|
+
if (automations.length === 0)
|
|
87
|
+
return;
|
|
88
|
+
const optOut = await this.optOutRepository.findByEmail({ email: recipient.email });
|
|
89
|
+
if (optOut)
|
|
90
|
+
return;
|
|
91
|
+
for (const automation of automations) {
|
|
92
|
+
const existing = await this.enrollmentRepository.findByAutomationAndEmail({
|
|
93
|
+
automationId: automation.id,
|
|
94
|
+
email: recipient.email,
|
|
95
|
+
});
|
|
96
|
+
if (existing)
|
|
97
|
+
continue;
|
|
98
|
+
const head = await this.stepRepository.findHead({ automationId: automation.id });
|
|
99
|
+
if (!head)
|
|
100
|
+
continue;
|
|
101
|
+
const enrolledAt = new Date();
|
|
102
|
+
await this.enrollmentRepository.createEnrollment({
|
|
103
|
+
id: (0, crypto_1.randomUUID)(),
|
|
104
|
+
automationId: automation.id,
|
|
105
|
+
stepId: head.id,
|
|
106
|
+
recipient,
|
|
107
|
+
enrolledAt,
|
|
108
|
+
nextSendAt: new Date(enrolledAt.getTime() + (head.delayHours ?? 0) * HOUR_MS),
|
|
109
|
+
unsubscribeToken: (0, crypto_1.randomUUID)(),
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
exports.EmailAutomationTriggerService = EmailAutomationTriggerService;
|
|
115
|
+
exports.EmailAutomationTriggerService = EmailAutomationTriggerService = EmailAutomationTriggerService_1 = __decorate([
|
|
116
|
+
(0, common_1.Injectable)(),
|
|
117
|
+
__param(0, (0, common_1.Inject)(email_automation_config_interface_1.EMAIL_AUTOMATION_CONFIG)),
|
|
118
|
+
__metadata("design:paramtypes", [Object, event_emitter_1.EventEmitter2,
|
|
119
|
+
email_automation_repository_1.EmailAutomationRepository,
|
|
120
|
+
email_automation_step_repository_1.EmailAutomationStepRepository,
|
|
121
|
+
email_automation_enrollment_repository_1.EmailAutomationEnrollmentRepository,
|
|
122
|
+
email_opt_out_repository_1.EmailOptOutRepository,
|
|
123
|
+
logging_service_1.AppLoggingService])
|
|
124
|
+
], EmailAutomationTriggerService);
|
|
125
|
+
//# sourceMappingURL=email-automation-trigger.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-automation-trigger.service.js","sourceRoot":"","sources":["../../../../src/foundations/email-automation/services/email-automation-trigger.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { ClsService } from "nestjs-cls";
|
|
2
|
+
import { 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 { EmailAutomationEnrollment, EmailAutomationEnrollmentDescriptor } from "../entities/email-automation-enrollment";
|
|
6
|
+
import { EmailAutomationEnrollmentRepository } from "../repositories/email-automation-enrollment.repository";
|
|
7
|
+
import { EmailOptOutRepository } from "../repositories/email-opt-out.repository";
|
|
8
|
+
export declare class EmailAutomationUnsubscribeService extends AbstractService<EmailAutomationEnrollment, typeof EmailAutomationEnrollmentDescriptor.relationships> {
|
|
9
|
+
private readonly enrollmentRepository;
|
|
10
|
+
private readonly optOutRepository;
|
|
11
|
+
protected readonly descriptor: import("../../..").EntityDescriptor<EmailAutomationEnrollment, {
|
|
12
|
+
automation: {
|
|
13
|
+
model: import("../../..").DataMeta;
|
|
14
|
+
direction: "in";
|
|
15
|
+
relationship: string;
|
|
16
|
+
cardinality: "one";
|
|
17
|
+
required: true;
|
|
18
|
+
dtoKey: string;
|
|
19
|
+
};
|
|
20
|
+
currentStep: {
|
|
21
|
+
model: import("../../..").DataMeta;
|
|
22
|
+
direction: "out";
|
|
23
|
+
relationship: string;
|
|
24
|
+
cardinality: "one";
|
|
25
|
+
required: false;
|
|
26
|
+
dtoKey: string;
|
|
27
|
+
};
|
|
28
|
+
sentSteps: {
|
|
29
|
+
model: import("../../..").DataMeta;
|
|
30
|
+
direction: "out";
|
|
31
|
+
relationship: string;
|
|
32
|
+
cardinality: "many";
|
|
33
|
+
required: false;
|
|
34
|
+
dtoKey: string;
|
|
35
|
+
fields: {
|
|
36
|
+
name: string;
|
|
37
|
+
type: "datetime";
|
|
38
|
+
required: true;
|
|
39
|
+
}[];
|
|
40
|
+
};
|
|
41
|
+
}>;
|
|
42
|
+
constructor(jsonApiService: JsonApiService, enrollmentRepository: EmailAutomationEnrollmentRepository, clsService: ClsService, optOutRepository: EmailOptOutRepository);
|
|
43
|
+
/**
|
|
44
|
+
* Stops the emails of one enrolment (`automation`) or every marketing email to its address (`all`).
|
|
45
|
+
* Idempotent: a repeat call changes nothing and still answers with the enrolment.
|
|
46
|
+
*/
|
|
47
|
+
unsubscribe(params: {
|
|
48
|
+
token: string;
|
|
49
|
+
scope: "automation" | "all";
|
|
50
|
+
source: "link" | "header";
|
|
51
|
+
}): Promise<JsonApiSingleDocument>;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=email-automation-unsubscribe.service.d.ts.map
|
package/dist/foundations/email-automation/services/email-automation-unsubscribe.service.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-automation-unsubscribe.service.d.ts","sourceRoot":"","sources":["../../../../src/foundations/email-automation/services/email-automation-unsubscribe.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,6DAA6D,CAAC;AACpG,OAAO,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,gDAAgD,CAAC;AACjF,OAAO,EACL,yBAAyB,EACzB,mCAAmC,EACpC,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,mCAAmC,EAAE,MAAM,wDAAwD,CAAC;AAC7G,OAAO,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AAEjF,qBACa,iCAAkC,SAAQ,eAAe,CACpE,yBAAyB,EACzB,OAAO,mCAAmC,CAAC,aAAa,CACzD;IAKG,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IAErC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IANnC,SAAS,CAAC,QAAQ,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAAuC;gBAGlE,cAAc,EAAE,cAAc,EACb,oBAAoB,EAAE,mCAAmC,EAC1E,UAAU,EAAE,UAAU,EACL,gBAAgB,EAAE,qBAAqB;IAK1D;;;OAGG;IACG,WAAW,CAAC,MAAM,EAAE;QACxB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,YAAY,GAAG,KAAK,CAAC;QAC5B,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC;KAC3B,GAAG,OAAO,CAAC,qBAAqB,CAAC;CA8BnC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
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.EmailAutomationUnsubscribeService = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const crypto_1 = require("crypto");
|
|
15
|
+
const nestjs_cls_1 = require("nestjs-cls");
|
|
16
|
+
const jsonapi_service_1 = require("../../../core/jsonapi/services/jsonapi.service");
|
|
17
|
+
const abstract_service_1 = require("../../../core/neo4j/abstracts/abstract.service");
|
|
18
|
+
const email_automation_enrollment_1 = require("../entities/email-automation-enrollment");
|
|
19
|
+
const email_automation_enrollment_repository_1 = require("../repositories/email-automation-enrollment.repository");
|
|
20
|
+
const email_opt_out_repository_1 = require("../repositories/email-opt-out.repository");
|
|
21
|
+
let EmailAutomationUnsubscribeService = class EmailAutomationUnsubscribeService extends abstract_service_1.AbstractService {
|
|
22
|
+
constructor(jsonApiService, enrollmentRepository, clsService, optOutRepository) {
|
|
23
|
+
super(jsonApiService, enrollmentRepository, clsService, email_automation_enrollment_1.EmailAutomationEnrollmentDescriptor.model);
|
|
24
|
+
this.enrollmentRepository = enrollmentRepository;
|
|
25
|
+
this.optOutRepository = optOutRepository;
|
|
26
|
+
this.descriptor = email_automation_enrollment_1.EmailAutomationEnrollmentDescriptor;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Stops the emails of one enrolment (`automation`) or every marketing email to its address (`all`).
|
|
30
|
+
* Idempotent: a repeat call changes nothing and still answers with the enrolment.
|
|
31
|
+
*/
|
|
32
|
+
async unsubscribe(params) {
|
|
33
|
+
const enrollment = await this.enrollmentRepository.findByUnsubscribeToken({ token: params.token });
|
|
34
|
+
if (!enrollment)
|
|
35
|
+
throw new common_1.NotFoundException("Invalid unsubscribe token");
|
|
36
|
+
const now = new Date();
|
|
37
|
+
if (enrollment.status === "active") {
|
|
38
|
+
await this.enrollmentRepository.finish({ enrollmentId: enrollment.id, status: "unsubscribed", finishedAt: now });
|
|
39
|
+
}
|
|
40
|
+
if (params.scope === "all") {
|
|
41
|
+
const activeEnrollments = await this.enrollmentRepository.findActiveByEmail({ email: enrollment.email });
|
|
42
|
+
for (const active of activeEnrollments) {
|
|
43
|
+
if (active.id === enrollment.id)
|
|
44
|
+
continue;
|
|
45
|
+
await this.enrollmentRepository.finish({ enrollmentId: active.id, status: "unsubscribed", finishedAt: now });
|
|
46
|
+
}
|
|
47
|
+
await this.optOutRepository.createOptOut({
|
|
48
|
+
id: (0, crypto_1.randomUUID)(),
|
|
49
|
+
email: enrollment.email,
|
|
50
|
+
optedOutAt: now,
|
|
51
|
+
source: params.source,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
// Re-read so the answer carries the new status (automation included for the page).
|
|
55
|
+
const updated = await this.enrollmentRepository.findByUnsubscribeToken({ token: params.token });
|
|
56
|
+
return this.jsonApiService.buildSingle(email_automation_enrollment_1.EmailAutomationEnrollmentDescriptor.model, updated ?? enrollment);
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
exports.EmailAutomationUnsubscribeService = EmailAutomationUnsubscribeService;
|
|
60
|
+
exports.EmailAutomationUnsubscribeService = EmailAutomationUnsubscribeService = __decorate([
|
|
61
|
+
(0, common_1.Injectable)(),
|
|
62
|
+
__metadata("design:paramtypes", [jsonapi_service_1.JsonApiService,
|
|
63
|
+
email_automation_enrollment_repository_1.EmailAutomationEnrollmentRepository,
|
|
64
|
+
nestjs_cls_1.ClsService,
|
|
65
|
+
email_opt_out_repository_1.EmailOptOutRepository])
|
|
66
|
+
], EmailAutomationUnsubscribeService);
|
|
67
|
+
//# sourceMappingURL=email-automation-unsubscribe.service.js.map
|
package/dist/foundations/email-automation/services/email-automation-unsubscribe.service.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-automation-unsubscribe.service.js","sourceRoot":"","sources":["../../../../src/foundations/email-automation/services/email-automation-unsubscribe.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA+D;AAC/D,mCAAoC;AACpC,2CAAwC;AAExC,oFAAgF;AAChF,qFAAiF;AACjF,yFAGiD;AACjD,mHAA6G;AAC7G,uFAAiF;AAG1E,IAAM,iCAAiC,GAAvC,MAAM,iCAAkC,SAAQ,kCAGtD;IAGC,YACE,cAA8B,EACb,oBAAyD,EAC1E,UAAsB,EACL,gBAAuC;QAExD,KAAK,CAAC,cAAc,EAAE,oBAAoB,EAAE,UAAU,EAAE,iEAAmC,CAAC,KAAK,CAAC,CAAC;QAJlF,yBAAoB,GAApB,oBAAoB,CAAqC;QAEzD,qBAAgB,GAAhB,gBAAgB,CAAuB;QANvC,eAAU,GAAG,iEAAmC,CAAC;IASpE,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,MAIjB;QACC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACnG,IAAI,CAAC,UAAU;YAAE,MAAM,IAAI,0BAAiB,CAAC,2BAA2B,CAAC,CAAC;QAE1E,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QAEvB,IAAI,UAAU,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACnC,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;QACnH,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YAC3B,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;YACzG,KAAK,MAAM,MAAM,IAAI,iBAAiB,EAAE,CAAC;gBACvC,IAAI,MAAM,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE;oBAAE,SAAS;gBAC1C,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;YAC/G,CAAC;YAED,MAAM,IAAI,CAAC,gBAAgB,CAAC,YAAY,CAAC;gBACvC,EAAE,EAAE,IAAA,mBAAU,GAAE;gBAChB,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,UAAU,EAAE,GAAG;gBACf,MAAM,EAAE,MAAM,CAAC,MAAM;aACtB,CAAC,CAAC;QACL,CAAC;QAED,mFAAmF;QACnF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAEhG,OAAO,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,iEAAmC,CAAC,KAAK,EAAE,OAAO,IAAI,UAAU,CAAC,CAAC;IAC3G,CAAC;CACF,CAAA;AArDY,8EAAiC;4CAAjC,iCAAiC;IAD7C,IAAA,mBAAU,GAAE;qCAQO,gCAAc;QACS,4EAAmC;QAC9D,uBAAU;QACa,gDAAqB;GAV/C,iCAAiC,CAqD7C"}
|
|
@@ -0,0 +1,53 @@
|
|
|
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, JsonApiDTOData } from "../../../core/neo4j/abstracts/abstract.service";
|
|
5
|
+
import { EmailAutomation, EmailAutomationDescriptor } from "../entities/email-automation";
|
|
6
|
+
import { EmailAutomationModuleConfig } from "../interfaces/email-automation.config.interface";
|
|
7
|
+
import { EmailAutomationEnrollmentRepository } from "../repositories/email-automation-enrollment.repository";
|
|
8
|
+
import { EmailAutomationStepRepository } from "../repositories/email-automation-step.repository";
|
|
9
|
+
import { EmailAutomationRepository } from "../repositories/email-automation.repository";
|
|
10
|
+
export declare class EmailAutomationService extends AbstractService<EmailAutomation, typeof EmailAutomationDescriptor.relationships> {
|
|
11
|
+
private readonly emailAutomationRepository;
|
|
12
|
+
private readonly stepRepository;
|
|
13
|
+
private readonly enrollmentRepository;
|
|
14
|
+
private readonly config;
|
|
15
|
+
protected readonly descriptor: import("../../..").EntityDescriptor<EmailAutomation, {
|
|
16
|
+
steps: {
|
|
17
|
+
model: import("../../..").DataMeta;
|
|
18
|
+
direction: "out";
|
|
19
|
+
relationship: string;
|
|
20
|
+
cardinality: "many";
|
|
21
|
+
required: false;
|
|
22
|
+
dtoKey: string;
|
|
23
|
+
};
|
|
24
|
+
}>;
|
|
25
|
+
constructor(jsonApiService: JsonApiService, emailAutomationRepository: EmailAutomationRepository, clsService: ClsService, stepRepository: EmailAutomationStepRepository, enrollmentRepository: EmailAutomationEnrollmentRepository, config: Required<EmailAutomationModuleConfig>);
|
|
26
|
+
/**
|
|
27
|
+
* The triggers the app declared, as a synthetic `email-automation-triggers` list.
|
|
28
|
+
*/
|
|
29
|
+
listTriggers(): Promise<JsonApiListDocument>;
|
|
30
|
+
/**
|
|
31
|
+
* Drops every saved canvas position, so the canvas lays the chain out again.
|
|
32
|
+
*/
|
|
33
|
+
tidy(params: {
|
|
34
|
+
id: string;
|
|
35
|
+
}): Promise<void>;
|
|
36
|
+
findEnrollments(params: {
|
|
37
|
+
id: string;
|
|
38
|
+
status?: string;
|
|
39
|
+
query: any;
|
|
40
|
+
}): Promise<JsonApiListDocument>;
|
|
41
|
+
createFromDTO(params: {
|
|
42
|
+
data: JsonApiDTOData;
|
|
43
|
+
included?: unknown[];
|
|
44
|
+
}): Promise<JsonApiSingleDocument>;
|
|
45
|
+
patchFromDTO(params: {
|
|
46
|
+
data: JsonApiDTOData;
|
|
47
|
+
}): Promise<JsonApiSingleDocument>;
|
|
48
|
+
/**
|
|
49
|
+
* `trigger` and `exitTrigger` must be a key the app declared, or empty.
|
|
50
|
+
*/
|
|
51
|
+
private validateTriggers;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=email-automation.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-automation.service.d.ts","sourceRoot":"","sources":["../../../../src/foundations/email-automation/services/email-automation.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,cAAc,EAAE,MAAM,gDAAgD,CAAC;AACjG,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AAG1F,OAAO,EAA2B,2BAA2B,EAAE,MAAM,iDAAiD,CAAC;AACvH,OAAO,EAAE,mCAAmC,EAAE,MAAM,wDAAwD,CAAC;AAC7G,OAAO,EAAE,6BAA6B,EAAE,MAAM,kDAAkD,CAAC;AACjG,OAAO,EAAE,yBAAyB,EAAE,MAAM,6CAA6C,CAAC;AAExF,qBACa,sBAAuB,SAAQ,eAAe,CACzD,eAAe,EACf,OAAO,yBAAyB,CAAC,aAAa,CAC/C;IAKG,OAAO,CAAC,QAAQ,CAAC,yBAAyB;IAE1C,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IACJ,OAAO,CAAC,QAAQ,CAAC,MAAM;IAR1D,SAAS,CAAC,QAAQ,CAAC,UAAU;;;;;;;;;OAA6B;gBAGxD,cAAc,EAAE,cAAc,EACb,yBAAyB,EAAE,yBAAyB,EACrE,UAAU,EAAE,UAAU,EACL,cAAc,EAAE,6BAA6B,EAC7C,oBAAoB,EAAE,mCAAmC,EACxB,MAAM,EAAE,QAAQ,CAAC,2BAA2B,CAAC;IAKjG;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAQlD;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,eAAe,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,GAAG,CAAA;KAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAYlG,aAAa,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,cAAc,CAAC;QAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;KAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAKrG,YAAY,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAKpF;;OAEG;IACH,OAAO,CAAC,gBAAgB;CASzB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
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
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.EmailAutomationService = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const nestjs_cls_1 = require("nestjs-cls");
|
|
18
|
+
const jsonapi_paginator_1 = require("../../../core/jsonapi/serialisers/jsonapi.paginator");
|
|
19
|
+
const jsonapi_service_1 = require("../../../core/jsonapi/services/jsonapi.service");
|
|
20
|
+
const abstract_service_1 = require("../../../core/neo4j/abstracts/abstract.service");
|
|
21
|
+
const email_automation_1 = require("../entities/email-automation");
|
|
22
|
+
const email_automation_enrollment_1 = require("../entities/email-automation-enrollment");
|
|
23
|
+
const email_automation_trigger_1 = require("../entities/email-automation-trigger");
|
|
24
|
+
const email_automation_config_interface_1 = require("../interfaces/email-automation.config.interface");
|
|
25
|
+
const email_automation_enrollment_repository_1 = require("../repositories/email-automation-enrollment.repository");
|
|
26
|
+
const email_automation_step_repository_1 = require("../repositories/email-automation-step.repository");
|
|
27
|
+
const email_automation_repository_1 = require("../repositories/email-automation.repository");
|
|
28
|
+
let EmailAutomationService = class EmailAutomationService extends abstract_service_1.AbstractService {
|
|
29
|
+
constructor(jsonApiService, emailAutomationRepository, clsService, stepRepository, enrollmentRepository, config) {
|
|
30
|
+
super(jsonApiService, emailAutomationRepository, clsService, email_automation_1.EmailAutomationDescriptor.model);
|
|
31
|
+
this.emailAutomationRepository = emailAutomationRepository;
|
|
32
|
+
this.stepRepository = stepRepository;
|
|
33
|
+
this.enrollmentRepository = enrollmentRepository;
|
|
34
|
+
this.config = config;
|
|
35
|
+
this.descriptor = email_automation_1.EmailAutomationDescriptor;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* The triggers the app declared, as a synthetic `email-automation-triggers` list.
|
|
39
|
+
*/
|
|
40
|
+
async listTriggers() {
|
|
41
|
+
return this.jsonApiService.buildList(email_automation_trigger_1.EmailAutomationTriggerDescriptor.model, this.config.triggers.map(({ key, label }) => ({ id: key, key, label })), new jsonapi_paginator_1.JsonApiPaginator({}));
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Drops every saved canvas position, so the canvas lays the chain out again.
|
|
45
|
+
*/
|
|
46
|
+
async tidy(params) {
|
|
47
|
+
await this.stepRepository.clearPositions({ automationId: params.id });
|
|
48
|
+
}
|
|
49
|
+
async findEnrollments(params) {
|
|
50
|
+
const paginator = new jsonapi_paginator_1.JsonApiPaginator(params.query);
|
|
51
|
+
const data = await this.enrollmentRepository.findByAutomation({
|
|
52
|
+
automationId: params.id,
|
|
53
|
+
status: params.status,
|
|
54
|
+
cursor: paginator.generateCursor(),
|
|
55
|
+
});
|
|
56
|
+
return this.jsonApiService.buildList(email_automation_enrollment_1.EmailAutomationEnrollmentDescriptor.model, data, paginator);
|
|
57
|
+
}
|
|
58
|
+
async createFromDTO(params) {
|
|
59
|
+
this.validateTriggers(params.data);
|
|
60
|
+
return super.createFromDTO(params);
|
|
61
|
+
}
|
|
62
|
+
async patchFromDTO(params) {
|
|
63
|
+
this.validateTriggers(params.data);
|
|
64
|
+
return super.patchFromDTO(params);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* `trigger` and `exitTrigger` must be a key the app declared, or empty.
|
|
68
|
+
*/
|
|
69
|
+
validateTriggers(data) {
|
|
70
|
+
const declared = new Set(this.config.triggers.map((trigger) => trigger.key));
|
|
71
|
+
for (const field of ["trigger", "exitTrigger"]) {
|
|
72
|
+
const value = data.attributes?.[field];
|
|
73
|
+
if (value === undefined || value === null || value === "")
|
|
74
|
+
continue;
|
|
75
|
+
if (!declared.has(value))
|
|
76
|
+
throw new common_1.BadRequestException(`Unknown ${field}: ${value}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
exports.EmailAutomationService = EmailAutomationService;
|
|
81
|
+
exports.EmailAutomationService = EmailAutomationService = __decorate([
|
|
82
|
+
(0, common_1.Injectable)(),
|
|
83
|
+
__param(5, (0, common_1.Inject)(email_automation_config_interface_1.EMAIL_AUTOMATION_CONFIG)),
|
|
84
|
+
__metadata("design:paramtypes", [jsonapi_service_1.JsonApiService,
|
|
85
|
+
email_automation_repository_1.EmailAutomationRepository,
|
|
86
|
+
nestjs_cls_1.ClsService,
|
|
87
|
+
email_automation_step_repository_1.EmailAutomationStepRepository,
|
|
88
|
+
email_automation_enrollment_repository_1.EmailAutomationEnrollmentRepository, Object])
|
|
89
|
+
], EmailAutomationService);
|
|
90
|
+
//# sourceMappingURL=email-automation.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-automation.service.js","sourceRoot":"","sources":["../../../../src/foundations/email-automation/services/email-automation.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAyE;AACzE,2CAAwC;AAKxC,2FAAuF;AACvF,oFAAgF;AAChF,qFAAiG;AACjG,mEAA0F;AAC1F,yFAA8F;AAC9F,mFAAwF;AACxF,uGAAuH;AACvH,mHAA6G;AAC7G,uGAAiG;AACjG,6FAAwF;AAGjF,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,kCAG3C;IAGC,YACE,cAA8B,EACb,yBAAoD,EACrE,UAAsB,EACL,cAA6C,EAC7C,oBAAyD,EACzC,MAA8D;QAE/F,KAAK,CAAC,cAAc,EAAE,yBAAyB,EAAE,UAAU,EAAE,4CAAyB,CAAC,KAAK,CAAC,CAAC;QAN7E,8BAAyB,GAAzB,yBAAyB,CAA2B;QAEpD,mBAAc,GAAd,cAAc,CAA+B;QAC7C,yBAAoB,GAApB,oBAAoB,CAAqC;QACxB,WAAM,GAAN,MAAM,CAAuC;QAR9E,eAAU,GAAG,4CAAyB,CAAC;IAW1D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,CAClC,2DAAgC,CAAC,KAAK,EACtC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,EACvE,IAAI,oCAAgB,CAAC,EAAE,CAAC,CACzB,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,MAAsB;QAC/B,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAmD;QACvE,MAAM,SAAS,GAAG,IAAI,oCAAgB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAErD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,gBAAgB,CAAC;YAC5D,YAAY,EAAE,MAAM,CAAC,EAAE;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,SAAS,CAAC,cAAc,EAAE;SACnC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,iEAAmC,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;IACnG,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAsD;QACxE,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAgC;QACjD,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACK,gBAAgB,CAAC,IAAoB;QAC3C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAE7E,KAAK,MAAM,KAAK,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,CAAC;YAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;YACvC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE;gBAAE,SAAS;YACpE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;gBAAE,MAAM,IAAI,4BAAmB,CAAC,WAAW,KAAK,KAAK,KAAK,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;CACF,CAAA;AArEY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,mBAAU,GAAE;IAaR,WAAA,IAAA,eAAM,EAAC,2DAAuB,CAAC,CAAA;qCALhB,gCAAc;QACc,uDAAyB;QACzD,uBAAU;QACW,gEAA6B;QACvB,4EAAmC;GAXjE,sBAAsB,CAqElC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { EmailAutomationTriggerDefinition } from "../interfaces/email-automation.config.interface";
|
|
2
|
+
/**
|
|
3
|
+
* Trigger fired when a waitlist entry is confirmed. The app chooses the key and the label.
|
|
4
|
+
*/
|
|
5
|
+
export declare function waitlistConfirmedTrigger(key: string, label?: string): EmailAutomationTriggerDefinition;
|
|
6
|
+
/**
|
|
7
|
+
* Trigger fired when a user completes registration. The app chooses the key and the label.
|
|
8
|
+
*/
|
|
9
|
+
export declare function userActivatedTrigger(key: string, label?: string): EmailAutomationTriggerDefinition;
|
|
10
|
+
//# sourceMappingURL=built-in.triggers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"built-in.triggers.d.ts","sourceRoot":"","sources":["../../../../src/foundations/email-automation/triggers/built-in.triggers.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,gCAAgC,EACjC,MAAM,iDAAiD,CAAC;AAEzD;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAAuB,GAAG,gCAAgC,CAiBpH;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,SAA2B,GAAG,gCAAgC,CAkBpH"}
|