@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,19 @@
|
|
|
1
|
+
export interface EmlAttachmentInterface {
|
|
2
|
+
name: string;
|
|
3
|
+
buffer: Buffer;
|
|
4
|
+
}
|
|
5
|
+
export declare class ReadEmlAttachments {
|
|
6
|
+
fromBuffer(source: Buffer): EmlAttachmentInterface[];
|
|
7
|
+
private parts;
|
|
8
|
+
private unfold;
|
|
9
|
+
private escape;
|
|
10
|
+
private boundary;
|
|
11
|
+
private filePart;
|
|
12
|
+
private decodeBody;
|
|
13
|
+
private decodeQuotedPrintable;
|
|
14
|
+
private headerValue;
|
|
15
|
+
private param;
|
|
16
|
+
private extendedParam;
|
|
17
|
+
private decodeWords;
|
|
18
|
+
private decode;
|
|
19
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ReadEmlAttachments = void 0;
|
|
4
|
+
class ReadEmlAttachments {
|
|
5
|
+
fromBuffer(source) {
|
|
6
|
+
return this.parts(source.toString('latin1'));
|
|
7
|
+
}
|
|
8
|
+
parts(raw) {
|
|
9
|
+
const split = /\r?\n\r?\n/.exec(raw);
|
|
10
|
+
if (!split)
|
|
11
|
+
return [];
|
|
12
|
+
const header = this.unfold(raw.slice(0, split.index));
|
|
13
|
+
const body = raw.slice(split.index + split[0].length);
|
|
14
|
+
const boundary = this.boundary(header);
|
|
15
|
+
if (!boundary) {
|
|
16
|
+
const file = this.filePart(header, body);
|
|
17
|
+
return file ? [file] : [];
|
|
18
|
+
}
|
|
19
|
+
const delimiter = new RegExp(`^--${this.escape(boundary)}(--)?[ \\t]*\\r?$`, 'm');
|
|
20
|
+
const chunks = body.split(delimiter);
|
|
21
|
+
const files = [];
|
|
22
|
+
for (let i = 1; i < chunks.length; i += 2) {
|
|
23
|
+
if (chunks[i] === '--')
|
|
24
|
+
break;
|
|
25
|
+
const piece = (chunks[i + 1] || '').replace(/^\r?\n/, '').replace(/\r?\n$/, '');
|
|
26
|
+
files.push(...this.parts(piece));
|
|
27
|
+
}
|
|
28
|
+
return files;
|
|
29
|
+
}
|
|
30
|
+
unfold(header) {
|
|
31
|
+
return header.replace(/\r?\n[ \t]+/g, ' ');
|
|
32
|
+
}
|
|
33
|
+
escape(value) {
|
|
34
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
35
|
+
}
|
|
36
|
+
boundary(header) {
|
|
37
|
+
const contentType = this.headerValue(header, 'content-type');
|
|
38
|
+
if (!/^multipart\//i.test(contentType || ''))
|
|
39
|
+
return;
|
|
40
|
+
return this.param(contentType, 'boundary');
|
|
41
|
+
}
|
|
42
|
+
filePart(header, body) {
|
|
43
|
+
const contentType = this.headerValue(header, 'content-type') || '';
|
|
44
|
+
if (/^multipart\//i.test(contentType))
|
|
45
|
+
return;
|
|
46
|
+
const name = this.param(this.headerValue(header, 'content-disposition') || '', 'filename') || this.param(contentType, 'name');
|
|
47
|
+
if (!name)
|
|
48
|
+
return;
|
|
49
|
+
const encoding = this.headerValue(header, 'content-transfer-encoding')?.toLowerCase();
|
|
50
|
+
const buffer = this.decodeBody(body.replace(/\r?\n$/, ''), encoding);
|
|
51
|
+
if (!buffer.length)
|
|
52
|
+
return;
|
|
53
|
+
return { name, buffer };
|
|
54
|
+
}
|
|
55
|
+
decodeBody(payload, encoding) {
|
|
56
|
+
if (encoding === 'base64')
|
|
57
|
+
return Buffer.from(payload.replace(/\s/g, ''), 'base64');
|
|
58
|
+
if (encoding === 'quoted-printable')
|
|
59
|
+
return this.decodeQuotedPrintable(payload);
|
|
60
|
+
return Buffer.from(payload, 'latin1');
|
|
61
|
+
}
|
|
62
|
+
decodeQuotedPrintable(payload) {
|
|
63
|
+
const text = payload.replace(/=\r?\n/g, '').replace(/=([0-9A-F]{2})/gi, (_match, hex) => String.fromCharCode(parseInt(hex, 16)));
|
|
64
|
+
return Buffer.from(text, 'latin1');
|
|
65
|
+
}
|
|
66
|
+
headerValue(header, name) {
|
|
67
|
+
const match = new RegExp(`^${name}:[ \\t]*(.*)$`, 'im').exec(header);
|
|
68
|
+
return match?.[1]?.trim();
|
|
69
|
+
}
|
|
70
|
+
param(value, name) {
|
|
71
|
+
const extended = this.extendedParam(value, name);
|
|
72
|
+
if (extended)
|
|
73
|
+
return extended;
|
|
74
|
+
const match = new RegExp(`(?:^|;)\\s*${name}\\s*=\\s*(?:"((?:[^"\\\\]|\\\\.)*)"|([^;\\s]+))`, 'i').exec(value);
|
|
75
|
+
if (!match)
|
|
76
|
+
return;
|
|
77
|
+
const text = match[1] !== undefined ? match[1].replace(/\\(.)/g, '$1') : match[2];
|
|
78
|
+
return this.decodeWords(text);
|
|
79
|
+
}
|
|
80
|
+
extendedParam(value, name) {
|
|
81
|
+
const pattern = new RegExp(`(?:^|;)\\s*${name}\\*(\\d+)?(\\*)?\\s*=\\s*(?:"([^"]*)"|([^;\\s]+))`, 'gi');
|
|
82
|
+
const pieces = [];
|
|
83
|
+
for (const match of value.matchAll(pattern)) {
|
|
84
|
+
pieces.push({ index: Number(match[1] ?? 0), text: match[3] ?? match[4], encoded: Boolean(match[2]) || match[1] === undefined });
|
|
85
|
+
}
|
|
86
|
+
if (!pieces.length)
|
|
87
|
+
return;
|
|
88
|
+
pieces.sort((a, b) => a.index - b.index);
|
|
89
|
+
let charset = 'utf-8';
|
|
90
|
+
const bytes = [];
|
|
91
|
+
for (const [position, piece] of pieces.entries()) {
|
|
92
|
+
let text = piece.text;
|
|
93
|
+
if (position === 0 && piece.encoded) {
|
|
94
|
+
const prefix = /^([^']*)'[^']*'/.exec(text);
|
|
95
|
+
if (prefix) {
|
|
96
|
+
charset = prefix[1] || charset;
|
|
97
|
+
text = text.slice(prefix[0].length);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
const decoded = piece.encoded ? text.replace(/%([0-9A-F]{2})/gi, (_match, hex) => String.fromCharCode(parseInt(hex, 16))) : text;
|
|
101
|
+
for (const char of decoded)
|
|
102
|
+
bytes.push(char.charCodeAt(0) & 0xff);
|
|
103
|
+
}
|
|
104
|
+
return this.decode(Buffer.from(bytes), charset);
|
|
105
|
+
}
|
|
106
|
+
decodeWords(value) {
|
|
107
|
+
return value
|
|
108
|
+
.replace(/(\?=)\s+(=\?)/g, '$1$2')
|
|
109
|
+
.replace(/=\?([^?]+)\?([bq])\?([^?]*)\?=/gi, (_word, charset, kind, text) => {
|
|
110
|
+
const bytes = kind.toLowerCase() === 'b'
|
|
111
|
+
? Buffer.from(text, 'base64')
|
|
112
|
+
: Buffer.from(text.replace(/_/g, ' ').replace(/=([0-9A-F]{2})/gi, (_match, hex) => String.fromCharCode(parseInt(hex, 16))), 'latin1');
|
|
113
|
+
return this.decode(bytes, charset);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
decode(bytes, charset) {
|
|
117
|
+
try {
|
|
118
|
+
return new TextDecoder(charset.trim().toLowerCase()).decode(bytes);
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
return bytes.toString('latin1');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
exports.ReadEmlAttachments = ReadEmlAttachments;
|
|
126
|
+
//# sourceMappingURL=read.eml.attachments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.eml.attachments.js","sourceRoot":"","sources":["../../../src/access/libraries/read.eml.attachments.ts"],"names":[],"mappings":";;;AAcA,MAAa,kBAAkB;IAK3B,UAAU,CAAC,MAAc;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjD,CAAC;IAEO,KAAK,CAAC,GAAW;QACrB,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QAEtB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACzC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9B,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;QAClF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACrC,MAAM,KAAK,GAA6B,EAAE,CAAC;QAG3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI;gBAAE,MAAM;YAE9B,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YAChF,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QACrC,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,MAAM,CAAC,MAAc;QACzB,OAAO,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IAC/C,CAAC;IAEO,MAAM,CAAC,KAAa;QACxB,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;IAEO,QAAQ,CAAC,MAAc;QAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAC7D,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;YAAE,OAAO;QAErD,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IAC/C,CAAC;IAEO,QAAQ,CAAC,MAAc,EAAE,IAAY;QACzC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,IAAI,EAAE,CAAC;QACnE,IAAI,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC;YAAE,OAAO;QAE9C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,qBAAqB,CAAC,IAAI,EAAE,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAC9H,IAAI,CAAC,IAAI;YAAE,OAAO;QAElB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,2BAA2B,CAAC,EAAE,WAAW,EAAE,CAAC;QACtF,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO;QAE3B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;IAEO,UAAU,CAAC,OAAe,EAAE,QAAgB;QAChD,IAAI,QAAQ,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;QACpF,IAAI,QAAQ,KAAK,kBAAkB;YAAE,OAAO,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAEhF,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC1C,CAAC;IAEO,qBAAqB,CAAC,OAAe;QACzC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAEjI,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAEO,WAAW,CAAC,MAAc,EAAE,IAAY;QAC5C,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,IAAI,eAAe,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAErE,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAC9B,CAAC;IAKO,KAAK,CAAC,KAAa,EAAE,IAAY;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACjD,IAAI,QAAQ;YAAE,OAAO,QAAQ,CAAC;QAE9B,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,cAAc,IAAI,iDAAiD,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/G,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAElF,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAEO,aAAa,CAAC,KAAa,EAAE,IAAY;QAC7C,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,cAAc,IAAI,mDAAmD,EAAE,IAAI,CAAC,CAAC;QACxG,MAAM,MAAM,GAAwD,EAAE,CAAC;QAEvE,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC,CAAC;QACpI,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO;QAE3B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAEzC,IAAI,OAAO,GAAG,OAAO,CAAC;QACtB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/C,IAAI,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YACtB,IAAI,QAAQ,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClC,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5C,IAAI,MAAM,EAAE,CAAC;oBACT,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;oBAC/B,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;gBACxC,CAAC;YACL,CAAC;YAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YACjI,KAAK,MAAM,IAAI,IAAI,OAAO;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QACtE,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAGO,WAAW,CAAC,KAAa;QAC7B,OAAO,KAAK;aACP,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC;aACjC,OAAO,CAAC,kCAAkC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;YACxE,MAAM,KAAK,GACP,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG;gBACtB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;gBAC7B,CAAC,CAAC,MAAM,CAAC,IAAI,CACP,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAC5G,QAAQ,CACX,CAAC;YAEZ,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACX,CAAC;IAGO,MAAM,CAAC,KAAa,EAAE,OAAe;QACzC,IAAI,CAAC;YACD,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,CAAC;QAAC,MAAM,CAAC;YACL,OAAO,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;IACL,CAAC;CACJ;AA1JD,gDA0JC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { SqlService } from '@servicelabsco/nestjs-utility-services';
|
|
2
|
+
import { AliasSearchMatchInterface } from '../interfaces/alias.search.match.interface';
|
|
3
|
+
import { AliasSearchQueryInterface } from '../interfaces/alias.search.query.interface';
|
|
4
|
+
export declare class SearchAliasMappings {
|
|
5
|
+
private readonly sqlService;
|
|
6
|
+
private static readonly DEFAULT_LIMIT;
|
|
7
|
+
private static readonly MAX_LIMIT;
|
|
8
|
+
private static readonly MIN_SIMILARITY;
|
|
9
|
+
constructor(sqlService: SqlService);
|
|
10
|
+
process(businessId: number, query: AliasSearchQueryInterface): Promise<AliasSearchMatchInterface[]>;
|
|
11
|
+
private clamp;
|
|
12
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SearchAliasMappings = void 0;
|
|
4
|
+
class SearchAliasMappings {
|
|
5
|
+
constructor(sqlService) {
|
|
6
|
+
this.sqlService = sqlService;
|
|
7
|
+
}
|
|
8
|
+
async process(businessId, query) {
|
|
9
|
+
const name = query?.name?.trim();
|
|
10
|
+
if (!name)
|
|
11
|
+
return [];
|
|
12
|
+
const minSimilarity = this.clamp(query.min_similarity ?? SearchAliasMappings.MIN_SIMILARITY, SearchAliasMappings.MIN_SIMILARITY, 1);
|
|
13
|
+
const limit = Math.round(this.clamp(query.limit ?? SearchAliasMappings.DEFAULT_LIMIT, 1, SearchAliasMappings.MAX_LIMIT));
|
|
14
|
+
const sourceType = query.source_type?.trim() || null;
|
|
15
|
+
const type = query.type?.trim() || null;
|
|
16
|
+
const rows = await this.sqlService.boundSql(`select a.id, a.source_type, a.source_id, a.name, a.type,
|
|
17
|
+
similarity(lower(a.name), lower($2)) as similarity
|
|
18
|
+
from bz_alias_mappings a
|
|
19
|
+
where a.deleted_at is null
|
|
20
|
+
and a.business_id = $1
|
|
21
|
+
and ($3::text is null or a.source_type = $3)
|
|
22
|
+
and ($4::text is null or a.type = $4)
|
|
23
|
+
and similarity(lower(a.name), lower($2)) >= $5
|
|
24
|
+
order by similarity desc, a.id asc
|
|
25
|
+
limit $6`, [businessId, name, sourceType, type, minSimilarity, limit]);
|
|
26
|
+
return (rows ?? []).map((row) => ({
|
|
27
|
+
id: Number(row.id),
|
|
28
|
+
source_type: row.source_type,
|
|
29
|
+
source_id: Number(row.source_id),
|
|
30
|
+
name: row.name,
|
|
31
|
+
type: row.type,
|
|
32
|
+
similarity: Number(row.similarity),
|
|
33
|
+
}));
|
|
34
|
+
}
|
|
35
|
+
clamp(value, min, max) {
|
|
36
|
+
const number = Number(value);
|
|
37
|
+
if (!Number.isFinite(number))
|
|
38
|
+
return min;
|
|
39
|
+
return Math.min(Math.max(number, min), max);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
exports.SearchAliasMappings = SearchAliasMappings;
|
|
43
|
+
SearchAliasMappings.DEFAULT_LIMIT = 10;
|
|
44
|
+
SearchAliasMappings.MAX_LIMIT = 50;
|
|
45
|
+
SearchAliasMappings.MIN_SIMILARITY = 0.3;
|
|
46
|
+
//# sourceMappingURL=search.alias.mappings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.alias.mappings.js","sourceRoot":"","sources":["../../../src/access/libraries/search.alias.mappings.ts"],"names":[],"mappings":";;;AASA,MAAa,mBAAmB;IAM5B,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAmBvD,KAAK,CAAC,OAAO,CAAC,UAAkB,EAAE,KAAgC;QAC9D,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QAErB,MAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,IAAI,mBAAmB,CAAC,cAAc,EAAE,mBAAmB,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QACpI,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,mBAAmB,CAAC,aAAa,EAAE,CAAC,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAC,CAAC;QACzH,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;QACrD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC;QAExC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CACvC;;;;;;;;;iBASK,EACL,CAAC,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,CAAC,CAC7D,CAAC;QAEF,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC9B,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;YAChC,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC;SACrC,CAAC,CAAC,CAAC;IACR,CAAC;IAUO,KAAK,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW;QACjD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,GAAG,CAAC;QAEzC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAChD,CAAC;;AAvEL,kDAwEC;AAvE2B,iCAAa,GAAG,EAAE,CAAC;AACnB,6BAAS,GAAG,EAAE,CAAC;AAEf,kCAAc,GAAG,GAAG,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { AliasMappingEntity } from '../entities/alias.mapping.entity';
|
|
2
|
+
import { AliasMappingInputInterface } from '../interfaces/alias.mapping.input.interface';
|
|
3
|
+
export declare class SetAliasMapping {
|
|
4
|
+
private static readonly MAX_NAME;
|
|
5
|
+
private static readonly MAX_TYPE;
|
|
6
|
+
private static readonly SOURCE_TYPE;
|
|
7
|
+
process(businessId: number, input: AliasMappingInputInterface): Promise<AliasMappingEntity>;
|
|
8
|
+
private findExisting;
|
|
9
|
+
private mergeAttributes;
|
|
10
|
+
private static isUniqueViolation;
|
|
11
|
+
private validate;
|
|
12
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SetAliasMapping = void 0;
|
|
4
|
+
const nestjs_utility_services_1 = require("@servicelabsco/nestjs-utility-services");
|
|
5
|
+
const typeorm_1 = require("typeorm");
|
|
6
|
+
const alias_mapping_entity_1 = require("../entities/alias.mapping.entity");
|
|
7
|
+
class SetAliasMapping {
|
|
8
|
+
async process(businessId, input) {
|
|
9
|
+
const name = input.name?.trim() ?? '';
|
|
10
|
+
const type = input.type?.trim() ?? '';
|
|
11
|
+
this.validate(input.source_type, input.source_id, name, type);
|
|
12
|
+
const existing = await this.findExisting(businessId, input, name, type);
|
|
13
|
+
if (existing)
|
|
14
|
+
return this.mergeAttributes(existing, input);
|
|
15
|
+
const alias = alias_mapping_entity_1.AliasMappingEntity.create({
|
|
16
|
+
business_id: businessId,
|
|
17
|
+
source_type: input.source_type,
|
|
18
|
+
source_id: input.source_id,
|
|
19
|
+
name,
|
|
20
|
+
type,
|
|
21
|
+
attributes: input.attributes,
|
|
22
|
+
});
|
|
23
|
+
try {
|
|
24
|
+
const saved = await alias.save();
|
|
25
|
+
return saved;
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
if (!SetAliasMapping.isUniqueViolation(error))
|
|
29
|
+
throw error;
|
|
30
|
+
const winner = await this.findExisting(businessId, input, name, type);
|
|
31
|
+
if (!winner)
|
|
32
|
+
throw error;
|
|
33
|
+
return this.mergeAttributes(winner, input);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
findExisting(businessId, input, name, type) {
|
|
37
|
+
return alias_mapping_entity_1.AliasMappingEntity.findOne({
|
|
38
|
+
where: {
|
|
39
|
+
business_id: businessId,
|
|
40
|
+
source_type: input.source_type,
|
|
41
|
+
source_id: input.source_id,
|
|
42
|
+
type,
|
|
43
|
+
name: (0, typeorm_1.Raw)((column) => `lower(${column}) = lower(:name)`, { name }),
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
mergeAttributes(existing, input) {
|
|
48
|
+
if (!input.attributes)
|
|
49
|
+
return Promise.resolve(existing);
|
|
50
|
+
existing.attributes = { ...(existing.attributes ?? {}), ...input.attributes };
|
|
51
|
+
return existing.save();
|
|
52
|
+
}
|
|
53
|
+
static isUniqueViolation(error) {
|
|
54
|
+
return error?.code === '23505' || error?.driverError?.code === '23505';
|
|
55
|
+
}
|
|
56
|
+
validate(sourceType, sourceId, name, type) {
|
|
57
|
+
if (!SetAliasMapping.SOURCE_TYPE.test(sourceType ?? ''))
|
|
58
|
+
throw new nestjs_utility_services_1.FormException({ column: 'source_type', err: 'This is not a known source type' });
|
|
59
|
+
if (!Number.isInteger(sourceId) || sourceId <= 0)
|
|
60
|
+
throw new nestjs_utility_services_1.FormException({ column: 'source_id', err: 'The record id must be a positive whole number' });
|
|
61
|
+
if (!name)
|
|
62
|
+
throw new nestjs_utility_services_1.FormException({ column: 'name', err: 'The alias name is required' });
|
|
63
|
+
if (name.length > SetAliasMapping.MAX_NAME)
|
|
64
|
+
throw new nestjs_utility_services_1.FormException({
|
|
65
|
+
column: 'name',
|
|
66
|
+
err: `The alias name can be at most ${SetAliasMapping.MAX_NAME} characters`,
|
|
67
|
+
});
|
|
68
|
+
if (!type)
|
|
69
|
+
throw new nestjs_utility_services_1.FormException({ column: 'type', err: 'The alias type is required' });
|
|
70
|
+
if (type.length > SetAliasMapping.MAX_TYPE)
|
|
71
|
+
throw new nestjs_utility_services_1.FormException({
|
|
72
|
+
column: 'type',
|
|
73
|
+
err: `The alias type can be at most ${SetAliasMapping.MAX_TYPE} characters`,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.SetAliasMapping = SetAliasMapping;
|
|
78
|
+
SetAliasMapping.MAX_NAME = 255;
|
|
79
|
+
SetAliasMapping.MAX_TYPE = 64;
|
|
80
|
+
SetAliasMapping.SOURCE_TYPE = /^[a-f0-9]{32}$/;
|
|
81
|
+
//# sourceMappingURL=set.alias.mapping.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"set.alias.mapping.js","sourceRoot":"","sources":["../../../src/access/libraries/set.alias.mapping.ts"],"names":[],"mappings":";;;AAAA,oFAAuE;AACvE,qCAA8B;AAC9B,2EAAsE;AAQtE,MAAa,eAAe;IA4BxB,KAAK,CAAC,OAAO,CAAC,UAAkB,EAAE,KAAiC;QAC/D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAE9D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACxE,IAAI,QAAQ;YAAE,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAE3D,MAAM,KAAK,GAAG,yCAAkB,CAAC,MAAM,CAAC;YACpC,WAAW,EAAE,UAAU;YACvB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,IAAI;YACJ,IAAI;YACJ,UAAU,EAAE,KAAK,CAAC,UAAiB;SACtC,CAAC,CAAC;QAEH,IAAI,CAAC;YACD,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;YACjC,OAAO,KAAK,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,eAAe,CAAC,iBAAiB,CAAC,KAAK,CAAC;gBAAE,MAAM,KAAK,CAAC;YAE3D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;YACtE,IAAI,CAAC,MAAM;gBAAE,MAAM,KAAK,CAAC;YAEzB,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC/C,CAAC;IACL,CAAC;IAWO,YAAY,CAAC,UAAkB,EAAE,KAAiC,EAAE,IAAY,EAAE,IAAY;QAClG,OAAO,yCAAkB,CAAC,OAAO,CAAC;YAC9B,KAAK,EAAE;gBACH,WAAW,EAAE,UAAU;gBACvB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,IAAI;gBACJ,IAAI,EAAE,IAAA,aAAG,EAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,MAAM,kBAAkB,EAAE,EAAE,IAAI,EAAE,CAAC;aACrE;SACJ,CAAC,CAAC;IACP,CAAC;IASO,eAAe,CAAC,QAA4B,EAAE,KAAiC;QACnF,IAAI,CAAC,KAAK,CAAC,UAAU;YAAE,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAExD,QAAQ,CAAC,UAAU,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,UAAU,EAAS,CAAC;QACrF,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAMO,MAAM,CAAC,iBAAiB,CAAC,KAAU;QACvC,OAAO,KAAK,EAAE,IAAI,KAAK,OAAO,IAAI,KAAK,EAAE,WAAW,EAAE,IAAI,KAAK,OAAO,CAAC;IAC3E,CAAC;IAUO,QAAQ,CAAC,UAAkB,EAAE,QAAgB,EAAE,IAAY,EAAE,IAAY;QAC7E,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;YACnD,MAAM,IAAI,uCAAa,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,EAAE,iCAAiC,EAAE,CAAC,CAAC;QAE/F,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC;YAC5C,MAAM,IAAI,uCAAa,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,+CAA+C,EAAE,CAAC,CAAC;QAE3G,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,uCAAa,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,4BAA4B,EAAE,CAAC,CAAC;QAC1F,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,QAAQ;YACtC,MAAM,IAAI,uCAAa,CAAC;gBACpB,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,iCAAiC,eAAe,CAAC,QAAQ,aAAa;aAC9E,CAAC,CAAC;QAEP,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,uCAAa,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,4BAA4B,EAAE,CAAC,CAAC;QAC1F,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe,CAAC,QAAQ;YACtC,MAAM,IAAI,uCAAa,CAAC;gBACpB,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,iCAAiC,eAAe,CAAC,QAAQ,aAAa;aAC9E,CAAC,CAAC;IACX,CAAC;;AAjIL,0CAkIC;AAjI2B,wBAAQ,GAAG,GAAG,CAAC;AACf,wBAAQ,GAAG,EAAE,CAAC;AAMd,2BAAW,GAAG,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { SqlService } from '@servicelabsco/nestjs-utility-services';
|
|
2
|
+
import { AliasLookupOptionsInterface } from '../interfaces/alias.lookup.options.interface';
|
|
3
|
+
import { AliasSearchMatchInterface } from '../interfaces/alias.search.match.interface';
|
|
4
|
+
export declare class AliasMappingService {
|
|
5
|
+
private readonly sqlService;
|
|
6
|
+
constructor(sqlService: SqlService);
|
|
7
|
+
search(businessId: number, sourceType: string, type: string, name: string, options?: AliasLookupOptionsInterface): Promise<AliasSearchMatchInterface[]>;
|
|
8
|
+
findBestMatch(businessId: number, sourceType: string, type: string, name: string, options?: Pick<AliasLookupOptionsInterface, 'minSimilarity'>): Promise<AliasSearchMatchInterface | null>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
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.AliasMappingService = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const nestjs_utility_services_1 = require("@servicelabsco/nestjs-utility-services");
|
|
15
|
+
const search_alias_mappings_1 = require("../libraries/search.alias.mappings");
|
|
16
|
+
let AliasMappingService = class AliasMappingService {
|
|
17
|
+
constructor(sqlService) {
|
|
18
|
+
this.sqlService = sqlService;
|
|
19
|
+
}
|
|
20
|
+
async search(businessId, sourceType, type, name, options = {}) {
|
|
21
|
+
const exactType = type?.trim();
|
|
22
|
+
if (!sourceType || !exactType)
|
|
23
|
+
return [];
|
|
24
|
+
return new search_alias_mappings_1.SearchAliasMappings(this.sqlService).process(businessId, {
|
|
25
|
+
name,
|
|
26
|
+
source_type: sourceType,
|
|
27
|
+
type: exactType,
|
|
28
|
+
limit: options.limit,
|
|
29
|
+
min_similarity: options.minSimilarity,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
async findBestMatch(businessId, sourceType, type, name, options = {}) {
|
|
33
|
+
const matches = await this.search(businessId, sourceType, type, name, {
|
|
34
|
+
...options,
|
|
35
|
+
limit: 1,
|
|
36
|
+
});
|
|
37
|
+
return matches[0] ?? null;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
exports.AliasMappingService = AliasMappingService;
|
|
41
|
+
exports.AliasMappingService = AliasMappingService = __decorate([
|
|
42
|
+
(0, common_1.Injectable)(),
|
|
43
|
+
__metadata("design:paramtypes", [nestjs_utility_services_1.SqlService])
|
|
44
|
+
], AliasMappingService);
|
|
45
|
+
//# sourceMappingURL=alias.mapping.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alias.mapping.service.js","sourceRoot":"","sources":["../../../src/access/services/alias.mapping.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,oFAAoE;AAGpE,8EAAyE;AAYlE,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAC5B,YAA6B,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAgBvD,KAAK,CAAC,MAAM,CACR,UAAkB,EAClB,UAAkB,EAClB,IAAY,EACZ,IAAY,EACZ,UAAuC,EAAE;QAEzC,MAAM,SAAS,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,CAAC;QAEzC,OAAO,IAAI,2CAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE;YAChE,IAAI;YACJ,WAAW,EAAE,UAAU;YACvB,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,cAAc,EAAE,OAAO,CAAC,aAAa;SACxC,CAAC,CAAC;IACP,CAAC;IAaD,KAAK,CAAC,aAAa,CACf,UAAkB,EAClB,UAAkB,EAClB,IAAY,EACZ,IAAY,EACZ,UAA8D,EAAE;QAEhE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE;YAClE,GAAG,OAAO;YACV,KAAK,EAAE,CAAC;SACX,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC9B,CAAC;CACJ,CAAA;AA7DY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,mBAAU,GAAE;qCAEgC,oCAAU;GAD1C,mBAAmB,CA6D/B"}
|
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
import { AwsS3Service, CacheService, InternalServerConnectService, UploadService, UserEntity } from '@servicelabsco/nestjs-utility-services';
|
|
2
|
+
import { AddBusinessEmailDto } from '../dtos/add.business.email.dto';
|
|
2
3
|
import { ServerEmailMessageDto } from '../dtos/server.email.message.dto';
|
|
3
4
|
import { AccessBusinessEntity } from '../entities/access.business.entity';
|
|
4
5
|
import { BusinessEmailEntity } from '../entities/business.email.entity';
|
|
5
6
|
import { EmailAttachmentEntity } from '../entities/email.attachment.entity';
|
|
6
7
|
import { EmailMessageEntity } from '../entities/email.message.entity';
|
|
7
8
|
import { ProductTypeEnum } from '../enums/product.type.enum';
|
|
9
|
+
import { EmithookService } from './emithook.service';
|
|
8
10
|
export declare class BusinessEmailService {
|
|
9
11
|
private readonly internalServerConnectService;
|
|
10
12
|
private readonly awsS3Service;
|
|
11
13
|
protected readonly cacheService: CacheService;
|
|
12
14
|
protected readonly uploadService: UploadService;
|
|
13
|
-
|
|
15
|
+
private readonly emithookService;
|
|
16
|
+
constructor(internalServerConnectService: InternalServerConnectService, awsS3Service: AwsS3Service, cacheService: CacheService, uploadService: UploadService, emithookService: EmithookService);
|
|
17
|
+
createEmail(business: AccessBusinessEntity, body: AddBusinessEmailDto, user_id?: number, product_id?: ProductTypeEnum): Promise<BusinessEmailEntity>;
|
|
14
18
|
setEmail(business: AccessBusinessEntity, user_id?: number, product_id?: ProductTypeEnum): Promise<BusinessEmailEntity>;
|
|
15
19
|
getEmailDetails(business: AccessBusinessEntity, id: number, user?: UserEntity): Promise<EmailMessageEntity>;
|
|
16
20
|
getSignedAttachments(attachments: EmailAttachmentEntity[], _business: AccessBusinessEntity): Promise<EmailAttachmentEntity[]>;
|
|
@@ -14,12 +14,43 @@ const common_1 = require("@nestjs/common");
|
|
|
14
14
|
const nestjs_utility_services_1 = require("@servicelabsco/nestjs-utility-services");
|
|
15
15
|
const business_email_entity_1 = require("../entities/business.email.entity");
|
|
16
16
|
const email_message_entity_1 = require("../entities/email.message.entity");
|
|
17
|
+
const business_email_type_enum_1 = require("../enums/business.email.type.enum");
|
|
18
|
+
const emithook_service_1 = require("./emithook.service");
|
|
17
19
|
let BusinessEmailService = class BusinessEmailService {
|
|
18
|
-
constructor(internalServerConnectService, awsS3Service, cacheService, uploadService) {
|
|
20
|
+
constructor(internalServerConnectService, awsS3Service, cacheService, uploadService, emithookService) {
|
|
19
21
|
this.internalServerConnectService = internalServerConnectService;
|
|
20
22
|
this.awsS3Service = awsS3Service;
|
|
21
23
|
this.cacheService = cacheService;
|
|
22
24
|
this.uploadService = uploadService;
|
|
25
|
+
this.emithookService = emithookService;
|
|
26
|
+
}
|
|
27
|
+
async createEmail(business, body, user_id, product_id) {
|
|
28
|
+
const user = nestjs_utility_services_1.Auth.user();
|
|
29
|
+
const localPart = body.local_part.trim().toLowerCase();
|
|
30
|
+
const alias = await this.emithookService.createAlias(localPart);
|
|
31
|
+
const row = business_email_entity_1.BusinessEmailEntity.create({
|
|
32
|
+
business_id: business.id,
|
|
33
|
+
identifier: alias.id,
|
|
34
|
+
email: alias.address,
|
|
35
|
+
name: body.name,
|
|
36
|
+
product_id: product_id || user?.auth_attributes?.product_id,
|
|
37
|
+
user_id,
|
|
38
|
+
active: true,
|
|
39
|
+
attributes: { type: business_email_type_enum_1.BusinessEmailTypeEnum.EMITHOOK },
|
|
40
|
+
});
|
|
41
|
+
try {
|
|
42
|
+
const saved = await row.save();
|
|
43
|
+
return saved;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
try {
|
|
47
|
+
await this.emithookService.deleteAlias(alias.id);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
global.console.log('cannot delete emithook alias after a failed mailbox save : ', alias.id);
|
|
51
|
+
}
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
23
54
|
}
|
|
24
55
|
async setEmail(business, user_id, product_id) {
|
|
25
56
|
const slug = `fnn.${business.identifier}`;
|
|
@@ -74,6 +105,7 @@ exports.BusinessEmailService = BusinessEmailService = __decorate([
|
|
|
74
105
|
__metadata("design:paramtypes", [nestjs_utility_services_1.InternalServerConnectService,
|
|
75
106
|
nestjs_utility_services_1.AwsS3Service,
|
|
76
107
|
nestjs_utility_services_1.CacheService,
|
|
77
|
-
nestjs_utility_services_1.UploadService
|
|
108
|
+
nestjs_utility_services_1.UploadService,
|
|
109
|
+
emithook_service_1.EmithookService])
|
|
78
110
|
], BusinessEmailService);
|
|
79
111
|
//# sourceMappingURL=business.email.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"business.email.service.js","sourceRoot":"","sources":["../../../src/access/services/business.email.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,oFAQgD;
|
|
1
|
+
{"version":3,"file":"business.email.service.js","sourceRoot":"","sources":["../../../src/access/services/business.email.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { PropertyService, RemoteRequestService } from '@servicelabsco/nestjs-utility-services';
|
|
2
|
+
import { EmithookEmailBodyInterface } from '../interfaces/emithook.email.body.interface';
|
|
3
|
+
export interface EmithookMessagePageInterface {
|
|
4
|
+
data: {
|
|
5
|
+
id?: string;
|
|
6
|
+
message_id?: string;
|
|
7
|
+
received_at?: string;
|
|
8
|
+
}[];
|
|
9
|
+
next_cursor?: string | null;
|
|
10
|
+
}
|
|
11
|
+
export interface EmithookAliasInterface {
|
|
12
|
+
id: string;
|
|
13
|
+
address: string;
|
|
14
|
+
kind: string;
|
|
15
|
+
localPart: string;
|
|
16
|
+
domain: string;
|
|
17
|
+
destinationIds: string[];
|
|
18
|
+
}
|
|
19
|
+
export declare class EmithookService {
|
|
20
|
+
private readonly propertyService;
|
|
21
|
+
private readonly remoteRequestService;
|
|
22
|
+
constructor(propertyService: PropertyService, remoteRequestService: RemoteRequestService);
|
|
23
|
+
createAlias(localPart: string): Promise<EmithookAliasInterface>;
|
|
24
|
+
verifyWebhookToken(token?: string): Promise<void>;
|
|
25
|
+
deleteAlias(aliasId: string): Promise<void>;
|
|
26
|
+
listMessages(alias: string, cursor?: string): Promise<EmithookMessagePageInterface>;
|
|
27
|
+
getMessage(alias: string, messageId: string): Promise<EmithookEmailBodyInterface>;
|
|
28
|
+
getRaw(alias: string, messageId: string): Promise<Buffer>;
|
|
29
|
+
getAttachment(alias: string, messageId: string, attachmentId: string | number): Promise<Buffer>;
|
|
30
|
+
private request;
|
|
31
|
+
private getRequiredProperty;
|
|
32
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
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.EmithookService = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const crypto_1 = require("crypto");
|
|
15
|
+
const nestjs_utility_services_1 = require("@servicelabsco/nestjs-utility-services");
|
|
16
|
+
let EmithookService = class EmithookService {
|
|
17
|
+
constructor(propertyService, remoteRequestService) {
|
|
18
|
+
this.propertyService = propertyService;
|
|
19
|
+
this.remoteRequestService = remoteRequestService;
|
|
20
|
+
}
|
|
21
|
+
async createAlias(localPart) {
|
|
22
|
+
const domainId = await this.getRequiredProperty('emithook.email.domain.id');
|
|
23
|
+
const destinationId = await this.getRequiredProperty('emithook.email.destination.id');
|
|
24
|
+
const response = await this.request({
|
|
25
|
+
method: 'POST',
|
|
26
|
+
path: '/v1/aliases',
|
|
27
|
+
data: { kind: 'custom', domainId, localPart, destinationIds: [destinationId] },
|
|
28
|
+
});
|
|
29
|
+
if (response.status === 409)
|
|
30
|
+
throw new nestjs_utility_services_1.FormException({ column: 'local_part', err: 'This email address is already taken' });
|
|
31
|
+
if (response.status === 400)
|
|
32
|
+
throw new nestjs_utility_services_1.FormException({ column: 'local_part', err: 'This email address is not allowed' });
|
|
33
|
+
if (!response.success || !response.data?.id)
|
|
34
|
+
throw new nestjs_utility_services_1.OperationException(`EmitHook POST /v1/aliases failed : ${JSON.stringify(response.data)}`);
|
|
35
|
+
return response.data;
|
|
36
|
+
}
|
|
37
|
+
async verifyWebhookToken(token) {
|
|
38
|
+
const expected = await this.propertyService.get('emithook.webhook.token');
|
|
39
|
+
if (!expected || !token)
|
|
40
|
+
throw new common_1.UnauthorizedException();
|
|
41
|
+
const given = (0, crypto_1.createHash)('sha256').update(String(token)).digest();
|
|
42
|
+
const wanted = (0, crypto_1.createHash)('sha256').update(String(expected)).digest();
|
|
43
|
+
if (!(0, crypto_1.timingSafeEqual)(given, wanted))
|
|
44
|
+
throw new common_1.UnauthorizedException();
|
|
45
|
+
}
|
|
46
|
+
async deleteAlias(aliasId) {
|
|
47
|
+
const path = `/v1/aliases/${encodeURIComponent(aliasId)}`;
|
|
48
|
+
const response = await this.request({ method: 'DELETE', path });
|
|
49
|
+
if (response.status === 404)
|
|
50
|
+
return;
|
|
51
|
+
if (!response.success)
|
|
52
|
+
throw new nestjs_utility_services_1.OperationException(`EmitHook DELETE ${path} failed : ${response.status}`);
|
|
53
|
+
}
|
|
54
|
+
async listMessages(alias, cursor) {
|
|
55
|
+
const params = new URLSearchParams();
|
|
56
|
+
if (cursor)
|
|
57
|
+
params.set('cursor', cursor);
|
|
58
|
+
const query = params.toString();
|
|
59
|
+
const path = `/v1/aliases/${encodeURIComponent(alias)}/messages${query ? `?${query}` : ''}`;
|
|
60
|
+
const response = await this.request({ method: 'GET', path });
|
|
61
|
+
if (!response.success || !response.data)
|
|
62
|
+
throw new nestjs_utility_services_1.OperationException(`EmitHook GET ${path} failed : ${response.status}`);
|
|
63
|
+
const body = response.data;
|
|
64
|
+
const data = Array.isArray(body) ? body : body.data;
|
|
65
|
+
return { data: Array.isArray(data) ? data : [], next_cursor: Array.isArray(body) ? null : body.next_cursor || null };
|
|
66
|
+
}
|
|
67
|
+
async getMessage(alias, messageId) {
|
|
68
|
+
const path = `/v1/aliases/${encodeURIComponent(alias)}/messages/${encodeURIComponent(messageId)}`;
|
|
69
|
+
const response = await this.request({ method: 'GET', path });
|
|
70
|
+
if (!response.success || !response.data)
|
|
71
|
+
throw new nestjs_utility_services_1.OperationException(`EmitHook GET ${path} failed : ${response.status}`);
|
|
72
|
+
return response.data;
|
|
73
|
+
}
|
|
74
|
+
async getRaw(alias, messageId) {
|
|
75
|
+
const path = `/v1/aliases/${encodeURIComponent(alias)}/messages/${encodeURIComponent(messageId)}/raw`;
|
|
76
|
+
const response = await this.request({ method: 'GET', path, responseType: 'arraybuffer' });
|
|
77
|
+
if (!response.success)
|
|
78
|
+
throw new nestjs_utility_services_1.OperationException(`EmitHook GET ${path} failed : ${response.status}`);
|
|
79
|
+
return Buffer.from(response.data);
|
|
80
|
+
}
|
|
81
|
+
async getAttachment(alias, messageId, attachmentId) {
|
|
82
|
+
const path = `/v1/aliases/${encodeURIComponent(alias)}/messages/${encodeURIComponent(messageId)}/attachments/${encodeURIComponent(attachmentId)}`;
|
|
83
|
+
const response = await this.request({ method: 'GET', path, responseType: 'arraybuffer' });
|
|
84
|
+
if (!response.success)
|
|
85
|
+
throw new nestjs_utility_services_1.OperationException(`EmitHook GET ${path} failed : ${response.status}`);
|
|
86
|
+
return Buffer.from(response.data);
|
|
87
|
+
}
|
|
88
|
+
async request(options) {
|
|
89
|
+
const apiUrl = await this.getRequiredProperty('emithook.api.url');
|
|
90
|
+
const apiSecret = await this.getRequiredProperty('emithook.api.secret');
|
|
91
|
+
const request = {
|
|
92
|
+
method: options.method,
|
|
93
|
+
url: `${apiUrl.replace(/\/$/, '')}${options.path}`,
|
|
94
|
+
headers: { Authorization: `Bearer ${apiSecret}`, 'content-type': 'application/json' },
|
|
95
|
+
};
|
|
96
|
+
if (options.data !== undefined)
|
|
97
|
+
request.data = options.data;
|
|
98
|
+
if (options.responseType)
|
|
99
|
+
request.responseType = options.responseType;
|
|
100
|
+
return this.remoteRequestService.getRawResponse(request);
|
|
101
|
+
}
|
|
102
|
+
async getRequiredProperty(name) {
|
|
103
|
+
const value = await this.propertyService.get(name);
|
|
104
|
+
if (!value)
|
|
105
|
+
throw new nestjs_utility_services_1.OperationException(`System property ${name} is not configured`);
|
|
106
|
+
return value;
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
exports.EmithookService = EmithookService;
|
|
110
|
+
exports.EmithookService = EmithookService = __decorate([
|
|
111
|
+
(0, common_1.Injectable)(),
|
|
112
|
+
__metadata("design:paramtypes", [nestjs_utility_services_1.PropertyService,
|
|
113
|
+
nestjs_utility_services_1.RemoteRequestService])
|
|
114
|
+
], EmithookService);
|
|
115
|
+
//# sourceMappingURL=emithook.service.js.map
|