@servicelabsco/slabs-access-manager 2.0.14 → 2.0.15
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/alias.mapping.controller.d.ts +16 -0
- package/dist/access/controllers/alias.mapping.controller.js +93 -0
- package/dist/access/controllers/alias.mapping.controller.js.map +1 -0
- package/dist/access/controllers/business.email.controller.d.ts +2 -1
- package/dist/access/controllers/business.email.controller.js +6 -3
- package/dist/access/controllers/business.email.controller.js.map +1 -1
- package/dist/access/controllers/emithook.controller.d.ts +12 -0
- package/dist/access/controllers/emithook.controller.js +49 -0
- package/dist/access/controllers/emithook.controller.js.map +1 -0
- package/dist/access/controllers/index.d.ts +2 -0
- package/dist/access/controllers/index.js +2 -0
- package/dist/access/controllers/index.js.map +1 -1
- package/dist/access/dtos/add.alias.mapping.dto.d.ts +7 -0
- package/dist/access/dtos/add.alias.mapping.dto.js +49 -0
- package/dist/access/dtos/add.alias.mapping.dto.js.map +1 -0
- package/dist/access/dtos/add.business.email.dto.d.ts +4 -0
- package/dist/access/dtos/add.business.email.dto.js +34 -0
- package/dist/access/dtos/add.business.email.dto.js.map +1 -0
- package/dist/access/dtos/business.email.attributes.dto.d.ts +1 -0
- package/dist/access/dtos/business.email.attributes.dto.js +6 -0
- package/dist/access/dtos/business.email.attributes.dto.js.map +1 -1
- package/dist/access/dtos/emithook.envelope.dto.d.ts +38 -0
- package/dist/access/dtos/emithook.envelope.dto.js +16 -0
- package/dist/access/dtos/emithook.envelope.dto.js.map +1 -0
- package/dist/access/dtos/index.d.ts +4 -0
- package/dist/access/dtos/index.js +4 -0
- package/dist/access/dtos/index.js.map +1 -1
- package/dist/access/dtos/search.alias.mapping.dto.d.ts +7 -0
- package/dist/access/dtos/search.alias.mapping.dto.js +51 -0
- package/dist/access/dtos/search.alias.mapping.dto.js.map +1 -0
- package/dist/access/entities/alias.mapping.entity.d.ts +11 -0
- package/dist/access/entities/alias.mapping.entity.js +51 -0
- package/dist/access/entities/alias.mapping.entity.js.map +1 -0
- package/dist/access/entities/business.email.entity.d.ts +1 -0
- package/dist/access/entities/business.email.entity.js +4 -0
- package/dist/access/entities/business.email.entity.js.map +1 -1
- package/dist/access/entities/index.d.ts +1 -0
- package/dist/access/entities/index.js +1 -0
- package/dist/access/entities/index.js.map +1 -1
- package/dist/access/enums/business.email.type.enum.d.ts +3 -0
- package/dist/access/enums/business.email.type.enum.js +8 -0
- package/dist/access/enums/business.email.type.enum.js.map +1 -0
- package/dist/access/enums/index.d.ts +1 -0
- package/dist/access/enums/index.js +1 -0
- package/dist/access/enums/index.js.map +1 -1
- package/dist/access/es6.classes.d.ts +21 -7
- package/dist/access/es6.classes.js +35 -0
- package/dist/access/es6.classes.js.map +1 -1
- package/dist/access/index.d.ts +1 -0
- package/dist/access/index.js +1 -0
- package/dist/access/index.js.map +1 -1
- package/dist/access/interfaces/alias.lookup.options.interface.d.ts +4 -0
- package/dist/access/interfaces/alias.lookup.options.interface.js +3 -0
- package/dist/access/interfaces/alias.lookup.options.interface.js.map +1 -0
- package/dist/access/interfaces/alias.mapping.input.interface.d.ts +7 -0
- package/dist/access/interfaces/alias.mapping.input.interface.js +3 -0
- package/dist/access/interfaces/alias.mapping.input.interface.js.map +1 -0
- package/dist/access/interfaces/alias.search.match.interface.d.ts +8 -0
- package/dist/access/interfaces/alias.search.match.interface.js +3 -0
- package/dist/access/interfaces/alias.search.match.interface.js.map +1 -0
- package/dist/access/interfaces/alias.search.query.interface.d.ts +7 -0
- package/dist/access/interfaces/alias.search.query.interface.js +3 -0
- package/dist/access/interfaces/alias.search.query.interface.js.map +1 -0
- package/dist/access/interfaces/emithook.email.body.interface.d.ts +24 -0
- package/dist/access/interfaces/emithook.email.body.interface.js +3 -0
- package/dist/access/interfaces/emithook.email.body.interface.js.map +1 -0
- package/dist/access/interfaces/inbound.email.message.interface.d.ts +31 -0
- package/dist/access/interfaces/inbound.email.message.interface.js +3 -0
- package/dist/access/interfaces/inbound.email.message.interface.js.map +1 -0
- package/dist/access/interfaces/index.d.ts +6 -0
- package/dist/access/interfaces/index.js +23 -0
- package/dist/access/interfaces/index.js.map +1 -0
- package/dist/access/jobs/handle.emithook.email.job.d.ts +27 -0
- package/dist/access/jobs/handle.emithook.email.job.js +162 -0
- package/dist/access/jobs/handle.emithook.email.job.js.map +1 -0
- package/dist/access/jobs/index.d.ts +3 -0
- package/dist/access/jobs/index.js +3 -0
- package/dist/access/jobs/index.js.map +1 -1
- package/dist/access/jobs/poll.emithook.email.inbox.job.d.ts +19 -0
- package/dist/access/jobs/poll.emithook.email.inbox.job.js +109 -0
- package/dist/access/jobs/poll.emithook.email.inbox.job.js.map +1 -0
- package/dist/access/jobs/poll.emithook.email.sqs.job.d.ts +20 -0
- package/dist/access/jobs/poll.emithook.email.sqs.job.js +83 -0
- package/dist/access/jobs/poll.emithook.email.sqs.job.js.map +1 -0
- package/dist/access/jobs/process.server.email.job.d.ts +1 -9
- package/dist/access/jobs/process.server.email.job.js +13 -105
- package/dist/access/jobs/process.server.email.job.js.map +1 -1
- 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.inbound.email.message.d.ts +21 -0
- package/dist/access/libraries/process.inbound.email.message.js +129 -0
- package/dist/access/libraries/process.inbound.email.message.js.map +1 -0
- package/dist/access/libraries/read.eml.attachments.d.ts +19 -0
- package/dist/access/libraries/read.eml.attachments.js +126 -0
- package/dist/access/libraries/read.eml.attachments.js.map +1 -0
- package/dist/access/libraries/search.alias.mappings.d.ts +12 -0
- package/dist/access/libraries/search.alias.mappings.js +46 -0
- package/dist/access/libraries/search.alias.mappings.js.map +1 -0
- package/dist/access/libraries/set.alias.mapping.d.ts +12 -0
- package/dist/access/libraries/set.alias.mapping.js +81 -0
- package/dist/access/libraries/set.alias.mapping.js.map +1 -0
- package/dist/access/services/alias.mapping.service.d.ts +9 -0
- package/dist/access/services/alias.mapping.service.js +45 -0
- package/dist/access/services/alias.mapping.service.js.map +1 -0
- package/dist/access/services/business.email.service.d.ts +5 -1
- package/dist/access/services/business.email.service.js +34 -2
- package/dist/access/services/business.email.service.js.map +1 -1
- package/dist/access/services/emithook.service.d.ts +32 -0
- package/dist/access/services/emithook.service.js +115 -0
- package/dist/access/services/emithook.service.js.map +1 -0
- package/dist/access/services/index.d.ts +2 -0
- package/dist/access/services/index.js +2 -0
- package/dist/access/services/index.js.map +1 -1
- package/dist/accessUtility/controllers/bulk.definition.controller.d.ts +5 -1
- package/dist/accessUtility/controllers/bulk.definition.controller.js +25 -8
- package/dist/accessUtility/controllers/bulk.definition.controller.js.map +1 -1
- package/dist/accessUtility/dtos/bulk.definition.script.dto.d.ts +4 -0
- package/dist/accessUtility/dtos/bulk.definition.script.dto.js +30 -0
- package/dist/accessUtility/dtos/bulk.definition.script.dto.js.map +1 -0
- package/dist/accessUtility/dtos/index.d.ts +1 -0
- package/dist/accessUtility/dtos/index.js +1 -0
- package/dist/accessUtility/dtos/index.js.map +1 -1
- package/dist/accessUtility/es6.classes.d.ts +4 -2
- package/dist/accessUtility/es6.classes.js +4 -0
- package/dist/accessUtility/es6.classes.js.map +1 -1
- package/dist/accessUtility/jobs/push.to.bulk.item.job.d.ts +2 -0
- package/dist/accessUtility/jobs/push.to.bulk.item.job.js +2 -0
- package/dist/accessUtility/jobs/push.to.bulk.item.job.js.map +1 -1
- package/dist/accessUtility/libraries/index.d.ts +1 -0
- package/dist/accessUtility/libraries/index.js +1 -0
- package/dist/accessUtility/libraries/index.js.map +1 -1
- package/dist/accessUtility/libraries/process.bulk.definition.script.d.ts +9 -0
- package/dist/accessUtility/libraries/process.bulk.definition.script.js +43 -0
- package/dist/accessUtility/libraries/process.bulk.definition.script.js.map +1 -0
- package/dist/accessUtility/libraries/read.xls.file.d.ts +4 -1
- package/dist/accessUtility/libraries/read.xls.file.js +49 -10
- package/dist/accessUtility/libraries/read.xls.file.js.map +1 -1
- package/dist/migrations/1790855763155-CreateBzAliasMappingsTable.d.ts +8 -0
- package/dist/migrations/1790855763155-CreateBzAliasMappingsTable.js +37 -0
- package/dist/migrations/1790855763155-CreateBzAliasMappingsTable.js.map +1 -0
- package/dist/migrations/1792089460727-AddIdentifierBzBusinessEmailsTable.d.ts +5 -0
- package/dist/migrations/1792089460727-AddIdentifierBzBusinessEmailsTable.js +16 -0
- package/dist/migrations/1792089460727-AddIdentifierBzBusinessEmailsTable.js.map +1 -0
- package/dist/migrations/1792091262917-AddUniqueEmailIdentifierBzEmailMessagesTable.d.ts +8 -0
- package/dist/migrations/1792091262917-AddUniqueEmailIdentifierBzEmailMessagesTable.js +30 -0
- package/dist/migrations/1792091262917-AddUniqueEmailIdentifierBzEmailMessagesTable.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,109 @@
|
|
|
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.PollEmithookEmailInboxJob = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const nestjs_utility_services_1 = require("@servicelabsco/nestjs-utility-services");
|
|
15
|
+
const typeorm_1 = require("typeorm");
|
|
16
|
+
const business_email_entity_1 = require("../entities/business.email.entity");
|
|
17
|
+
const email_message_entity_1 = require("../entities/email.message.entity");
|
|
18
|
+
const business_email_type_enum_1 = require("../enums/business.email.type.enum");
|
|
19
|
+
const emithook_service_1 = require("../services/emithook.service");
|
|
20
|
+
const handle_emithook_email_job_1 = require("./handle.emithook.email.job");
|
|
21
|
+
const DEFAULT_LOOKBACK_HOURS = 2;
|
|
22
|
+
const MAX_PAGES = 20;
|
|
23
|
+
let PollEmithookEmailInboxJob = class PollEmithookEmailInboxJob extends nestjs_utility_services_1.CommonJob {
|
|
24
|
+
constructor(queueService, emithookService, handleEmithookEmailJob) {
|
|
25
|
+
super('23303cbeb4b05aa00098a74cc25ef6af');
|
|
26
|
+
this.queueService = queueService;
|
|
27
|
+
this.emithookService = emithookService;
|
|
28
|
+
this.handleEmithookEmailJob = handleEmithookEmailJob;
|
|
29
|
+
this.noDuplicate = true;
|
|
30
|
+
this.priority = 10;
|
|
31
|
+
this.timeout = 600000;
|
|
32
|
+
}
|
|
33
|
+
async handle(payload) {
|
|
34
|
+
const hours = payload?.hours > 0 ? payload.hours : DEFAULT_LOOKBACK_HOURS;
|
|
35
|
+
const since = new Date(Date.now() - hours * 60 * 60 * 1000);
|
|
36
|
+
const mailboxes = await this.mailboxes();
|
|
37
|
+
let stored = 0;
|
|
38
|
+
for (const mailbox of mailboxes) {
|
|
39
|
+
try {
|
|
40
|
+
const count = await this.sweep(mailbox, since);
|
|
41
|
+
stored += count;
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
this.logger.error(`emithook inbox poll failed for ${mailbox.identifier} : ${error}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return stored;
|
|
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
|
+
async mailboxes() {
|
|
93
|
+
return business_email_entity_1.BusinessEmailEntity.find({
|
|
94
|
+
where: {
|
|
95
|
+
active: true,
|
|
96
|
+
identifier: (0, typeorm_1.Not)((0, typeorm_1.IsNull)()),
|
|
97
|
+
attributes: (0, typeorm_1.Raw)((column) => `${column} ->> 'type' = :type`, { type: business_email_type_enum_1.BusinessEmailTypeEnum.EMITHOOK }),
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
exports.PollEmithookEmailInboxJob = PollEmithookEmailInboxJob;
|
|
103
|
+
exports.PollEmithookEmailInboxJob = PollEmithookEmailInboxJob = __decorate([
|
|
104
|
+
(0, common_1.Injectable)(),
|
|
105
|
+
__metadata("design:paramtypes", [nestjs_utility_services_1.QueueService,
|
|
106
|
+
emithook_service_1.EmithookService,
|
|
107
|
+
handle_emithook_email_job_1.HandleEmithookEmailJob])
|
|
108
|
+
], PollEmithookEmailInboxJob);
|
|
109
|
+
//# sourceMappingURL=poll.emithook.email.inbox.job.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poll.emithook.email.inbox.job.js","sourceRoot":"","sources":["../../../src/access/jobs/poll.emithook.email.inbox.job.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { CommonJob, PropertyService, QueueService, SqsService } from '@servicelabsco/nestjs-utility-services';
|
|
2
|
+
import { HandleEmithookEmailJob } from './handle.emithook.email.job';
|
|
3
|
+
export declare class PollEmithookEmailSqsJob extends CommonJob {
|
|
4
|
+
protected readonly queueService: QueueService;
|
|
5
|
+
private readonly sqsService;
|
|
6
|
+
private readonly propertyService;
|
|
7
|
+
protected readonly handleEmithookEmailJob: HandleEmithookEmailJob;
|
|
8
|
+
protected noDuplicate: boolean;
|
|
9
|
+
protected priority: number;
|
|
10
|
+
protected timeout: number;
|
|
11
|
+
protected sqsQueue: string;
|
|
12
|
+
protected countOfMessages: number;
|
|
13
|
+
protected maxMessagePerSession: number;
|
|
14
|
+
constructor(queueService: QueueService, sqsService: SqsService, propertyService: PropertyService, handleEmithookEmailJob: HandleEmithookEmailJob);
|
|
15
|
+
handle(): Promise<number>;
|
|
16
|
+
private processMessages;
|
|
17
|
+
private processMessage;
|
|
18
|
+
private getFetchCount;
|
|
19
|
+
private deleteMessages;
|
|
20
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
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.PollEmithookEmailSqsJob = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const nestjs_utility_services_1 = require("@servicelabsco/nestjs-utility-services");
|
|
15
|
+
const handle_emithook_email_job_1 = require("./handle.emithook.email.job");
|
|
16
|
+
let PollEmithookEmailSqsJob = class PollEmithookEmailSqsJob extends nestjs_utility_services_1.CommonJob {
|
|
17
|
+
constructor(queueService, sqsService, propertyService, handleEmithookEmailJob) {
|
|
18
|
+
super('f238f9dd0611f012f55b0fc038390bdd');
|
|
19
|
+
this.queueService = queueService;
|
|
20
|
+
this.sqsService = sqsService;
|
|
21
|
+
this.propertyService = propertyService;
|
|
22
|
+
this.handleEmithookEmailJob = handleEmithookEmailJob;
|
|
23
|
+
this.noDuplicate = true;
|
|
24
|
+
this.priority = 10;
|
|
25
|
+
this.timeout = 600000;
|
|
26
|
+
this.countOfMessages = 0;
|
|
27
|
+
this.maxMessagePerSession = 300000;
|
|
28
|
+
}
|
|
29
|
+
async handle() {
|
|
30
|
+
this.countOfMessages = 0;
|
|
31
|
+
this.sqsQueue = await this.propertyService.get('sqs.emithook.email.queue');
|
|
32
|
+
if (!this.sqsQueue)
|
|
33
|
+
throw new nestjs_utility_services_1.OperationException('System property sqs.emithook.email.queue is not configured');
|
|
34
|
+
const fetchCount = this.getFetchCount();
|
|
35
|
+
while (true) {
|
|
36
|
+
const response = await this.sqsService.get(this.sqsQueue, fetchCount);
|
|
37
|
+
const messages = response?.Messages || [];
|
|
38
|
+
if (!messages.length)
|
|
39
|
+
return this.countOfMessages;
|
|
40
|
+
await this.processMessages(messages);
|
|
41
|
+
if (this.countOfMessages > this.maxMessagePerSession)
|
|
42
|
+
return this.countOfMessages;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async processMessages(messages) {
|
|
46
|
+
for (const message of messages) {
|
|
47
|
+
await this.processMessage(message);
|
|
48
|
+
++this.countOfMessages;
|
|
49
|
+
}
|
|
50
|
+
await this.deleteMessages(messages);
|
|
51
|
+
}
|
|
52
|
+
async processMessage(message) {
|
|
53
|
+
let payload;
|
|
54
|
+
try {
|
|
55
|
+
payload = JSON.parse(message.Body);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
this.logger.error(`[Processing SQS] ${this.sqsQueue} dropped a message that is not JSON : ${message.MessageId}`);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (payload?.metadata?.source === 'https')
|
|
62
|
+
return;
|
|
63
|
+
await this.handleEmithookEmailJob.dispatch(payload);
|
|
64
|
+
}
|
|
65
|
+
getFetchCount() {
|
|
66
|
+
const isFifo = this.sqsQueue.split('.').pop()?.toLowerCase() === 'fifo';
|
|
67
|
+
return isFifo ? 1 : 10;
|
|
68
|
+
}
|
|
69
|
+
async deleteMessages(messages) {
|
|
70
|
+
const receiptHandles = messages.map((message) => message.ReceiptHandle);
|
|
71
|
+
await this.sqsService.deleteBulk(this.sqsQueue, receiptHandles);
|
|
72
|
+
this.logger.log(`[Processing SQS] ${this.sqsQueue} total messages : ${this.countOfMessages}`);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
exports.PollEmithookEmailSqsJob = PollEmithookEmailSqsJob;
|
|
76
|
+
exports.PollEmithookEmailSqsJob = PollEmithookEmailSqsJob = __decorate([
|
|
77
|
+
(0, common_1.Injectable)(),
|
|
78
|
+
__metadata("design:paramtypes", [nestjs_utility_services_1.QueueService,
|
|
79
|
+
nestjs_utility_services_1.SqsService,
|
|
80
|
+
nestjs_utility_services_1.PropertyService,
|
|
81
|
+
handle_emithook_email_job_1.HandleEmithookEmailJob])
|
|
82
|
+
], PollEmithookEmailSqsJob);
|
|
83
|
+
//# sourceMappingURL=poll.emithook.email.sqs.job.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"poll.emithook.email.sqs.job.js","sourceRoot":"","sources":["../../../src/access/jobs/poll.emithook.email.sqs.job.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,13 +9,5 @@ export declare class ProcessServerEmailJob extends CommonJob {
|
|
|
9
9
|
protected noDuplicate: boolean;
|
|
10
10
|
constructor(queueService: QueueService, uploadService: UploadService, internalServerConnectService: InternalServerConnectService, syncEmailMessageMetricsJob: SyncEmailMessageMetricsJob);
|
|
11
11
|
handle(id: number): Promise<EmailMessageEntity>;
|
|
12
|
-
private
|
|
13
|
-
private setAttachments;
|
|
14
|
-
private setAttachment;
|
|
15
|
-
private setRecipients;
|
|
16
|
-
private getBody;
|
|
17
|
-
private getAttachment;
|
|
18
|
-
private getSenderId;
|
|
19
|
-
private getParentDetails;
|
|
20
|
-
private getMessageIdentifier;
|
|
12
|
+
private toInbound;
|
|
21
13
|
}
|
|
@@ -12,13 +12,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.ProcessServerEmailJob = void 0;
|
|
13
13
|
const common_1 = require("@nestjs/common");
|
|
14
14
|
const nestjs_utility_services_1 = require("@servicelabsco/nestjs-utility-services");
|
|
15
|
-
const typeorm_1 = require("typeorm");
|
|
16
15
|
const business_email_entity_1 = require("../entities/business.email.entity");
|
|
17
|
-
const
|
|
18
|
-
const email_message_entity_1 = require("../entities/email.message.entity");
|
|
19
|
-
const email_recipient_entity_1 = require("../entities/email.recipient.entity");
|
|
16
|
+
const process_inbound_email_message_1 = require("../libraries/process.inbound.email.message");
|
|
20
17
|
const sync_email_message_metrics_job_1 = require("./sync.email.message.metrics.job");
|
|
21
|
-
const PG_UNIQUE_VIOLATION = '23505';
|
|
22
18
|
let ProcessServerEmailJob = class ProcessServerEmailJob extends nestjs_utility_services_1.CommonJob {
|
|
23
19
|
constructor(queueService, uploadService, internalServerConnectService, syncEmailMessageMetricsJob) {
|
|
24
20
|
super('6dc279beaec1891635dab7b1c7e76be3');
|
|
@@ -36,106 +32,18 @@ let ProcessServerEmailJob = class ProcessServerEmailJob extends nestjs_utility_s
|
|
|
36
32
|
const email = await business_email_entity_1.BusinessEmailEntity.findOne({ where: { meta_server_id: data.email_id }, relations: ['business'] });
|
|
37
33
|
if (!email)
|
|
38
34
|
return null;
|
|
39
|
-
return this.
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
message.parent_id = parent?.parent_id || parent?.id || null;
|
|
52
|
-
try {
|
|
53
|
-
await message.save();
|
|
54
|
-
}
|
|
55
|
-
catch (e) {
|
|
56
|
-
if (e instanceof typeorm_1.QueryFailedError && e.driverError?.code === PG_UNIQUE_VIOLATION) {
|
|
57
|
-
const existing = await email_message_entity_1.EmailMessageEntity.findOne({
|
|
58
|
-
where: { email_id: email.id, identifier: payload.identifier, deleted_at: (0, typeorm_1.IsNull)() },
|
|
59
|
-
});
|
|
60
|
-
if (existing)
|
|
61
|
-
return existing;
|
|
62
|
-
}
|
|
63
|
-
throw e;
|
|
64
|
-
}
|
|
65
|
-
await this.setAttachments(email, message, payload.attachments);
|
|
66
|
-
await this.setRecipients(message, payload.recipients);
|
|
67
|
-
await this.syncEmailMessageMetricsJob.delayedDispatch(message.id);
|
|
68
|
-
return message;
|
|
69
|
-
}
|
|
70
|
-
async setAttachments(email, message, attachments) {
|
|
71
|
-
if (!Array.isArray(attachments))
|
|
72
|
-
return;
|
|
73
|
-
for (const attachment of attachments)
|
|
74
|
-
await this.setAttachment(email, message, attachment);
|
|
75
|
-
}
|
|
76
|
-
async setAttachment(email, message, attachment) {
|
|
77
|
-
try {
|
|
78
|
-
const url = await this.getAttachment(email, attachment);
|
|
79
|
-
const r = await email_attachment_entity_1.EmailAttachmentEntity.firstOrNew({ message_id: message.id, name: attachment.name });
|
|
80
|
-
r.url = url;
|
|
81
|
-
r.attributes = { ...r.attributes, size: attachment.size };
|
|
82
|
-
return r.save();
|
|
83
|
-
}
|
|
84
|
-
catch {
|
|
85
|
-
global.console.log('cannot find attachment url : ', attachment?.url);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
async setRecipients(message, recipients) {
|
|
89
|
-
const nodes = ['to', 'cc'];
|
|
90
|
-
for (const node of nodes) {
|
|
91
|
-
const records = recipients.to;
|
|
92
|
-
if (!Array.isArray(records))
|
|
93
|
-
continue;
|
|
94
|
-
for (const record of records) {
|
|
95
|
-
const r = await email_recipient_entity_1.EmailRecipientEntity.firstOrNew({ message_id: message.id, type: node, email: record.email });
|
|
96
|
-
r.attributes = { ...r.attributes, name: record.name };
|
|
97
|
-
await r.save();
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
async getBody(email, url) {
|
|
102
|
-
const originalname = `${Date.now()}.${nestjs_utility_services_1.PlatformUtility.generateRandomAlpha(6).toLowerCase()}.emailBody.html`;
|
|
103
|
-
const file = { url, originalname };
|
|
104
|
-
const params = { folder: `business/${email.business.identifier}/email/body`, acl: 'private' };
|
|
105
|
-
return this.uploadService.upload(file, params);
|
|
106
|
-
}
|
|
107
|
-
async getAttachment(email, attachment) {
|
|
108
|
-
const file = { url: attachment.url, originalname: attachment.name };
|
|
109
|
-
const params = { folder: `business/${email.business.identifier}/email/attachments`, acl: 'private' };
|
|
110
|
-
return this.uploadService.upload(file, params);
|
|
111
|
-
}
|
|
112
|
-
async getSenderId(email) {
|
|
113
|
-
const user = await nestjs_utility_services_1.UserEntity.findOne({ where: { email } });
|
|
114
|
-
return user?.id || null;
|
|
115
|
-
}
|
|
116
|
-
async getParentDetails(message) {
|
|
117
|
-
let identifiers = [];
|
|
118
|
-
const { in_reply_to, references } = message.attributes;
|
|
119
|
-
if (in_reply_to)
|
|
120
|
-
identifiers.push(in_reply_to);
|
|
121
|
-
if (references?.length)
|
|
122
|
-
identifiers = identifiers.concat(references);
|
|
123
|
-
identifiers = identifiers.filter((item) => {
|
|
124
|
-
return item?.length && item;
|
|
125
|
-
});
|
|
126
|
-
if (!identifiers.length)
|
|
127
|
-
return;
|
|
128
|
-
for (const identifier of identifiers) {
|
|
129
|
-
const parent = await email_message_entity_1.EmailMessageEntity.findOne({ where: { email_id: message.email_id, tracking_identifier: identifier } });
|
|
130
|
-
if (parent)
|
|
131
|
-
return parent;
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
getMessageIdentifier(payload) {
|
|
135
|
-
const { in_reply_to, references, message_id } = payload?.attributes || {};
|
|
136
|
-
if (!in_reply_to && references?.length === 1)
|
|
137
|
-
return references[0];
|
|
138
|
-
return message_id;
|
|
35
|
+
return new process_inbound_email_message_1.ProcessInboundEmailMessage(this.uploadService, this.syncEmailMessageMetricsJob).process(email, this.toInbound(data));
|
|
36
|
+
}
|
|
37
|
+
toInbound(data) {
|
|
38
|
+
return {
|
|
39
|
+
identifier: data.identifier,
|
|
40
|
+
from_email: data.from_email,
|
|
41
|
+
subject: data.subject,
|
|
42
|
+
body: { url: data.body },
|
|
43
|
+
recipients: data.recipients,
|
|
44
|
+
attachments: data.attachments,
|
|
45
|
+
attributes: data.attributes,
|
|
46
|
+
};
|
|
139
47
|
}
|
|
140
48
|
};
|
|
141
49
|
exports.ProcessServerEmailJob = ProcessServerEmailJob;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process.server.email.job.js","sourceRoot":"","sources":["../../../src/access/jobs/process.server.email.job.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,
|
|
1
|
+
{"version":3,"file":"process.server.email.job.js","sourceRoot":"","sources":["../../../src/access/jobs/process.server.email.job.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,oFAA8H;AAE9H,6EAAwE;AAGxE,8FAAwF;AACxF,qFAA8E;AAOvE,IAAM,qBAAqB,GAA3B,MAAM,qBAAsB,SAAQ,mCAAS;IAGhD,YACuB,YAA0B,EAC5B,aAA4B,EAC1B,4BAA0D,EAC5D,0BAAsD;QAEvE,KAAK,CAAC,kCAAkC,CAAC,CAAC;QALvB,iBAAY,GAAZ,YAAY,CAAc;QAC5B,kBAAa,GAAb,aAAa,CAAe;QAC1B,iCAA4B,GAA5B,4BAA4B,CAA8B;QAC5D,+BAA0B,GAA1B,0BAA0B,CAA4B;QANjE,gBAAW,GAAG,IAAI,CAAC;IAS7B,CAAC;IAOD,KAAK,CAAC,MAAM,CAAC,EAAU;QACnB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,EAAE,EAAE,CAAC,CAAC;QAE5F,MAAM,IAAI,GAA0B,QAAQ,EAAE,IAAI,CAAC;QACnD,IAAI,CAAC,IAAI,EAAE,QAAQ;YAAE,OAAO,IAAI,CAAC;QAEjC,MAAM,KAAK,GAAG,MAAM,2CAAmB,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAEvH,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC;QAExB,OAAO,IAAI,0DAA0B,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACpI,CAAC;IAMO,SAAS,CAAC,IAA2B;QACzC,OAAO;YACH,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE;YACxB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;SAC9B,CAAC;IACN,CAAC;CACJ,CAAA;AA7CY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;qCAK4B,sCAAY;QACb,uCAAa;QACI,sDAA4B;QAChC,2DAA0B;GAPlE,qBAAqB,CA6CjC"}
|
|
@@ -69,6 +69,7 @@ export * from './process.group.member.updation';
|
|
|
69
69
|
export * from './process.group.role.list';
|
|
70
70
|
export * from './process.gst.mapping.data';
|
|
71
71
|
export * from './process.gst.mapping.list';
|
|
72
|
+
export * from './process.inbound.email.message';
|
|
72
73
|
export * from './process.internal.notification';
|
|
73
74
|
export * from './process.listing.csv.file';
|
|
74
75
|
export * from './process.listing.order';
|
|
@@ -99,10 +100,12 @@ export * from './process.user.notification.list';
|
|
|
99
100
|
export * from './process.whatsapp.integration';
|
|
100
101
|
export * from './process.whatsapp.message';
|
|
101
102
|
export * from './process.zoho.integration';
|
|
103
|
+
export * from './read.eml.attachments';
|
|
102
104
|
export * from './report.view.enablement';
|
|
103
105
|
export * from './report.view.query.compiler';
|
|
104
106
|
export * from './resolve.client.ip';
|
|
105
107
|
export * from './sanitize.email.addresses';
|
|
108
|
+
export * from './search.alias.mappings';
|
|
106
109
|
export * from './search.developer.businesses';
|
|
107
110
|
export * from './send.email.notification';
|
|
108
111
|
export * from './send.fcm.notification';
|
|
@@ -112,6 +115,7 @@ export * from './send.slack.message.notification';
|
|
|
112
115
|
export * from './send.slack.webhook.notification.';
|
|
113
116
|
export * from './send.webhook.request';
|
|
114
117
|
export * from './send.whatsapp.message.notification';
|
|
118
|
+
export * from './set.alias.mapping';
|
|
115
119
|
export * from './set.fcm.token';
|
|
116
120
|
export * from './sync.business.user.role';
|
|
117
121
|
export * from './ui.action.businesses';
|
|
@@ -85,6 +85,7 @@ __exportStar(require("./process.group.member.updation"), exports);
|
|
|
85
85
|
__exportStar(require("./process.group.role.list"), exports);
|
|
86
86
|
__exportStar(require("./process.gst.mapping.data"), exports);
|
|
87
87
|
__exportStar(require("./process.gst.mapping.list"), exports);
|
|
88
|
+
__exportStar(require("./process.inbound.email.message"), exports);
|
|
88
89
|
__exportStar(require("./process.internal.notification"), exports);
|
|
89
90
|
__exportStar(require("./process.listing.csv.file"), exports);
|
|
90
91
|
__exportStar(require("./process.listing.order"), exports);
|
|
@@ -115,10 +116,12 @@ __exportStar(require("./process.user.notification.list"), exports);
|
|
|
115
116
|
__exportStar(require("./process.whatsapp.integration"), exports);
|
|
116
117
|
__exportStar(require("./process.whatsapp.message"), exports);
|
|
117
118
|
__exportStar(require("./process.zoho.integration"), exports);
|
|
119
|
+
__exportStar(require("./read.eml.attachments"), exports);
|
|
118
120
|
__exportStar(require("./report.view.enablement"), exports);
|
|
119
121
|
__exportStar(require("./report.view.query.compiler"), exports);
|
|
120
122
|
__exportStar(require("./resolve.client.ip"), exports);
|
|
121
123
|
__exportStar(require("./sanitize.email.addresses"), exports);
|
|
124
|
+
__exportStar(require("./search.alias.mappings"), exports);
|
|
122
125
|
__exportStar(require("./search.developer.businesses"), exports);
|
|
123
126
|
__exportStar(require("./send.email.notification"), exports);
|
|
124
127
|
__exportStar(require("./send.fcm.notification"), exports);
|
|
@@ -128,6 +131,7 @@ __exportStar(require("./send.slack.message.notification"), exports);
|
|
|
128
131
|
__exportStar(require("./send.slack.webhook.notification."), exports);
|
|
129
132
|
__exportStar(require("./send.webhook.request"), exports);
|
|
130
133
|
__exportStar(require("./send.whatsapp.message.notification"), exports);
|
|
134
|
+
__exportStar(require("./set.alias.mapping"), exports);
|
|
131
135
|
__exportStar(require("./set.fcm.token"), exports);
|
|
132
136
|
__exportStar(require("./sync.business.user.role"), exports);
|
|
133
137
|
__exportStar(require("./ui.action.businesses"), exports);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/access/libraries/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAGA,sDAAoC;AACpC,6DAA2C;AAC3C,oEAAkD;AAClD,0DAAwC;AACxC,4DAA0C;AAC1C,gEAA8C;AAC9C,4CAA0B;AAC1B,wDAAsC;AACtC,4DAA0C;AAC1C,+DAA6C;AAC7C,+CAA6B;AAC7B,+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,+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,6DAA2C;AAC3C,0DAAwC;AACxC,kEAAgD;AAChD,+DAA6C;AAC7C,6DAA2C;AAC3C,6DAA2C;AAC3C,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,2DAAyC;AACzC,+DAA6C;AAC7C,sDAAoC;AACpC,6DAA2C;AAC3C,gEAA8C;AAC9C,4DAA0C;AAC1C,0DAAwC;AACxC,oEAAkD;AAClD,oEAAkD;AAClD,oEAAkD;AAClD,qEAAmD;AACnD,yDAAuC;AACvC,uEAAqD;AACrD,kDAAgC;AAChC,4DAA0C;AAC1C,yDAAuC;AACvC,qDAAmC;AACnC,+DAA6C"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/access/libraries/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAGA,sDAAoC;AACpC,6DAA2C;AAC3C,oEAAkD;AAClD,0DAAwC;AACxC,4DAA0C;AAC1C,gEAA8C;AAC9C,4CAA0B;AAC1B,wDAAsC;AACtC,4DAA0C;AAC1C,+DAA6C;AAC7C,+CAA6B;AAC7B,+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,+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,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,2DAAyC;AACzC,+DAA6C;AAC7C,sDAAoC;AACpC,6DAA2C;AAC3C,0DAAwC;AACxC,gEAA8C;AAC9C,4DAA0C;AAC1C,0DAAwC;AACxC,oEAAkD;AAClD,oEAAkD;AAClD,oEAAkD;AAClD,qEAAmD;AACnD,yDAAuC;AACvC,uEAAqD;AACrD,sDAAoC;AACpC,kDAAgC;AAChC,4DAA0C;AAC1C,yDAAuC;AACvC,qDAAmC;AACnC,+DAA6C"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { UploadService } from '@servicelabsco/nestjs-utility-services';
|
|
2
|
+
import { BusinessEmailEntity } from '../entities/business.email.entity';
|
|
3
|
+
import { EmailMessageEntity } from '../entities/email.message.entity';
|
|
4
|
+
import { InboundEmailMessageInterface } from '../interfaces/inbound.email.message.interface';
|
|
5
|
+
import { SyncEmailMessageMetricsJob } from '../jobs/sync.email.message.metrics.job';
|
|
6
|
+
export declare class ProcessInboundEmailMessage {
|
|
7
|
+
private readonly uploadService;
|
|
8
|
+
private readonly syncEmailMessageMetricsJob;
|
|
9
|
+
constructor(uploadService: UploadService, syncEmailMessageMetricsJob: SyncEmailMessageMetricsJob);
|
|
10
|
+
process(email: BusinessEmailEntity, payload: InboundEmailMessageInterface): Promise<EmailMessageEntity>;
|
|
11
|
+
private existingOnUniqueViolation;
|
|
12
|
+
private setAttachments;
|
|
13
|
+
private setAttachment;
|
|
14
|
+
private setRecipients;
|
|
15
|
+
private getBody;
|
|
16
|
+
private getAttachment;
|
|
17
|
+
private getDate;
|
|
18
|
+
private getSenderId;
|
|
19
|
+
private getParentDetails;
|
|
20
|
+
private getMessageIdentifier;
|
|
21
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProcessInboundEmailMessage = void 0;
|
|
4
|
+
const nestjs_utility_services_1 = require("@servicelabsco/nestjs-utility-services");
|
|
5
|
+
const typeorm_1 = require("typeorm");
|
|
6
|
+
const email_attachment_entity_1 = require("../entities/email.attachment.entity");
|
|
7
|
+
const email_message_entity_1 = require("../entities/email.message.entity");
|
|
8
|
+
const email_recipient_entity_1 = require("../entities/email.recipient.entity");
|
|
9
|
+
const PG_UNIQUE_VIOLATION = '23505';
|
|
10
|
+
class ProcessInboundEmailMessage {
|
|
11
|
+
constructor(uploadService, syncEmailMessageMetricsJob) {
|
|
12
|
+
this.uploadService = uploadService;
|
|
13
|
+
this.syncEmailMessageMetricsJob = syncEmailMessageMetricsJob;
|
|
14
|
+
}
|
|
15
|
+
async process(email, payload) {
|
|
16
|
+
const message = await email_message_entity_1.EmailMessageEntity.firstOrNew({ email_id: email.id, identifier: payload.identifier });
|
|
17
|
+
if (message.id)
|
|
18
|
+
return message;
|
|
19
|
+
message.subject = payload.subject;
|
|
20
|
+
message.from_email = payload.from_email;
|
|
21
|
+
message.sender_id = await this.getSenderId(payload.from_email);
|
|
22
|
+
message.tracking_identifier = this.getMessageIdentifier(payload);
|
|
23
|
+
message.body = await this.getBody(email, payload.body);
|
|
24
|
+
message.attributes = { ...message.attributes, ...payload.attributes };
|
|
25
|
+
message.emailed_at = this.getDate(payload.attributes?.date);
|
|
26
|
+
const parent = await this.getParentDetails(message);
|
|
27
|
+
message.parent_id = parent?.parent_id || parent?.id || null;
|
|
28
|
+
try {
|
|
29
|
+
await message.save();
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
const existing = await this.existingOnUniqueViolation(error, email.id, payload.identifier);
|
|
33
|
+
if (existing)
|
|
34
|
+
return existing;
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
await this.setAttachments(email, message, payload.attachments);
|
|
38
|
+
await this.setRecipients(message, payload.recipients);
|
|
39
|
+
await this.syncEmailMessageMetricsJob.delayedDispatch(message.id);
|
|
40
|
+
return message;
|
|
41
|
+
}
|
|
42
|
+
async existingOnUniqueViolation(error, emailId, identifier) {
|
|
43
|
+
const code = error instanceof typeorm_1.QueryFailedError ? error.driverError?.code : undefined;
|
|
44
|
+
if (code !== PG_UNIQUE_VIOLATION)
|
|
45
|
+
return null;
|
|
46
|
+
return email_message_entity_1.EmailMessageEntity.findOne({ where: { email_id: emailId, identifier, deleted_at: (0, typeorm_1.IsNull)() } });
|
|
47
|
+
}
|
|
48
|
+
async setAttachments(email, message, attachments) {
|
|
49
|
+
if (!Array.isArray(attachments))
|
|
50
|
+
return;
|
|
51
|
+
for (const attachment of attachments)
|
|
52
|
+
await this.setAttachment(email, message, attachment);
|
|
53
|
+
}
|
|
54
|
+
async setAttachment(email, message, attachment) {
|
|
55
|
+
try {
|
|
56
|
+
const url = await this.getAttachment(email, attachment);
|
|
57
|
+
const r = await email_attachment_entity_1.EmailAttachmentEntity.firstOrNew({ message_id: message.id, name: attachment.name });
|
|
58
|
+
r.url = url;
|
|
59
|
+
r.attributes = { ...r.attributes, size: attachment.size };
|
|
60
|
+
return r.save();
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
global.console.log('cannot store attachment : ', attachment?.name);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async setRecipients(message, recipients) {
|
|
67
|
+
const nodes = ['to', 'cc'];
|
|
68
|
+
for (const node of nodes) {
|
|
69
|
+
const records = recipients?.[node];
|
|
70
|
+
if (!Array.isArray(records))
|
|
71
|
+
continue;
|
|
72
|
+
for (const record of records) {
|
|
73
|
+
if (!record?.email)
|
|
74
|
+
continue;
|
|
75
|
+
const r = await email_recipient_entity_1.EmailRecipientEntity.firstOrNew({ message_id: message.id, type: node, email: record.email });
|
|
76
|
+
r.attributes = { ...r.attributes, name: record.name };
|
|
77
|
+
await r.save();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async getBody(email, body) {
|
|
82
|
+
const originalname = `${Date.now()}.${nestjs_utility_services_1.PlatformUtility.generateRandomAlpha(6).toLowerCase()}.emailBody.html`;
|
|
83
|
+
const params = { folder: `business/${email.business.identifier}/email/body`, acl: 'private' };
|
|
84
|
+
if (body?.url)
|
|
85
|
+
return this.uploadService.upload({ url: body.url, originalname }, params);
|
|
86
|
+
const buffer = Buffer.from(body?.html ?? '', 'utf-8');
|
|
87
|
+
return this.uploadService.upload({ buffer, originalname }, params);
|
|
88
|
+
}
|
|
89
|
+
async getAttachment(email, attachment) {
|
|
90
|
+
const params = { folder: `business/${email.business.identifier}/email/attachments`, acl: 'private' };
|
|
91
|
+
if (attachment.buffer)
|
|
92
|
+
return this.uploadService.upload({ buffer: attachment.buffer, originalname: attachment.name }, params);
|
|
93
|
+
return this.uploadService.upload({ url: attachment.url, originalname: attachment.name }, params);
|
|
94
|
+
}
|
|
95
|
+
getDate(value) {
|
|
96
|
+
if (!value)
|
|
97
|
+
return null;
|
|
98
|
+
const date = new Date(value);
|
|
99
|
+
return Number.isNaN(date.getTime()) ? null : date;
|
|
100
|
+
}
|
|
101
|
+
async getSenderId(email) {
|
|
102
|
+
const user = await nestjs_utility_services_1.UserEntity.findOne({ where: { email } });
|
|
103
|
+
return user?.id || null;
|
|
104
|
+
}
|
|
105
|
+
async getParentDetails(message) {
|
|
106
|
+
let identifiers = [];
|
|
107
|
+
const { in_reply_to, references } = message.attributes || {};
|
|
108
|
+
if (in_reply_to)
|
|
109
|
+
identifiers.push(in_reply_to);
|
|
110
|
+
if (references?.length)
|
|
111
|
+
identifiers = identifiers.concat(references);
|
|
112
|
+
identifiers = identifiers.filter((item) => item?.length);
|
|
113
|
+
if (!identifiers.length)
|
|
114
|
+
return;
|
|
115
|
+
for (const identifier of identifiers) {
|
|
116
|
+
const parent = await email_message_entity_1.EmailMessageEntity.findOne({ where: { email_id: message.email_id, tracking_identifier: identifier } });
|
|
117
|
+
if (parent)
|
|
118
|
+
return parent;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
getMessageIdentifier(payload) {
|
|
122
|
+
const { in_reply_to, references, message_id } = payload?.attributes || {};
|
|
123
|
+
if (!in_reply_to && references?.length === 1)
|
|
124
|
+
return references[0];
|
|
125
|
+
return message_id;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.ProcessInboundEmailMessage = ProcessInboundEmailMessage;
|
|
129
|
+
//# sourceMappingURL=process.inbound.email.message.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.inbound.email.message.js","sourceRoot":"","sources":["../../../src/access/libraries/process.inbound.email.message.ts"],"names":[],"mappings":"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"}
|