@servicelabsco/slabs-access-manager 2.0.18 → 2.0.20
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/access/controllers/business.email.controller.d.ts +7 -1
- package/dist/access/controllers/business.email.controller.js +23 -2
- package/dist/access/controllers/business.email.controller.js.map +1 -1
- package/dist/access/controllers/business.preference.controller.d.ts +3 -1
- package/dist/access/controllers/business.preference.controller.js +6 -3
- package/dist/access/controllers/business.preference.controller.js.map +1 -1
- package/dist/access/controllers/mail.log.controller.d.ts +11 -3
- package/dist/access/controllers/mail.log.controller.js +46 -12
- package/dist/access/controllers/mail.log.controller.js.map +1 -1
- package/dist/access/dtos/email.notification.payload.dto.d.ts +4 -0
- package/dist/access/dtos/email.notification.payload.dto.js.map +1 -1
- package/dist/access/dtos/fetch.business.email.messages.dto.d.ts +4 -0
- package/dist/access/dtos/fetch.business.email.messages.dto.js +35 -0
- package/dist/access/dtos/fetch.business.email.messages.dto.js.map +1 -0
- package/dist/access/dtos/index.d.ts +2 -0
- package/dist/access/dtos/index.js +2 -0
- package/dist/access/dtos/index.js.map +1 -1
- package/dist/access/dtos/mail.log.content.query.dto.d.ts +1 -2
- package/dist/access/dtos/mail.log.content.query.dto.js +1 -2
- package/dist/access/dtos/mail.log.content.query.dto.js.map +1 -1
- package/dist/access/dtos/mail.log.list.filter.dto.d.ts +0 -1
- package/dist/access/dtos/mail.log.list.filter.dto.js +0 -8
- package/dist/access/dtos/mail.log.list.filter.dto.js.map +1 -1
- package/dist/access/dtos/refresh.mail.log.status.dto.d.ts +3 -0
- package/dist/access/dtos/refresh.mail.log.status.dto.js +27 -0
- package/dist/access/dtos/refresh.mail.log.status.dto.js.map +1 -0
- package/dist/access/enums/notification.channel.type.enum.d.ts +1 -1
- package/dist/access/enums/notification.channel.type.enum.js +1 -1
- package/dist/access/enums/notification.channel.type.enum.js.map +1 -1
- package/dist/access/es6.classes.d.ts +14 -6
- package/dist/access/es6.classes.js +16 -0
- package/dist/access/es6.classes.js.map +1 -1
- package/dist/access/interfaces/email.redaction.map.interface.d.ts +1 -0
- package/dist/access/interfaces/email.redaction.map.interface.js +3 -0
- package/dist/access/interfaces/email.redaction.map.interface.js.map +1 -0
- package/dist/access/interfaces/index.d.ts +2 -0
- package/dist/access/interfaces/index.js +2 -0
- package/dist/access/interfaces/index.js.map +1 -1
- package/dist/access/interfaces/mail.log.read.scope.interface.d.ts +9 -0
- package/dist/access/interfaces/mail.log.read.scope.interface.js +3 -0
- package/dist/access/interfaces/mail.log.read.scope.interface.js.map +1 -0
- package/dist/access/interfaces/send.emithook.template.email.options.interface.d.ts +2 -0
- package/dist/access/jobs/fetch.business.email.messages.job.d.ts +25 -0
- package/dist/access/jobs/fetch.business.email.messages.job.js +86 -0
- package/dist/access/jobs/fetch.business.email.messages.job.js.map +1 -0
- package/dist/access/jobs/index.d.ts +2 -0
- package/dist/access/jobs/index.js +2 -0
- package/dist/access/jobs/index.js.map +1 -1
- package/dist/access/jobs/poll.emithook.email.inbox.job.d.ts +0 -3
- package/dist/access/jobs/poll.emithook.email.inbox.job.js +3 -46
- package/dist/access/jobs/poll.emithook.email.inbox.job.js.map +1 -1
- package/dist/access/jobs/refresh.business.mail.log.status.job.d.ts +19 -0
- package/dist/access/jobs/refresh.business.mail.log.status.job.js +40 -0
- package/dist/access/jobs/refresh.business.mail.log.status.job.js.map +1 -0
- package/dist/access/jobs/sync.email.messages.job.d.ts +0 -1
- package/dist/access/jobs/sync.email.messages.job.js +3 -16
- package/dist/access/jobs/sync.email.messages.job.js.map +1 -1
- package/dist/access/libraries/apply.email.test.redirect.d.ts +5 -0
- package/dist/access/libraries/apply.email.test.redirect.js +20 -0
- package/dist/access/libraries/apply.email.test.redirect.js.map +1 -0
- package/dist/access/libraries/fetch.emithook.mailbox.messages.d.ts +11 -0
- package/dist/access/libraries/fetch.emithook.mailbox.messages.js +57 -0
- package/dist/access/libraries/fetch.emithook.mailbox.messages.js.map +1 -0
- package/dist/access/libraries/fetch.meta.mailbox.messages.d.ts +10 -0
- package/dist/access/libraries/fetch.meta.mailbox.messages.js +35 -0
- package/dist/access/libraries/fetch.meta.mailbox.messages.js.map +1 -0
- package/dist/access/libraries/index.d.ts +4 -0
- package/dist/access/libraries/index.js +4 -0
- package/dist/access/libraries/index.js.map +1 -1
- package/dist/access/libraries/process.email.notification.d.ts +4 -0
- package/dist/access/libraries/process.email.notification.js +53 -11
- package/dist/access/libraries/process.email.notification.js.map +1 -1
- package/dist/access/libraries/process.internal.notification.js +2 -0
- package/dist/access/libraries/process.internal.notification.js.map +1 -1
- package/dist/access/libraries/process.mail.log.list.d.ts +2 -1
- package/dist/access/libraries/process.mail.log.list.js +5 -1
- package/dist/access/libraries/process.mail.log.list.js.map +1 -1
- package/dist/access/libraries/reconcile.emithook.email.status.d.ts +6 -0
- package/dist/access/libraries/reconcile.emithook.email.status.js +26 -1
- package/dist/access/libraries/reconcile.emithook.email.status.js.map +1 -1
- package/dist/access/libraries/redact.email.log.d.ts +17 -0
- package/dist/access/libraries/redact.email.log.js +93 -0
- package/dist/access/libraries/redact.email.log.js.map +1 -0
- package/dist/access/libraries/resolve.emithook.template.key.d.ts +0 -1
- package/dist/access/libraries/resolve.emithook.template.key.js +0 -12
- package/dist/access/libraries/resolve.emithook.template.key.js.map +1 -1
- package/dist/access/libraries/send.emithook.template.email.d.ts +1 -0
- package/dist/access/libraries/send.emithook.template.email.js +12 -6
- package/dist/access/libraries/send.emithook.template.email.js.map +1 -1
- package/dist/access/libraries/show.mail.log.content.d.ts +2 -1
- package/dist/access/libraries/show.mail.log.content.js +7 -1
- package/dist/access/libraries/show.mail.log.content.js.map +1 -1
- package/dist/access/libraries/show.mail.log.d.ts +2 -1
- package/dist/access/libraries/show.mail.log.js +4 -1
- package/dist/access/libraries/show.mail.log.js.map +1 -1
- package/dist/access/services/mail.log.access.service.d.ts +3 -2
- package/dist/access/services/mail.log.access.service.js +19 -5
- package/dist/access/services/mail.log.access.service.js.map +1 -1
- package/dist/migrations/1792454400003-AddSmsNotificationChannelDataSeederTable.js +1 -1
- package/dist/migrations/1792454400003-AddSmsNotificationChannelDataSeederTable.js.map +1 -1
- package/dist/migrations/1792532792345-AddBusinessIdSysMailLogsTable.js +4 -0
- package/dist/migrations/1792532792345-AddBusinessIdSysMailLogsTable.js.map +1 -1
- package/dist/migrations/1792614718869-MoveSmsNotificationChannelLookupValue.d.ts +7 -0
- package/dist/migrations/1792614718869-MoveSmsNotificationChannelLookupValue.js +43 -0
- package/dist/migrations/1792614718869-MoveSmsNotificationChannelLookupValue.js.map +1 -0
- package/dist/migrations/1792615636366-AddBusinessIdIndexSysMailLogsTable.d.ts +6 -0
- package/dist/migrations/1792615636366-AddBusinessIdIndexSysMailLogsTable.js +18 -0
- package/dist/migrations/1792615636366-AddBusinessIdIndexSysMailLogsTable.js.map +1 -0
- package/package.json +2 -2
|
@@ -14,12 +14,11 @@ const common_1 = require("@nestjs/common");
|
|
|
14
14
|
const nestjs_utility_services_1 = require("@servicelabsco/nestjs-utility-services");
|
|
15
15
|
const typeorm_1 = require("typeorm");
|
|
16
16
|
const business_email_entity_1 = require("../entities/business.email.entity");
|
|
17
|
-
const email_message_entity_1 = require("../entities/email.message.entity");
|
|
18
17
|
const business_email_type_enum_1 = require("../enums/business.email.type.enum");
|
|
18
|
+
const fetch_emithook_mailbox_messages_1 = require("../libraries/fetch.emithook.mailbox.messages");
|
|
19
19
|
const emithook_service_1 = require("../services/emithook.service");
|
|
20
20
|
const handle_emithook_email_job_1 = require("./handle.emithook.email.job");
|
|
21
21
|
const DEFAULT_LOOKBACK_HOURS = 2;
|
|
22
|
-
const MAX_PAGES = 20;
|
|
23
22
|
let PollEmithookEmailInboxJob = class PollEmithookEmailInboxJob extends nestjs_utility_services_1.CommonJob {
|
|
24
23
|
constructor(queueService, emithookService, handleEmithookEmailJob) {
|
|
25
24
|
super('7158f74fd614f3df7d918dd010c73c71');
|
|
@@ -34,10 +33,11 @@ let PollEmithookEmailInboxJob = class PollEmithookEmailInboxJob extends nestjs_u
|
|
|
34
33
|
const hours = payload?.hours > 0 ? payload.hours : DEFAULT_LOOKBACK_HOURS;
|
|
35
34
|
const since = new Date(Date.now() - hours * 60 * 60 * 1000);
|
|
36
35
|
const mailboxes = await this.mailboxes();
|
|
36
|
+
const fetcher = new fetch_emithook_mailbox_messages_1.FetchEmithookMailboxMessages(this.emithookService, this.handleEmithookEmailJob);
|
|
37
37
|
let stored = 0;
|
|
38
38
|
for (const mailbox of mailboxes) {
|
|
39
39
|
try {
|
|
40
|
-
const count = await
|
|
40
|
+
const count = await fetcher.process(mailbox, since);
|
|
41
41
|
stored += count;
|
|
42
42
|
}
|
|
43
43
|
catch (error) {
|
|
@@ -46,49 +46,6 @@ let PollEmithookEmailInboxJob = class PollEmithookEmailInboxJob extends nestjs_u
|
|
|
46
46
|
}
|
|
47
47
|
return stored;
|
|
48
48
|
}
|
|
49
|
-
async sweep(mailbox, since) {
|
|
50
|
-
let stored = 0;
|
|
51
|
-
let cursor;
|
|
52
|
-
for (let pages = 0; pages < MAX_PAGES; pages++) {
|
|
53
|
-
const page = await this.emithookService.listMessages(mailbox.identifier, cursor);
|
|
54
|
-
const rows = page.data || [];
|
|
55
|
-
if (!rows.length)
|
|
56
|
-
return stored;
|
|
57
|
-
for (const row of rows) {
|
|
58
|
-
if (this.isBefore(row.received_at, since))
|
|
59
|
-
return stored;
|
|
60
|
-
if (!row.message_id)
|
|
61
|
-
continue;
|
|
62
|
-
const existing = await email_message_entity_1.EmailMessageEntity.findOne({
|
|
63
|
-
where: { email_id: mailbox.id, identifier: row.message_id, deleted_at: (0, typeorm_1.IsNull)() },
|
|
64
|
-
});
|
|
65
|
-
if (existing?.id)
|
|
66
|
-
continue;
|
|
67
|
-
await this.handleEmithookEmailJob.handle(this.envelope(mailbox, row));
|
|
68
|
-
stored += 1;
|
|
69
|
-
}
|
|
70
|
-
if (!page.next_cursor)
|
|
71
|
-
return stored;
|
|
72
|
-
cursor = page.next_cursor;
|
|
73
|
-
}
|
|
74
|
-
this.logger.warn(`emithook inbox poll stopped after ${MAX_PAGES} pages for ${mailbox.identifier}`);
|
|
75
|
-
return stored;
|
|
76
|
-
}
|
|
77
|
-
envelope(mailbox, row) {
|
|
78
|
-
return {
|
|
79
|
-
version: 2,
|
|
80
|
-
metadata: { source: 'email', identifier: mailbox.identifier, event_id: row.id, name: mailbox.email },
|
|
81
|
-
data: { body: { message_id: row.message_id }, headers: {}, queries: {} },
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
isBefore(receivedAt, since) {
|
|
85
|
-
if (!receivedAt)
|
|
86
|
-
return false;
|
|
87
|
-
const received = new Date(receivedAt);
|
|
88
|
-
if (Number.isNaN(received.getTime()))
|
|
89
|
-
return false;
|
|
90
|
-
return received < since;
|
|
91
|
-
}
|
|
92
49
|
async mailboxes() {
|
|
93
50
|
return business_email_entity_1.BusinessEmailEntity.find({
|
|
94
51
|
where: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poll.emithook.email.inbox.job.js","sourceRoot":"","sources":["../../../src/access/jobs/poll.emithook.email.inbox.job.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,oFAAiF;AACjF,qCAA2C;
|
|
1
|
+
{"version":3,"file":"poll.emithook.email.inbox.job.js","sourceRoot":"","sources":["../../../src/access/jobs/poll.emithook.email.inbox.job.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,oFAAiF;AACjF,qCAA2C;AAC3C,6EAAwE;AACxE,gFAA0E;AAC1E,kGAA4F;AAC5F,mEAA+D;AAC/D,2EAAqE;AAGrE,MAAM,sBAAsB,GAAG,CAAC,CAAC;AAQ1B,IAAM,yBAAyB,GAA/B,MAAM,yBAA0B,SAAQ,mCAAS;IAKpD,YACuB,YAA0B,EAC5B,eAAgC,EAChC,sBAA8C;QAE/D,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAJvB,iBAAY,GAAZ,YAAY,CAAc;QAC5B,oBAAe,GAAf,eAAe,CAAiB;QAChC,2BAAsB,GAAtB,sBAAsB,CAAwB;QAPzD,gBAAW,GAAG,IAAI,CAAC;QACnB,aAAQ,GAAG,EAAE,CAAC;QACd,YAAO,GAAW,MAAM,CAAC;IAQnC,CAAC;IAOD,KAAK,CAAC,MAAM,CAAC,OAA4B;QACrC,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,sBAAsB,CAAC;QAC1E,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,8DAA4B,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACpG,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACpD,MAAM,IAAI,KAAK,CAAC;YACpB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,OAAO,CAAC,UAAU,MAAM,KAAK,EAAE,CAAC,CAAC;YACzF,CAAC;QACL,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAMO,KAAK,CAAC,SAAS;QACnB,OAAO,2CAAmB,CAAC,IAAI,CAAC;YAC5B,KAAK,EAAE;gBACH,MAAM,EAAE,IAAI;gBACZ,UAAU,EAAE,IAAA,aAAG,EAAC,IAAA,gBAAM,GAAE,CAAC;gBACzB,UAAU,EAAE,IAAA,aAAG,EAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,qBAAqB,EAAE,EAAE,IAAI,EAAE,gDAAqB,CAAC,QAAQ,EAAE,CAAC;aACxG;SACJ,CAAC,CAAC;IACP,CAAC;CACJ,CAAA;AAlDY,8DAAyB;oCAAzB,yBAAyB;IADrC,IAAA,mBAAU,GAAE;qCAO4B,sCAAY;QACX,kCAAe;QACR,kDAAsB;GAR1D,yBAAyB,CAkDrC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { CommonJob, QueueService, SqlService } from '@servicelabsco/nestjs-utility-services';
|
|
2
|
+
import { EmithookService } from '../services/emithook.service';
|
|
3
|
+
export declare const MAIL_LOG_REFRESH_DEFAULT_HOURS = 48;
|
|
4
|
+
export declare class RefreshBusinessMailLogStatusJob extends CommonJob {
|
|
5
|
+
protected readonly queueService: QueueService;
|
|
6
|
+
private readonly sqlService;
|
|
7
|
+
private readonly emithookService;
|
|
8
|
+
protected noDuplicate: boolean;
|
|
9
|
+
protected timeout: number;
|
|
10
|
+
constructor(queueService: QueueService, sqlService: SqlService, emithookService: EmithookService);
|
|
11
|
+
handle(payload: {
|
|
12
|
+
business_id: number;
|
|
13
|
+
recipient_user_id?: number;
|
|
14
|
+
hours?: number;
|
|
15
|
+
}): Promise<{
|
|
16
|
+
checked: number;
|
|
17
|
+
failed: number;
|
|
18
|
+
}>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
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.RefreshBusinessMailLogStatusJob = exports.MAIL_LOG_REFRESH_DEFAULT_HOURS = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const nestjs_utility_services_1 = require("@servicelabsco/nestjs-utility-services");
|
|
15
|
+
const reconcile_emithook_email_status_1 = require("../libraries/reconcile.emithook.email.status");
|
|
16
|
+
const emithook_service_1 = require("../services/emithook.service");
|
|
17
|
+
exports.MAIL_LOG_REFRESH_DEFAULT_HOURS = 48;
|
|
18
|
+
let RefreshBusinessMailLogStatusJob = class RefreshBusinessMailLogStatusJob extends nestjs_utility_services_1.CommonJob {
|
|
19
|
+
constructor(queueService, sqlService, emithookService) {
|
|
20
|
+
super('466a3124f94bd042d1d7e507c8908fa1');
|
|
21
|
+
this.queueService = queueService;
|
|
22
|
+
this.sqlService = sqlService;
|
|
23
|
+
this.emithookService = emithookService;
|
|
24
|
+
this.noDuplicate = true;
|
|
25
|
+
this.timeout = 600000;
|
|
26
|
+
}
|
|
27
|
+
async handle(payload) {
|
|
28
|
+
const hours = payload?.hours > 0 ? payload.hours : exports.MAIL_LOG_REFRESH_DEFAULT_HOURS;
|
|
29
|
+
const since = new Date(Date.now() - hours * 60 * 60 * 1000);
|
|
30
|
+
return new reconcile_emithook_email_status_1.ReconcileEmithookEmailStatus(this.sqlService, this.emithookService).processBusiness(payload.business_id, since, payload.recipient_user_id);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
exports.RefreshBusinessMailLogStatusJob = RefreshBusinessMailLogStatusJob;
|
|
34
|
+
exports.RefreshBusinessMailLogStatusJob = RefreshBusinessMailLogStatusJob = __decorate([
|
|
35
|
+
(0, common_1.Injectable)(),
|
|
36
|
+
__metadata("design:paramtypes", [nestjs_utility_services_1.QueueService,
|
|
37
|
+
nestjs_utility_services_1.SqlService,
|
|
38
|
+
emithook_service_1.EmithookService])
|
|
39
|
+
], RefreshBusinessMailLogStatusJob);
|
|
40
|
+
//# sourceMappingURL=refresh.business.mail.log.status.job.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"refresh.business.mail.log.status.job.js","sourceRoot":"","sources":["../../../src/access/jobs/refresh.business.mail.log.status.job.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,oFAA6F;AAC7F,kGAA4F;AAC5F,mEAA+D;AAGlD,QAAA,8BAA8B,GAAG,EAAE,CAAC;AAQ1C,IAAM,+BAA+B,GAArC,MAAM,+BAAgC,SAAQ,mCAAS;IAI1D,YACuB,YAA0B,EAC5B,UAAsB,EACtB,eAAgC;QAEjD,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAJvB,iBAAY,GAAZ,YAAY,CAAc;QAC5B,eAAU,GAAV,UAAU,CAAY;QACtB,oBAAe,GAAf,eAAe,CAAiB;QAN3C,gBAAW,GAAG,IAAI,CAAC;QACnB,YAAO,GAAW,MAAM,CAAC;IAQnC,CAAC;IAOD,KAAK,CAAC,MAAM,CAAC,OAA4E;QACrF,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,sCAA8B,CAAC;QAClF,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAE5D,OAAO,IAAI,8DAA4B,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,eAAe,CAC1F,OAAO,CAAC,WAAW,EACnB,KAAK,EACL,OAAO,CAAC,iBAAiB,CAC5B,CAAC;IACN,CAAC;CACJ,CAAA;AA3BY,0EAA+B;0CAA/B,+BAA+B;IAD3C,IAAA,mBAAU,GAAE;qCAM4B,sCAAY;QAChB,oCAAU;QACL,kCAAe;GAP5C,+BAA+B,CA2B3C"}
|
|
@@ -6,5 +6,4 @@ export declare class SyncEmailMessagesJob extends CommonJob {
|
|
|
6
6
|
private readonly internalServerConnectService;
|
|
7
7
|
constructor(queueService: QueueService, processServerEmailJob: ProcessServerEmailJob, internalServerConnectService: InternalServerConnectService);
|
|
8
8
|
handle(date: string): Promise<void>;
|
|
9
|
-
private handleEmail;
|
|
10
9
|
}
|
|
@@ -14,7 +14,7 @@ const common_1 = require("@nestjs/common");
|
|
|
14
14
|
const nestjs_utility_services_1 = require("@servicelabsco/nestjs-utility-services");
|
|
15
15
|
const typeorm_1 = require("typeorm");
|
|
16
16
|
const business_email_entity_1 = require("../entities/business.email.entity");
|
|
17
|
-
const
|
|
17
|
+
const fetch_meta_mailbox_messages_1 = require("../libraries/fetch.meta.mailbox.messages");
|
|
18
18
|
const process_server_email_job_1 = require("./process.server.email.job");
|
|
19
19
|
let SyncEmailMessagesJob = class SyncEmailMessagesJob extends nestjs_utility_services_1.CommonJob {
|
|
20
20
|
constructor(queueService, processServerEmailJob, internalServerConnectService) {
|
|
@@ -25,25 +25,12 @@ let SyncEmailMessagesJob = class SyncEmailMessagesJob extends nestjs_utility_ser
|
|
|
25
25
|
}
|
|
26
26
|
async handle(date) {
|
|
27
27
|
const d = date ? new Date(date) : new Date();
|
|
28
|
-
const day = nestjs_utility_services_1.DateUtil.getDateInFormat(d);
|
|
29
28
|
const emails = await business_email_entity_1.BusinessEmailEntity.find({ where: { active: true, meta_server_id: (0, typeorm_1.Not)((0, typeorm_1.IsNull)()) } });
|
|
29
|
+
const fetcher = new fetch_meta_mailbox_messages_1.FetchMetaMailboxMessages(this.internalServerConnectService, this.processServerEmailJob);
|
|
30
30
|
for (const email of emails) {
|
|
31
|
-
|
|
32
|
-
const messages = response?.data || [];
|
|
33
|
-
for (const message of messages) {
|
|
34
|
-
await this.handleEmail(email, message);
|
|
35
|
-
}
|
|
31
|
+
await fetcher.process(email, d);
|
|
36
32
|
}
|
|
37
33
|
}
|
|
38
|
-
async handleEmail(email, message) {
|
|
39
|
-
const identifier = message?.identifier;
|
|
40
|
-
if (!identifier)
|
|
41
|
-
return;
|
|
42
|
-
const r = await email_message_entity_1.EmailMessageEntity.findOne({ where: { email_id: email.id, identifier } });
|
|
43
|
-
if (r)
|
|
44
|
-
return;
|
|
45
|
-
return this.processServerEmailJob.dispatch(message?.id);
|
|
46
|
-
}
|
|
47
34
|
};
|
|
48
35
|
exports.SyncEmailMessagesJob = SyncEmailMessagesJob;
|
|
49
36
|
exports.SyncEmailMessagesJob = SyncEmailMessagesJob = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.email.messages.job.js","sourceRoot":"","sources":["../../../src/access/jobs/sync.email.messages.job.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,
|
|
1
|
+
{"version":3,"file":"sync.email.messages.job.js","sourceRoot":"","sources":["../../../src/access/jobs/sync.email.messages.job.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,oFAA+G;AAC/G,qCAAsC;AACtC,6EAAwE;AACxE,0FAAoF;AACpF,yEAAmE;AAO5D,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,mCAAS;IAC/C,YACuB,YAA0B,EAC1B,qBAA4C,EAC9C,4BAA0D;QAE3E,KAAK,CAAC,kCAAkC,CAAC,CAAC;QAJvB,iBAAY,GAAZ,YAAY,CAAc;QAC1B,0BAAqB,GAArB,qBAAqB,CAAuB;QAC9C,iCAA4B,GAA5B,4BAA4B,CAA8B;IAG/E,CAAC;IAMD,KAAK,CAAC,MAAM,CAAC,IAAY;QACrB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;QAE7C,MAAM,MAAM,GAAG,MAAM,2CAAmB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,IAAA,aAAG,EAAC,IAAA,gBAAM,GAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC1G,MAAM,OAAO,GAAG,IAAI,sDAAwB,CAAC,IAAI,CAAC,4BAA4B,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAE5G,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACzB,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACpC,CAAC;IACL,CAAC;CACJ,CAAA;AAvBY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;qCAG4B,sCAAY;QACH,gDAAqB;QAChB,sDAA4B;GAJtE,oBAAoB,CAuBhC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { PropertyService } from '@servicelabsco/nestjs-utility-services';
|
|
2
|
+
import { EmailNotificationPayloadDto } from '../dtos/email.notification.payload.dto';
|
|
3
|
+
export declare class ApplyEmailTestRedirect {
|
|
4
|
+
static process(payload: EmailNotificationPayloadDto, propertyService?: PropertyService): Promise<boolean>;
|
|
5
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ApplyEmailTestRedirect = void 0;
|
|
4
|
+
class ApplyEmailTestRedirect {
|
|
5
|
+
static async process(payload, propertyService) {
|
|
6
|
+
if (!propertyService)
|
|
7
|
+
return false;
|
|
8
|
+
const value = await propertyService.get('email.test.redirect.to', null);
|
|
9
|
+
const redirect = typeof value === 'string' ? value.trim() : '';
|
|
10
|
+
if (!redirect)
|
|
11
|
+
return false;
|
|
12
|
+
payload.to = [redirect];
|
|
13
|
+
payload.cc = [];
|
|
14
|
+
payload.bcc = [];
|
|
15
|
+
payload.metadata = { ...payload.metadata, test_redirect: true };
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.ApplyEmailTestRedirect = ApplyEmailTestRedirect;
|
|
20
|
+
//# sourceMappingURL=apply.email.test.redirect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.email.test.redirect.js","sourceRoot":"","sources":["../../../src/access/libraries/apply.email.test.redirect.ts"],"names":[],"mappings":";;;AAQA,MAAa,sBAAsB;IAS/B,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAoC,EAAE,eAAiC;QACxF,IAAI,CAAC,eAAe;YAAE,OAAO,KAAK,CAAC;QAEnC,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC;QACxE,MAAM,QAAQ,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,IAAI,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAE5B,OAAO,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxB,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;QAChB,OAAO,CAAC,GAAG,GAAG,EAAE,CAAC;QACjB,OAAO,CAAC,QAAQ,GAAG,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;QAChE,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAtBD,wDAsBC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { BusinessEmailEntity } from '../entities/business.email.entity';
|
|
2
|
+
import { HandleEmithookEmailJob } from '../jobs/handle.emithook.email.job';
|
|
3
|
+
import { EmithookService } from '../services/emithook.service';
|
|
4
|
+
export declare class FetchEmithookMailboxMessages {
|
|
5
|
+
private readonly emithookService;
|
|
6
|
+
private readonly handleEmithookEmailJob;
|
|
7
|
+
constructor(emithookService: EmithookService, handleEmithookEmailJob: HandleEmithookEmailJob);
|
|
8
|
+
process(mailbox: BusinessEmailEntity, since: Date): Promise<number>;
|
|
9
|
+
private envelope;
|
|
10
|
+
private isBefore;
|
|
11
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FetchEmithookMailboxMessages = void 0;
|
|
4
|
+
const typeorm_1 = require("typeorm");
|
|
5
|
+
const email_message_entity_1 = require("../entities/email.message.entity");
|
|
6
|
+
const MAX_PAGES = 20;
|
|
7
|
+
class FetchEmithookMailboxMessages {
|
|
8
|
+
constructor(emithookService, handleEmithookEmailJob) {
|
|
9
|
+
this.emithookService = emithookService;
|
|
10
|
+
this.handleEmithookEmailJob = handleEmithookEmailJob;
|
|
11
|
+
}
|
|
12
|
+
async process(mailbox, since) {
|
|
13
|
+
let stored = 0;
|
|
14
|
+
let cursor;
|
|
15
|
+
for (let pages = 0; pages < MAX_PAGES; pages++) {
|
|
16
|
+
const page = await this.emithookService.listMessages(mailbox.identifier, cursor);
|
|
17
|
+
const rows = page.data || [];
|
|
18
|
+
if (!rows.length)
|
|
19
|
+
return stored;
|
|
20
|
+
for (const row of rows) {
|
|
21
|
+
if (this.isBefore(row.received_at, since))
|
|
22
|
+
return stored;
|
|
23
|
+
if (!row.message_id)
|
|
24
|
+
continue;
|
|
25
|
+
const existing = await email_message_entity_1.EmailMessageEntity.findOne({
|
|
26
|
+
where: { email_id: mailbox.id, identifier: row.message_id, deleted_at: (0, typeorm_1.IsNull)() },
|
|
27
|
+
});
|
|
28
|
+
if (existing?.id)
|
|
29
|
+
continue;
|
|
30
|
+
await this.handleEmithookEmailJob.handle(this.envelope(mailbox, row));
|
|
31
|
+
stored += 1;
|
|
32
|
+
}
|
|
33
|
+
if (!page.next_cursor)
|
|
34
|
+
return stored;
|
|
35
|
+
cursor = page.next_cursor;
|
|
36
|
+
}
|
|
37
|
+
global.console.warn(`emithook inbox fetch stopped after ${MAX_PAGES} pages for ${mailbox.identifier}`);
|
|
38
|
+
return stored;
|
|
39
|
+
}
|
|
40
|
+
envelope(mailbox, row) {
|
|
41
|
+
return {
|
|
42
|
+
version: 2,
|
|
43
|
+
metadata: { source: 'email', identifier: mailbox.identifier, event_id: row.id, name: mailbox.email },
|
|
44
|
+
data: { body: { message_id: row.message_id }, headers: {}, queries: {} },
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
isBefore(receivedAt, since) {
|
|
48
|
+
if (!receivedAt)
|
|
49
|
+
return false;
|
|
50
|
+
const received = new Date(receivedAt);
|
|
51
|
+
if (Number.isNaN(received.getTime()))
|
|
52
|
+
return false;
|
|
53
|
+
return received < since;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.FetchEmithookMailboxMessages = FetchEmithookMailboxMessages;
|
|
57
|
+
//# sourceMappingURL=fetch.emithook.mailbox.messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.emithook.mailbox.messages.js","sourceRoot":"","sources":["../../../src/access/libraries/fetch.emithook.mailbox.messages.ts"],"names":[],"mappings":";;;AAAA,qCAAiC;AAGjC,2EAAsE;AAMtE,MAAM,SAAS,GAAG,EAAE,CAAC;AAOrB,MAAa,4BAA4B;IACrC,YACqB,eAAgC,EAChC,sBAA8C;QAD9C,oBAAe,GAAf,eAAe,CAAiB;QAChC,2BAAsB,GAAtB,sBAAsB,CAAwB;IAChE,CAAC;IASJ,KAAK,CAAC,OAAO,CAAC,OAA4B,EAAE,KAAW;QACnD,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,MAAc,CAAC;QAEnB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC;YAC7C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;YACjF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO,MAAM,CAAC;YAEhC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACrB,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC;oBAAE,OAAO,MAAM,CAAC;gBACzD,IAAI,CAAC,GAAG,CAAC,UAAU;oBAAE,SAAS;gBAE9B,MAAM,QAAQ,GAAG,MAAM,yCAAkB,CAAC,OAAO,CAAC;oBAC9C,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,IAAA,gBAAM,GAAE,EAAE;iBACpF,CAAC,CAAC;gBACH,IAAI,QAAQ,EAAE,EAAE;oBAAE,SAAS;gBAE3B,MAAM,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;gBACtE,MAAM,IAAI,CAAC,CAAC;YAChB,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,WAAW;gBAAE,OAAO,MAAM,CAAC;YACrC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;QAC9B,CAAC;QAED,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,sCAAsC,SAAS,cAAc,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAEvG,OAAO,MAAM,CAAC;IAClB,CAAC;IAEO,QAAQ,CAAC,OAA4B,EAAE,GAAyC;QACpF,OAAO;YACH,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,EAAS;YAC3G,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;SAC3E,CAAC;IACN,CAAC;IAEO,QAAQ,CAAC,UAAkB,EAAE,KAAW;QAC5C,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC;QACtC,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YAAE,OAAO,KAAK,CAAC;QAEnD,OAAO,QAAQ,GAAG,KAAK,CAAC;IAC5B,CAAC;CACJ;AA3DD,oEA2DC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { InternalServerConnectService } from '@servicelabsco/nestjs-utility-services';
|
|
2
|
+
import { BusinessEmailEntity } from '../entities/business.email.entity';
|
|
3
|
+
import { ProcessServerEmailJob } from '../jobs/process.server.email.job';
|
|
4
|
+
export declare class FetchMetaMailboxMessages {
|
|
5
|
+
private readonly internalServerConnectService;
|
|
6
|
+
private readonly processServerEmailJob;
|
|
7
|
+
constructor(internalServerConnectService: InternalServerConnectService, processServerEmailJob: ProcessServerEmailJob);
|
|
8
|
+
process(mailbox: BusinessEmailEntity, date: Date): Promise<number>;
|
|
9
|
+
private handleMessage;
|
|
10
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FetchMetaMailboxMessages = void 0;
|
|
4
|
+
const nestjs_utility_services_1 = require("@servicelabsco/nestjs-utility-services");
|
|
5
|
+
const email_message_entity_1 = require("../entities/email.message.entity");
|
|
6
|
+
class FetchMetaMailboxMessages {
|
|
7
|
+
constructor(internalServerConnectService, processServerEmailJob) {
|
|
8
|
+
this.internalServerConnectService = internalServerConnectService;
|
|
9
|
+
this.processServerEmailJob = processServerEmailJob;
|
|
10
|
+
}
|
|
11
|
+
async process(mailbox, date) {
|
|
12
|
+
const day = nestjs_utility_services_1.DateUtil.getDateInFormat(date);
|
|
13
|
+
const response = await this.internalServerConnectService.get('meta', `email/${mailbox.meta_server_id}/messages?day=${day}`);
|
|
14
|
+
const messages = response?.data || [];
|
|
15
|
+
let queued = 0;
|
|
16
|
+
for (const message of messages) {
|
|
17
|
+
const dispatched = await this.handleMessage(mailbox, message);
|
|
18
|
+
if (dispatched)
|
|
19
|
+
queued += 1;
|
|
20
|
+
}
|
|
21
|
+
return queued;
|
|
22
|
+
}
|
|
23
|
+
async handleMessage(mailbox, message) {
|
|
24
|
+
const identifier = message?.identifier;
|
|
25
|
+
if (!identifier)
|
|
26
|
+
return false;
|
|
27
|
+
const existing = await email_message_entity_1.EmailMessageEntity.findOne({ where: { email_id: mailbox.id, identifier } });
|
|
28
|
+
if (existing)
|
|
29
|
+
return false;
|
|
30
|
+
await this.processServerEmailJob.dispatch(message?.id);
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.FetchMetaMailboxMessages = FetchMetaMailboxMessages;
|
|
35
|
+
//# sourceMappingURL=fetch.meta.mailbox.messages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.meta.mailbox.messages.js","sourceRoot":"","sources":["../../../src/access/libraries/fetch.meta.mailbox.messages.ts"],"names":[],"mappings":";;;AAAA,oFAAgG;AAEhG,2EAAsE;AAQtE,MAAa,wBAAwB;IACjC,YACqB,4BAA0D,EAC1D,qBAA4C;QAD5C,iCAA4B,GAA5B,4BAA4B,CAA8B;QAC1D,0BAAqB,GAArB,qBAAqB,CAAuB;IAC9D,CAAC;IAOJ,KAAK,CAAC,OAAO,CAAC,OAA4B,EAAE,IAAU;QAClD,MAAM,GAAG,GAAG,kCAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC,cAAc,iBAAiB,GAAG,EAAE,CAAC,CAAC;QAE5H,MAAM,QAAQ,GAAyB,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC;QAC5D,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC7B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9D,IAAI,UAAU;gBAAE,MAAM,IAAI,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,MAAM,CAAC;IAClB,CAAC;IAKO,KAAK,CAAC,aAAa,CAAC,OAA4B,EAAE,OAA2B;QACjF,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,CAAC;QACvC,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAE9B,MAAM,QAAQ,GAAG,MAAM,yCAAkB,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;QACnG,IAAI,QAAQ;YAAE,OAAO,KAAK,CAAC;QAE3B,MAAM,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC;IAChB,CAAC;CACJ;AAvCD,4DAuCC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export * from './apply.email.test.redirect';
|
|
1
2
|
export * from './apply.menu.layout';
|
|
2
3
|
export * from './apply.notification.preferences';
|
|
3
4
|
export * from './assert.safe.sql.fragment';
|
|
@@ -10,6 +11,8 @@ export * from './delete.business.property';
|
|
|
10
11
|
export * from './evaluate.email.rule';
|
|
11
12
|
export * from './execute.business.script';
|
|
12
13
|
export * from './extract.client.credentials';
|
|
14
|
+
export * from './fetch.emithook.mailbox.messages';
|
|
15
|
+
export * from './fetch.meta.mailbox.messages';
|
|
13
16
|
export * from './load.notification.preference.context';
|
|
14
17
|
export * from './notification.type.catalogue';
|
|
15
18
|
export * from './oauth.pkce';
|
|
@@ -110,6 +113,7 @@ export * from './process.zoho.integration';
|
|
|
110
113
|
export * from './read.eml.attachments';
|
|
111
114
|
export * from './reconcile.emithook.email.status';
|
|
112
115
|
export * from './record.emithook.email.events';
|
|
116
|
+
export * from './redact.email.log';
|
|
113
117
|
export * from './report.view.enablement';
|
|
114
118
|
export * from './report.view.query.compiler';
|
|
115
119
|
export * from './resolve.client.ip';
|
|
@@ -14,6 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./apply.email.test.redirect"), exports);
|
|
17
18
|
__exportStar(require("./apply.menu.layout"), exports);
|
|
18
19
|
__exportStar(require("./apply.notification.preferences"), exports);
|
|
19
20
|
__exportStar(require("./assert.safe.sql.fragment"), exports);
|
|
@@ -26,6 +27,8 @@ __exportStar(require("./delete.business.property"), exports);
|
|
|
26
27
|
__exportStar(require("./evaluate.email.rule"), exports);
|
|
27
28
|
__exportStar(require("./execute.business.script"), exports);
|
|
28
29
|
__exportStar(require("./extract.client.credentials"), exports);
|
|
30
|
+
__exportStar(require("./fetch.emithook.mailbox.messages"), exports);
|
|
31
|
+
__exportStar(require("./fetch.meta.mailbox.messages"), exports);
|
|
29
32
|
__exportStar(require("./load.notification.preference.context"), exports);
|
|
30
33
|
__exportStar(require("./notification.type.catalogue"), exports);
|
|
31
34
|
__exportStar(require("./oauth.pkce"), exports);
|
|
@@ -126,6 +129,7 @@ __exportStar(require("./process.zoho.integration"), exports);
|
|
|
126
129
|
__exportStar(require("./read.eml.attachments"), exports);
|
|
127
130
|
__exportStar(require("./reconcile.emithook.email.status"), exports);
|
|
128
131
|
__exportStar(require("./record.emithook.email.events"), exports);
|
|
132
|
+
__exportStar(require("./redact.email.log"), exports);
|
|
129
133
|
__exportStar(require("./report.view.enablement"), exports);
|
|
130
134
|
__exportStar(require("./report.view.query.compiler"), exports);
|
|
131
135
|
__exportStar(require("./resolve.client.ip"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/access/libraries/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAGA,sDAAoC;AACpC,mEAAiD;AACjD,6DAA2C;AAC3C,oEAAkD;AAClD,0DAAwC;AACxC,4DAA0C;AAC1C,gEAA8C;AAC9C,4CAA0B;AAC1B,6DAA2C;AAC3C,wDAAsC;AACtC,4DAA0C;AAC1C,+DAA6C;AAC7C,yEAAuD;AACvD,gEAA8C;AAC9C,+CAA6B;AAC7B,8DAA4C;AAC5C,+DAA6C;AAC7C,6DAA2C;AAC3C,6DAA2C;AAC3C,4DAA0C;AAC1C,6DAA2C;AAC3C,kEAAgD;AAChD,6DAA2C;AAC3C,mEAAiD;AACjD,gEAA8C;AAC9C,sEAAoD;AACpD,sEAAoD;AACpD,yEAAuD;AACvD,0FAAwE;AACxE,mEAAiD;AACjD,mEAAiD;AACjD,iEAA+C;AAC/C,qEAAmD;AACnD,iEAA+C;AAC/C,iEAA+C;AAC/C,+DAA6C;AAC7C,qEAAmD;AACnD,uFAAqE;AACrE,sEAAoD;AACpD,6DAA2C;AAC3C,6DAA2C;AAC3C,6DAA2C;AAC3C,6DAA2C;AAC3C,gEAA8C;AAC9C,gEAA8C;AAC9C,wDAAsC;AACtC,8DAA4C;AAC5C,uEAAqD;AACrD,+DAA6C;AAC7C,kEAAgD;AAChD,8DAA4C;AAC5C,gEAA8C;AAC9C,kEAAgD;AAChD,6DAA2C;AAC3C,wDAAsC;AACtC,oDAAkC;AAClC,2DAAyC;AACzC,8DAA4C;AAC5C,gEAA8C;AAC9C,sEAAoD;AACpD,+DAA6C;AAC7C,4DAA0C;AAC1C,4DAA0C;AAC1C,kEAAgD;AAChD,+DAA6C;AAC7C,+DAA6C;AAC7C,mEAAiD;AACjD,kEAAgD;AAChD,kEAAgD;AAChD,6DAA2C;AAC3C,4DAA0C;AAC1C,0DAAwC;AACxC,8DAA4C;AAC5C,kEAAgD;AAChD,4DAA0C;AAC1C,6DAA2C;AAC3C,6DAA2C;AAC3C,kEAAgD;AAChD,kEAAgD;AAChD,6DAA2C;AAC3C,0DAAwC;AACxC,kEAAgD;AAChD,+DAA6C;AAC7C,6DAA2C;AAC3C,6DAA2C;AAC3C,0DAAwC;AACxC,0DAAwC;AACxC,yDAAuC;AACvC,4DAA0C;AAC1C,iEAA+C;AAC/C,yDAAuC;AACvC,mEAAiD;AACjD,mEAAiD;AACjD,4DAA0C;AAC1C,wDAAsC;AACtC,8DAA4C;AAC5C,qEAAmD;AACnD,oEAAkD;AAClD,kEAAgD;AAChD,uEAAqD;AACrD,kEAAgD;AAChD,8DAA4C;AAC5C,0DAAwC;AACxC,sDAAoC;AACpC,gEAA8C;AAC9C,mEAAiD;AACjD,iEAA+C;AAC/C,6DAA2C;AAC3C,6DAA2C;AAC3C,yDAAuC;AACvC,oEAAkD;AAClD,iEAA+C;AAC/C,2DAAyC;AACzC,+DAA6C;AAC7C,sDAAoC;AACpC,kEAAgD;AAChD,oEAAkD;AAClD,6DAA2C;AAC3C,0DAAwC;AACxC,gEAA8C;AAC9C,4DAA0C;AAC1C,iEAA+C;AAC/C,0DAAwC;AACxC,oEAAkD;AAClD,oEAAkD;AAClD,oEAAkD;AAClD,qEAAmD;AACnD,yDAAuC;AACvC,uEAAqD;AACrD,sDAAoC;AACpC,0DAAwC;AACxC,kDAAgC;AAChC,0DAAwC;AACxC,kDAAgC;AAChC,4DAA0C;AAC1C,yDAAuC;AACvC,8DAA4C;AAC5C,qDAAmC;AACnC,+DAA6C"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/access/libraries/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAGA,8DAA4C;AAC5C,sDAAoC;AACpC,mEAAiD;AACjD,6DAA2C;AAC3C,oEAAkD;AAClD,0DAAwC;AACxC,4DAA0C;AAC1C,gEAA8C;AAC9C,4CAA0B;AAC1B,6DAA2C;AAC3C,wDAAsC;AACtC,4DAA0C;AAC1C,+DAA6C;AAC7C,oEAAkD;AAClD,gEAA8C;AAC9C,yEAAuD;AACvD,gEAA8C;AAC9C,+CAA6B;AAC7B,8DAA4C;AAC5C,+DAA6C;AAC7C,6DAA2C;AAC3C,6DAA2C;AAC3C,4DAA0C;AAC1C,6DAA2C;AAC3C,kEAAgD;AAChD,6DAA2C;AAC3C,mEAAiD;AACjD,gEAA8C;AAC9C,sEAAoD;AACpD,sEAAoD;AACpD,yEAAuD;AACvD,0FAAwE;AACxE,mEAAiD;AACjD,mEAAiD;AACjD,iEAA+C;AAC/C,qEAAmD;AACnD,iEAA+C;AAC/C,iEAA+C;AAC/C,+DAA6C;AAC7C,qEAAmD;AACnD,uFAAqE;AACrE,sEAAoD;AACpD,6DAA2C;AAC3C,6DAA2C;AAC3C,6DAA2C;AAC3C,6DAA2C;AAC3C,gEAA8C;AAC9C,gEAA8C;AAC9C,wDAAsC;AACtC,8DAA4C;AAC5C,uEAAqD;AACrD,+DAA6C;AAC7C,kEAAgD;AAChD,8DAA4C;AAC5C,gEAA8C;AAC9C,kEAAgD;AAChD,6DAA2C;AAC3C,wDAAsC;AACtC,oDAAkC;AAClC,2DAAyC;AACzC,8DAA4C;AAC5C,gEAA8C;AAC9C,sEAAoD;AACpD,+DAA6C;AAC7C,4DAA0C;AAC1C,4DAA0C;AAC1C,kEAAgD;AAChD,+DAA6C;AAC7C,+DAA6C;AAC7C,mEAAiD;AACjD,kEAAgD;AAChD,kEAAgD;AAChD,6DAA2C;AAC3C,4DAA0C;AAC1C,0DAAwC;AACxC,8DAA4C;AAC5C,kEAAgD;AAChD,4DAA0C;AAC1C,6DAA2C;AAC3C,6DAA2C;AAC3C,kEAAgD;AAChD,kEAAgD;AAChD,6DAA2C;AAC3C,0DAAwC;AACxC,kEAAgD;AAChD,+DAA6C;AAC7C,6DAA2C;AAC3C,6DAA2C;AAC3C,0DAAwC;AACxC,0DAAwC;AACxC,yDAAuC;AACvC,4DAA0C;AAC1C,iEAA+C;AAC/C,yDAAuC;AACvC,mEAAiD;AACjD,mEAAiD;AACjD,4DAA0C;AAC1C,wDAAsC;AACtC,8DAA4C;AAC5C,qEAAmD;AACnD,oEAAkD;AAClD,kEAAgD;AAChD,uEAAqD;AACrD,kEAAgD;AAChD,8DAA4C;AAC5C,0DAAwC;AACxC,sDAAoC;AACpC,gEAA8C;AAC9C,mEAAiD;AACjD,iEAA+C;AAC/C,6DAA2C;AAC3C,6DAA2C;AAC3C,yDAAuC;AACvC,oEAAkD;AAClD,iEAA+C;AAC/C,qDAAmC;AACnC,2DAAyC;AACzC,+DAA6C;AAC7C,sDAAoC;AACpC,kEAAgD;AAChD,oEAAkD;AAClD,6DAA2C;AAC3C,0DAAwC;AACxC,gEAA8C;AAC9C,4DAA0C;AAC1C,iEAA+C;AAC/C,0DAAwC;AACxC,oEAAkD;AAClD,oEAAkD;AAClD,oEAAkD;AAClD,qEAAmD;AACnD,yDAAuC;AACvC,uEAAqD;AACrD,sDAAoC;AACpC,0DAAwC;AACxC,kDAAgC;AAChC,0DAAwC;AACxC,kDAAgC;AAChC,4DAA0C;AAC1C,yDAAuC;AACvC,8DAA4C;AAC5C,qDAAmC;AACnC,+DAA6C"}
|
|
@@ -15,18 +15,22 @@ export declare class ProcessEmailNotification {
|
|
|
15
15
|
private knownUserAddress;
|
|
16
16
|
constructor(mailService: MailService, propertyService?: PropertyService, remoteRequestService?: RemoteRequestService, emithookService?: EmithookService, businessPropertyService?: BusinessPropertyService);
|
|
17
17
|
process(payload: EmailNotificationPayloadDto): Promise<MailLogEntity>;
|
|
18
|
+
private applyTestRedirect;
|
|
18
19
|
applyNotificationPreferences(): Promise<ResolveNotificationRecipientsResultInterface>;
|
|
19
20
|
private getCheckRecipients;
|
|
20
21
|
private getKnownUserAddress;
|
|
21
22
|
private sanitize;
|
|
22
23
|
private logSuppressed;
|
|
23
24
|
sendThroughEmithook(): Promise<EmithookTemplateEmailResultInterface | undefined>;
|
|
25
|
+
private getRedactor;
|
|
24
26
|
private getLogMetadata;
|
|
25
27
|
private hasLocalTemplate;
|
|
26
28
|
setBusinessTemplateRecipient(): Promise<void>;
|
|
27
29
|
setPreferencePayload(): Promise<void>;
|
|
28
30
|
private setTemplate;
|
|
29
31
|
private sendEmail;
|
|
32
|
+
private getLogMailService;
|
|
33
|
+
private setLogSubject;
|
|
30
34
|
private setLogBusiness;
|
|
31
35
|
private setBody;
|
|
32
36
|
private setSubject;
|
|
@@ -9,7 +9,9 @@ const email_style_entity_1 = require("../entities/email.style.entity");
|
|
|
9
9
|
const email_template_log_entity_1 = require("../entities/email.template.log.entity");
|
|
10
10
|
const email_template_recipient_entity_1 = require("../entities/email.template.recipient.entity");
|
|
11
11
|
const notification_channel_type_enum_1 = require("../enums/notification.channel.type.enum");
|
|
12
|
+
const apply_email_test_redirect_1 = require("./apply.email.test.redirect");
|
|
12
13
|
const apply_notification_preferences_1 = require("./apply.notification.preferences");
|
|
14
|
+
const redact_email_log_1 = require("./redact.email.log");
|
|
13
15
|
const resolve_emithook_template_key_1 = require("./resolve.emithook.template.key");
|
|
14
16
|
const sanitize_email_addresses_1 = require("./sanitize.email.addresses");
|
|
15
17
|
const send_emithook_template_email_1 = require("./send.emithook.template.email");
|
|
@@ -26,28 +28,36 @@ class ProcessEmailNotification {
|
|
|
26
28
|
this.init();
|
|
27
29
|
this.payload = payload;
|
|
28
30
|
this.knownUserAddress = this.getKnownUserAddress();
|
|
29
|
-
|
|
31
|
+
if (!this.payload.essential)
|
|
32
|
+
await this.setPreferencePayload();
|
|
30
33
|
const templateResponse = await this.setTemplate(payload);
|
|
31
34
|
if (!templateResponse)
|
|
32
35
|
return;
|
|
33
36
|
this.template = templateResponse;
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
37
|
+
if (!this.payload.essential) {
|
|
38
|
+
await this.setBusinessTemplateRecipient();
|
|
39
|
+
const check = await this.applyNotificationPreferences();
|
|
40
|
+
if (!check.send)
|
|
41
|
+
return this.logSuppressed(check);
|
|
42
|
+
}
|
|
43
|
+
await this.applyTestRedirect();
|
|
38
44
|
const emithook = await this.sendThroughEmithook();
|
|
39
45
|
if (emithook?.sent)
|
|
40
46
|
return emithook.log;
|
|
41
47
|
if (emithook)
|
|
42
48
|
this.payload.metadata = { ...this.payload.metadata, emithook_fallback: emithook.reason };
|
|
43
49
|
if (!this.hasLocalTemplate()) {
|
|
44
|
-
|
|
50
|
+
const refused = emithook ? `; Emithook refused it: ${emithook.reason}` : '';
|
|
51
|
+
global.console.error(`Email template ${this.payload.template} has no local template${refused}`);
|
|
45
52
|
return;
|
|
46
53
|
}
|
|
47
54
|
await this.setBody();
|
|
48
55
|
await this.setSubject();
|
|
49
56
|
return this.sendEmail();
|
|
50
57
|
}
|
|
58
|
+
async applyTestRedirect() {
|
|
59
|
+
await apply_email_test_redirect_1.ApplyEmailTestRedirect.process(this.payload, this.propertyService);
|
|
60
|
+
}
|
|
51
61
|
async applyNotificationPreferences() {
|
|
52
62
|
const recipients = this.getCheckRecipients();
|
|
53
63
|
if (!recipients.some((r) => r.role === 'to'))
|
|
@@ -100,7 +110,7 @@ class ProcessEmailNotification {
|
|
|
100
110
|
try {
|
|
101
111
|
const log = access_mail_log_entity_1.AccessMailLogEntity.create({
|
|
102
112
|
business_id: this.payload.business_id,
|
|
103
|
-
subject: nestjs_utility_services_1.PlatformUtility.compileHandlebar(this.template?.subject || '', this.payload.data || {}),
|
|
113
|
+
subject: this.getRedactor().text(nestjs_utility_services_1.PlatformUtility.compileHandlebar(this.template?.subject || '', this.payload.data || {})),
|
|
104
114
|
processed_on: new Date(),
|
|
105
115
|
attributes: {
|
|
106
116
|
metadata,
|
|
@@ -136,7 +146,7 @@ class ProcessEmailNotification {
|
|
|
136
146
|
to,
|
|
137
147
|
cc: this.sanitize(this.payload.cc),
|
|
138
148
|
bcc: this.sanitize(this.payload.bcc),
|
|
139
|
-
from: this.payload.from,
|
|
149
|
+
from: this.payload.emithook_from || this.payload.from,
|
|
140
150
|
business_id: this.payload.business_id,
|
|
141
151
|
replyTo: this.payload.replyTo,
|
|
142
152
|
template: key,
|
|
@@ -145,8 +155,12 @@ class ProcessEmailNotification {
|
|
|
145
155
|
files: this.payload.files,
|
|
146
156
|
subject: nestjs_utility_services_1.PlatformUtility.compileHandlebar(this.template?.subject || '', this.payload.data || {}),
|
|
147
157
|
metadata,
|
|
158
|
+
redact: this.payload.template_redact,
|
|
148
159
|
});
|
|
149
160
|
}
|
|
161
|
+
getRedactor() {
|
|
162
|
+
return new redact_email_log_1.RedactEmailLog(this.payload?.template_redact, this.payload?.template_data);
|
|
163
|
+
}
|
|
150
164
|
getLogMetadata() {
|
|
151
165
|
const identifier = this.template?.identifier || this.payload.template;
|
|
152
166
|
if (!identifier)
|
|
@@ -230,7 +244,7 @@ class ProcessEmailNotification {
|
|
|
230
244
|
};
|
|
231
245
|
let log;
|
|
232
246
|
try {
|
|
233
|
-
log = await this.
|
|
247
|
+
log = await this.getLogMailService().send(options, metadata);
|
|
234
248
|
}
|
|
235
249
|
catch (error) {
|
|
236
250
|
const message = error instanceof Error ? error.message : String(error);
|
|
@@ -238,8 +252,35 @@ class ProcessEmailNotification {
|
|
|
238
252
|
return;
|
|
239
253
|
}
|
|
240
254
|
await this.setLogBusiness(log);
|
|
255
|
+
await this.setLogSubject(log);
|
|
241
256
|
return log;
|
|
242
257
|
}
|
|
258
|
+
getLogMailService() {
|
|
259
|
+
const redact = this.getRedactor();
|
|
260
|
+
if (redact.isEmpty())
|
|
261
|
+
return this.mailService;
|
|
262
|
+
const mailService = this.mailService;
|
|
263
|
+
return Object.create(mailService, {
|
|
264
|
+
getBody: {
|
|
265
|
+
value: (options) => mailService.getBody({ ...options, html: redact.text(options.html), text: redact.text(options.text) }),
|
|
266
|
+
},
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
async setLogSubject(log) {
|
|
270
|
+
if (!log?.id || typeof log.subject !== 'string')
|
|
271
|
+
return;
|
|
272
|
+
const subject = this.getRedactor().text(log.subject);
|
|
273
|
+
if (subject === log.subject)
|
|
274
|
+
return;
|
|
275
|
+
try {
|
|
276
|
+
await access_mail_log_entity_1.AccessMailLogEntity.update(log.id, { subject });
|
|
277
|
+
log.subject = subject;
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
281
|
+
global.console.error(`Mail log ${log.id} subject not redacted: ${message}`);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
243
284
|
async setLogBusiness(log) {
|
|
244
285
|
if (!log?.id || !this.payload.business_id)
|
|
245
286
|
return;
|
|
@@ -299,12 +340,13 @@ class ProcessEmailNotification {
|
|
|
299
340
|
return res.data?.html || res.data;
|
|
300
341
|
}
|
|
301
342
|
async logEmailTemplate(response, payload) {
|
|
343
|
+
const redact = this.getRedactor();
|
|
302
344
|
const log = email_template_log_entity_1.EmailTemplateLogEntity.create({
|
|
303
345
|
template_id: this.template?.id,
|
|
304
|
-
payload: payload,
|
|
346
|
+
payload: redact.json(payload),
|
|
305
347
|
is_success: response.success,
|
|
306
348
|
attempted_at: new Date(),
|
|
307
|
-
response_body: { response: response.data },
|
|
349
|
+
response_body: { response: redact.json(response.data) },
|
|
308
350
|
});
|
|
309
351
|
await log.save();
|
|
310
352
|
}
|