@adtrackify/at-service-common 3.18.15 → 3.18.17
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/cjs/__tests__/helpers/acuity-helper.spec.js +4 -1
- package/dist/cjs/__tests__/helpers/acuity-helper.spec.js.map +1 -1
- package/dist/cjs/__tests__/libs/contacts.spec.js +7 -3
- package/dist/cjs/__tests__/libs/contacts.spec.js.map +1 -1
- package/dist/cjs/__tests__/services/email-verification/contact-email-verification-service.spec.js +94 -0
- package/dist/cjs/__tests__/services/email-verification/contact-email-verification-service.spec.js.map +1 -0
- package/dist/cjs/__tests__/services/email-verification/email-verification-service.spec.js +7 -2
- package/dist/cjs/__tests__/services/email-verification/email-verification-service.spec.js.map +1 -1
- package/dist/cjs/helpers/acuity-helper.js.map +1 -1
- package/dist/cjs/libs/contacts.js +53 -33
- package/dist/cjs/libs/contacts.js.map +1 -1
- package/dist/cjs/libs/emails.js +3 -0
- package/dist/cjs/libs/emails.js.map +1 -1
- package/dist/cjs/services/email-verification/contact-email-verification-service.d.ts +7 -0
- package/dist/cjs/services/email-verification/contact-email-verification-service.js +102 -0
- package/dist/cjs/services/email-verification/contact-email-verification-service.js.map +1 -0
- package/dist/cjs/services/email-verification/email-verification-service.d.ts +4 -2
- package/dist/cjs/services/email-verification/email-verification-service.js +71 -32
- package/dist/cjs/services/email-verification/email-verification-service.js.map +1 -1
- package/dist/cjs/services/email-verification/index.d.ts +1 -1
- package/dist/cjs/services/email-verification/index.js +1 -1
- package/dist/cjs/services/email-verification/index.js.map +1 -1
- package/dist/esm/__tests__/helpers/acuity-helper.spec.js +5 -2
- package/dist/esm/__tests__/helpers/acuity-helper.spec.js.map +1 -1
- package/dist/esm/__tests__/libs/contacts.spec.js +8 -4
- package/dist/esm/__tests__/libs/contacts.spec.js.map +1 -1
- package/dist/esm/__tests__/services/email-verification/contact-email-verification-service.spec.js +92 -0
- package/dist/esm/__tests__/services/email-verification/contact-email-verification-service.spec.js.map +1 -0
- package/dist/esm/__tests__/services/email-verification/email-verification-service.spec.js +7 -2
- package/dist/esm/__tests__/services/email-verification/email-verification-service.spec.js.map +1 -1
- package/dist/esm/helpers/acuity-helper.js +1 -1
- package/dist/esm/helpers/acuity-helper.js.map +1 -1
- package/dist/esm/libs/contacts.js +53 -33
- package/dist/esm/libs/contacts.js.map +1 -1
- package/dist/esm/libs/emails.js +3 -0
- package/dist/esm/libs/emails.js.map +1 -1
- package/dist/esm/services/email-verification/contact-email-verification-service.d.ts +7 -0
- package/dist/esm/services/email-verification/contact-email-verification-service.js +98 -0
- package/dist/esm/services/email-verification/contact-email-verification-service.js.map +1 -0
- package/dist/esm/services/email-verification/email-verification-service.d.ts +4 -2
- package/dist/esm/services/email-verification/email-verification-service.js +71 -32
- package/dist/esm/services/email-verification/email-verification-service.js.map +1 -1
- package/dist/esm/services/email-verification/index.d.ts +1 -1
- package/dist/esm/services/email-verification/index.js +1 -1
- package/dist/esm/services/email-verification/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/cjs/__tests__/services/email-verification/contact-email-verifier.spec.js +0 -77
- package/dist/cjs/__tests__/services/email-verification/contact-email-verifier.spec.js.map +0 -1
- package/dist/cjs/services/email-verification/contact-email-verifier.d.ts +0 -4
- package/dist/cjs/services/email-verification/contact-email-verifier.js +0 -61
- package/dist/cjs/services/email-verification/contact-email-verifier.js.map +0 -1
- package/dist/esm/__tests__/services/email-verification/contact-email-verifier.spec.js +0 -75
- package/dist/esm/__tests__/services/email-verification/contact-email-verifier.spec.js.map +0 -1
- package/dist/esm/services/email-verification/contact-email-verifier.d.ts +0 -4
- package/dist/esm/services/email-verification/contact-email-verifier.js +0 -56
- package/dist/esm/services/email-verification/contact-email-verifier.js.map +0 -1
- /package/dist/cjs/__tests__/services/email-verification/{contact-email-verifier.spec.d.ts → contact-email-verification-service.spec.d.ts} +0 -0
- /package/dist/esm/__tests__/services/email-verification/{contact-email-verifier.spec.d.ts → contact-email-verification-service.spec.d.ts} +0 -0
|
@@ -29,12 +29,14 @@ export const buildThirdPartyTraits = (contacts, sourceId, contactGroupId) => {
|
|
|
29
29
|
};
|
|
30
30
|
export const normalizeThirdPartyContacts = (contacts) => {
|
|
31
31
|
try {
|
|
32
|
-
return contacts.map((contact) =>
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
32
|
+
return contacts.map((contact) => {
|
|
33
|
+
return {
|
|
34
|
+
...contact,
|
|
35
|
+
emailAddress: contact.emailAddress?.trim()?.toLowerCase(),
|
|
36
|
+
firstName: contact?.firstName ? capitalizeEachWord(contact?.firstName?.trim()) : undefined,
|
|
37
|
+
lastName: contact?.lastName ? capitalizeEachWord(contact?.lastName?.trim()) : undefined,
|
|
38
|
+
};
|
|
39
|
+
});
|
|
38
40
|
}
|
|
39
41
|
catch (error) {
|
|
40
42
|
Logger.error('Failed to normalize third party contacts', { error });
|
|
@@ -42,7 +44,7 @@ export const normalizeThirdPartyContacts = (contacts) => {
|
|
|
42
44
|
}
|
|
43
45
|
};
|
|
44
46
|
export const removeDuplicateContactsByEmail = (contacts, emailKey) => {
|
|
45
|
-
return contacts.filter((contact, index, self) => index === self.findIndex((
|
|
47
|
+
return contacts.filter((contact, index, self) => index === self.findIndex((t) => t[emailKey] === contact[emailKey]));
|
|
46
48
|
};
|
|
47
49
|
export const removeInvalidContactsByEmail = (contacts, emailKey) => {
|
|
48
50
|
return contacts.filter((contact) => contact[emailKey] && contact?.[emailKey]?.trim() !== '' && validateEmail(contact[emailKey]));
|
|
@@ -54,30 +56,43 @@ export const removeDuplicateNonDottedGmailContacts = (contacts) => {
|
|
|
54
56
|
}
|
|
55
57
|
const uniqueContacts = [];
|
|
56
58
|
for (const contact of contacts) {
|
|
57
|
-
if (!contact.emailAddress
|
|
59
|
+
if (!contact.emailAddress) {
|
|
58
60
|
uniqueContacts.push(contact);
|
|
59
|
-
continue;
|
|
60
61
|
}
|
|
61
|
-
|
|
62
|
-
const normalizedEmail = normalizeGmailAddress(contact.emailAddress);
|
|
63
|
-
const existingIndex = uniqueContacts.findIndex((existing) => existing.emailAddress &&
|
|
64
|
-
normalizeGmailAddress(existing.emailAddress) === normalizedEmail &&
|
|
65
|
-
existing.emailAddress !== contact.emailAddress);
|
|
66
|
-
if (existingIndex === -1) {
|
|
62
|
+
else if (!contact?.emailAddress?.includes('@gmail.com')) {
|
|
67
63
|
uniqueContacts.push(contact);
|
|
68
|
-
continue;
|
|
69
|
-
}
|
|
70
|
-
const existingContact = uniqueContacts[existingIndex];
|
|
71
|
-
const existingIsDotted = existingContact.emailAddress?.split('@')[0]?.includes('.');
|
|
72
|
-
if (localPart.includes('.') && !existingIsDotted) {
|
|
73
|
-
Logger.info('Replacing non-dotted Gmail with dotted Gmail contact', { replacing: existingContact, with: contact });
|
|
74
|
-
uniqueContacts.splice(existingIndex, 1, contact);
|
|
75
64
|
}
|
|
76
65
|
else {
|
|
77
|
-
|
|
66
|
+
const parts = contact?.emailAddress?.split('@') ?? [];
|
|
67
|
+
const localPart = parts[0];
|
|
68
|
+
const normalizedEmail = normalizeGmailAddress(contact.emailAddress);
|
|
69
|
+
const existingIndex = uniqueContacts.findIndex((x) => x.emailAddress &&
|
|
70
|
+
normalizeGmailAddress(x.emailAddress) === normalizedEmail &&
|
|
71
|
+
x.emailAddress !== contact.emailAddress);
|
|
72
|
+
const isDotted = localPart.includes('.');
|
|
73
|
+
if (existingIndex !== -1) {
|
|
74
|
+
const existingContact = uniqueContacts[existingIndex];
|
|
75
|
+
const existingIsDotted = existingContact.emailAddress?.split('@')[0]?.includes('.');
|
|
76
|
+
if (isDotted && !existingIsDotted) {
|
|
77
|
+
Logger.info('contact acquisition - Replacing non-dotted Gmail with dotted Gmail contact', {
|
|
78
|
+
replacing: existingContact,
|
|
79
|
+
with: contact,
|
|
80
|
+
});
|
|
81
|
+
uniqueContacts.splice(existingIndex, 1, contact);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
Logger.info('contact acquisition - Duplicate Gmail contact found -- skipping', {
|
|
85
|
+
contact,
|
|
86
|
+
existingContact,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
uniqueContacts.push(contact);
|
|
92
|
+
}
|
|
78
93
|
}
|
|
79
94
|
}
|
|
80
|
-
Logger.info('Removed non-dotted duplicate gmail contacts', {
|
|
95
|
+
Logger.info('contact acquisition - Removed non-dotted duplicate gmail contacts', {
|
|
81
96
|
originalCount: contacts.length,
|
|
82
97
|
uniqueCount: uniqueContacts.length,
|
|
83
98
|
removedCount: contacts.length - uniqueContacts.length,
|
|
@@ -85,7 +100,7 @@ export const removeDuplicateNonDottedGmailContacts = (contacts) => {
|
|
|
85
100
|
return uniqueContacts;
|
|
86
101
|
}
|
|
87
102
|
catch (error) {
|
|
88
|
-
Logger.error('Failed to remove non-dotted duplicate gmail contacts', { error });
|
|
103
|
+
Logger.error('contact acquisition - Failed to remove non-dotted duplicate gmail contacts', { error });
|
|
89
104
|
return contacts;
|
|
90
105
|
}
|
|
91
106
|
};
|
|
@@ -94,7 +109,7 @@ export const removeDuplicateDottedEmailVariationContacts = (contacts) => {
|
|
|
94
109
|
if (!contacts || contacts.length === 0) {
|
|
95
110
|
return contacts;
|
|
96
111
|
}
|
|
97
|
-
const seenNormalizedEmails = new
|
|
112
|
+
const seenNormalizedEmails = new Map();
|
|
98
113
|
const uniqueContacts = [];
|
|
99
114
|
for (const contact of contacts) {
|
|
100
115
|
if (!contact.emailAddress) {
|
|
@@ -102,14 +117,19 @@ export const removeDuplicateDottedEmailVariationContacts = (contacts) => {
|
|
|
102
117
|
continue;
|
|
103
118
|
}
|
|
104
119
|
const normalizedEmail = normalizeGmailAddress(contact.emailAddress);
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
120
|
+
contact.emailAddress = normalizedEmail;
|
|
121
|
+
if (!seenNormalizedEmails.has(normalizedEmail)) {
|
|
122
|
+
seenNormalizedEmails.set(normalizedEmail, contact);
|
|
123
|
+
uniqueContacts.push(contact);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
Logger.info('contact acquisition - Duplicate dotted email gmail variation found -- skipping', {
|
|
127
|
+
contact,
|
|
128
|
+
normalizedEmail,
|
|
129
|
+
});
|
|
108
130
|
}
|
|
109
|
-
seenNormalizedEmails.add(normalizedEmail);
|
|
110
|
-
uniqueContacts.push({ ...contact, emailAddress: normalizedEmail });
|
|
111
131
|
}
|
|
112
|
-
Logger.info('Removed duplicate dotted email variations', {
|
|
132
|
+
Logger.info('contact acquisition - Removed duplicate dotted email variations', {
|
|
113
133
|
originalCount: contacts.length,
|
|
114
134
|
uniqueCount: uniqueContacts.length,
|
|
115
135
|
removedCount: contacts.length - uniqueContacts.length,
|
|
@@ -117,7 +137,7 @@ export const removeDuplicateDottedEmailVariationContacts = (contacts) => {
|
|
|
117
137
|
return uniqueContacts;
|
|
118
138
|
}
|
|
119
139
|
catch (error) {
|
|
120
|
-
Logger.error('Failed to remove duplicate dotted email variations', { error });
|
|
140
|
+
Logger.error('contact acquisition - Failed to remove duplicate dotted email variations', { error });
|
|
121
141
|
return contacts;
|
|
122
142
|
}
|
|
123
143
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../../src/libs/contacts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAO7C,MAAM,CAAC,MAAM,qBAAqB,GAAG,
|
|
1
|
+
{"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../../src/libs/contacts.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/libs/emails.js
CHANGED
|
@@ -111,6 +111,7 @@ export const blacklistedEmailDomains = [
|
|
|
111
111
|
'consolidated.net',
|
|
112
112
|
'consolidated.com',
|
|
113
113
|
'consolidated.org',
|
|
114
|
+
'consolidated.org',
|
|
114
115
|
'cicmed.org',
|
|
115
116
|
'netzero.net',
|
|
116
117
|
'netzero.com',
|
|
@@ -125,12 +126,14 @@ export const blacklistedEmailDomains = [
|
|
|
125
126
|
'mailinator.com',
|
|
126
127
|
'yopmail.com',
|
|
127
128
|
'maildrop.cc',
|
|
129
|
+
'maildrop.cc',
|
|
128
130
|
'mailnesia.com',
|
|
129
131
|
'guerrillamail.com',
|
|
130
132
|
'guerrillamailblock.com',
|
|
131
133
|
'guerrillamail.org',
|
|
132
134
|
'guerrillamail.net',
|
|
133
135
|
'guerrillamail.biz',
|
|
136
|
+
'guerrillamail.com',
|
|
134
137
|
];
|
|
135
138
|
export const isDisposableEmail = (email) => {
|
|
136
139
|
return disposableEmailDomains.some((domain) => email.includes(domain));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emails.js","sourceRoot":"","sources":["../../../src/libs/emails.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"emails.js","sourceRoot":"","sources":["../../../src/libs/emails.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { EmailableVerifyEmailResponse, ThirdPartyContact } from '@adtrackify/at-tracking-event-types';
|
|
2
|
+
export declare class ContactEmailVerificationService {
|
|
3
|
+
private emailVerificationService;
|
|
4
|
+
constructor(cacheLambdaFunctionArn: string, emailableApiKey: string);
|
|
5
|
+
verifyContactEmail: (contact: ThirdPartyContact, email: string, forceVerify?: boolean) => Promise<EmailableVerifyEmailResponse | null>;
|
|
6
|
+
verifyContactsEmail: (contacts: ThirdPartyContact[]) => Promise<ThirdPartyContact[] | null>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { EMAIL_STATUS } from '@adtrackify/at-tracking-event-types';
|
|
2
|
+
import { Logger } from '../../helpers';
|
|
3
|
+
import { isBlacklistedEmail, isDisposableEmail, isYahooEmail, validateEmail } from '../../libs/emails.js';
|
|
4
|
+
import { EmailVerificationService } from './email-verification-service.js';
|
|
5
|
+
export class ContactEmailVerificationService {
|
|
6
|
+
emailVerificationService;
|
|
7
|
+
constructor(cacheLambdaFunctionArn, emailableApiKey) {
|
|
8
|
+
this.emailVerificationService = new EmailVerificationService(cacheLambdaFunctionArn, emailableApiKey);
|
|
9
|
+
}
|
|
10
|
+
verifyContactEmail = async (contact, email, forceVerify = false) => {
|
|
11
|
+
try {
|
|
12
|
+
if (!validateEmail(email)) {
|
|
13
|
+
Logger.error('contact acquisition - Email is invalid', { contact, email });
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
if (isBlacklistedEmail(email)) {
|
|
17
|
+
Logger.error('contact acquisition - Email is a blacklisted email', { contact, email });
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
if (isDisposableEmail(email)) {
|
|
21
|
+
Logger.error('contact acquisition - Email is a disposable email', { contact, email });
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
if (isYahooEmail(email) && !forceVerify) {
|
|
25
|
+
Logger.info('contact acquisition - Email is a yahoo email', { contact, email });
|
|
26
|
+
const emailVerification = {
|
|
27
|
+
state: EMAIL_STATUS.RISKY,
|
|
28
|
+
email: email,
|
|
29
|
+
reason: 'Yahoo email - riskier than other emails',
|
|
30
|
+
};
|
|
31
|
+
return emailVerification;
|
|
32
|
+
}
|
|
33
|
+
const emailVerificationResponse = await this.emailVerificationService.getEmailVerificationWithCaching(email);
|
|
34
|
+
if (!emailVerificationResponse || !emailVerificationResponse.emailVerification) {
|
|
35
|
+
Logger.error('contact acquisition - No response from email verification service', {
|
|
36
|
+
contact,
|
|
37
|
+
email,
|
|
38
|
+
emailVerificationResponse,
|
|
39
|
+
});
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
Logger.info('contact acquisition - Email verification response', { contact, email, emailVerificationResponse });
|
|
43
|
+
const emailVerification = emailVerificationResponse.emailVerification;
|
|
44
|
+
if (emailVerification.state === EMAIL_STATUS.DELIVERABLE) {
|
|
45
|
+
Logger.info('contact acquisition - Email verification is deliverable', { contact, email, emailVerification });
|
|
46
|
+
return emailVerification;
|
|
47
|
+
}
|
|
48
|
+
if (emailVerification.state === EMAIL_STATUS.RISKY) {
|
|
49
|
+
Logger.warn('contact acquisition - Email verification is risky', { contact, email, emailVerification });
|
|
50
|
+
return emailVerification;
|
|
51
|
+
}
|
|
52
|
+
if (emailVerification.state === EMAIL_STATUS.UNDELIVERABLE) {
|
|
53
|
+
Logger.warn('contact acquisition - Email verification is undeliverable', { contact, email, emailVerification });
|
|
54
|
+
return emailVerification;
|
|
55
|
+
}
|
|
56
|
+
if (emailVerification.state === EMAIL_STATUS.UNKNOWN) {
|
|
57
|
+
Logger.warn('contact acquisition - Email verification is unknown', { contact, email, emailVerification });
|
|
58
|
+
return emailVerification;
|
|
59
|
+
}
|
|
60
|
+
if (emailVerification.state === EMAIL_STATUS.NO_EMAIL) {
|
|
61
|
+
Logger.warn('contact acquisition - Email verification is no email', { contact, email, emailVerification });
|
|
62
|
+
return emailVerification;
|
|
63
|
+
}
|
|
64
|
+
Logger.info('contact acquisition - Email verification', { contact, email, emailVerification });
|
|
65
|
+
return emailVerification;
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
Logger.error('contact acquisition - Failed to verify contact email', { error });
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
verifyContactsEmail = async (contacts) => {
|
|
73
|
+
try {
|
|
74
|
+
const verifiedContacts = [];
|
|
75
|
+
for (let i = 0; i < contacts.length; i++) {
|
|
76
|
+
const contact = contacts[i];
|
|
77
|
+
const email = contact.emailAddress;
|
|
78
|
+
if (email) {
|
|
79
|
+
const emailVerification = await this.verifyContactEmail(contact, email);
|
|
80
|
+
if (emailVerification) {
|
|
81
|
+
contact.emailVerification = emailVerification;
|
|
82
|
+
verifiedContacts.push(contact);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
Logger.warn('contact acquisition - No email found for contact -- skipping', { contact });
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return verifiedContacts;
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
Logger.error('contact acquisition - Failed to verify contact emails', { error });
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=contact-email-verification-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contact-email-verification-service.js","sourceRoot":"","sources":["../../../../src/services/email-verification/contact-email-verification-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,9 @@ export declare class EmailVerificationService {
|
|
|
11
11
|
private emailableClient;
|
|
12
12
|
constructor(cacheLambdaFunctionArn: string, emailableApiKey: string);
|
|
13
13
|
getEmailVerificationWithCaching: (email: string) => Promise<EmailVerificationCache | undefined>;
|
|
14
|
-
getEmailVerificationFromCache
|
|
15
|
-
|
|
14
|
+
getEmailVerificationFromCache(email: string): Promise<EmailVerificationCache | undefined>;
|
|
15
|
+
deleteEmailVerificationCache(email: string): Promise<void>;
|
|
16
|
+
setEmailVerificationCache(email: string, emailVerificationCache: EmailVerificationCache): Promise<void>;
|
|
17
|
+
private getEmailVerificationCache;
|
|
16
18
|
private verifyEmail;
|
|
17
19
|
}
|
|
@@ -12,29 +12,36 @@ export class EmailVerificationService {
|
|
|
12
12
|
}
|
|
13
13
|
getEmailVerificationWithCaching = async (email) => {
|
|
14
14
|
try {
|
|
15
|
+
let shouldUpdateCache = false;
|
|
15
16
|
if (!email) {
|
|
16
|
-
Logger.error('getEmailVerificationWithCaching -
|
|
17
|
+
Logger.error('getEmailVerificationWithCaching -No email', { email });
|
|
17
18
|
return undefined;
|
|
18
19
|
}
|
|
19
|
-
|
|
20
|
-
if (
|
|
21
|
-
Logger.info('email verification cache hit', { email,
|
|
22
|
-
return
|
|
20
|
+
let cacheResponse = await this.getEmailVerificationFromCache(email);
|
|
21
|
+
if (cacheResponse && cacheResponse?.emailVerification) {
|
|
22
|
+
Logger.info('email verification cache hit', { email, cacheResponse });
|
|
23
|
+
return cacheResponse;
|
|
23
24
|
}
|
|
24
|
-
Logger.info('email verification cache miss - fetching from emailable api', { email });
|
|
25
|
+
Logger.info('email verification cache miss - fetching from emailable api service', { email });
|
|
25
26
|
const emailVerification = await this.verifyEmail(email);
|
|
26
|
-
if (
|
|
27
|
-
|
|
27
|
+
if (emailVerification) {
|
|
28
|
+
const emailVerificationCache = {
|
|
29
|
+
email,
|
|
30
|
+
emailVerification,
|
|
31
|
+
createdAt: getCurrentTimestamp(),
|
|
32
|
+
updatedAt: getCurrentTimestamp(),
|
|
33
|
+
expiresAt: Date.now() + EMAIL_VERIFICATION_CACHE_TTL_IN_SECONDS * 1000,
|
|
34
|
+
};
|
|
35
|
+
shouldUpdateCache = true;
|
|
36
|
+
cacheResponse = emailVerificationCache;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
Logger.error('Failed to getEmailVerification from emailable api service', { email, emailVerification });
|
|
28
40
|
return undefined;
|
|
29
41
|
}
|
|
30
|
-
|
|
31
|
-
email,
|
|
32
|
-
|
|
33
|
-
createdAt: getCurrentTimestamp(),
|
|
34
|
-
updatedAt: getCurrentTimestamp(),
|
|
35
|
-
expiresAt: Date.now() + EMAIL_VERIFICATION_CACHE_TTL_IN_SECONDS * 1000,
|
|
36
|
-
};
|
|
37
|
-
await this.setEmailVerificationCache(email, cacheResponse);
|
|
42
|
+
if (cacheResponse && shouldUpdateCache) {
|
|
43
|
+
await this.setEmailVerificationCache(email, cacheResponse);
|
|
44
|
+
}
|
|
38
45
|
return cacheResponse;
|
|
39
46
|
}
|
|
40
47
|
catch (error) {
|
|
@@ -42,46 +49,78 @@ export class EmailVerificationService {
|
|
|
42
49
|
return undefined;
|
|
43
50
|
}
|
|
44
51
|
};
|
|
45
|
-
|
|
52
|
+
async getEmailVerificationFromCache(email) {
|
|
46
53
|
try {
|
|
47
54
|
if (!email) {
|
|
48
55
|
return undefined;
|
|
49
56
|
}
|
|
50
57
|
const cacheKey = `emailVerification_${email}`;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
58
|
+
Logger.info(' try email verification cache lookup with email', { cacheKey, email });
|
|
59
|
+
const cachedEmailVerificationResponse = await this.getEmailVerificationCache(cacheKey);
|
|
60
|
+
if (!cachedEmailVerificationResponse) {
|
|
61
|
+
return undefined;
|
|
54
62
|
}
|
|
55
|
-
|
|
63
|
+
Logger.info(' found cached email verification', { email, cacheKey, cachedEmailVerificationResponse });
|
|
64
|
+
return cachedEmailVerificationResponse;
|
|
56
65
|
}
|
|
57
|
-
catch (
|
|
58
|
-
Logger.error('Error while getting email verification from cache', {
|
|
66
|
+
catch (err) {
|
|
67
|
+
Logger.error('Error while getting email verification from cache', { err, email });
|
|
59
68
|
return undefined;
|
|
60
69
|
}
|
|
61
|
-
}
|
|
62
|
-
|
|
70
|
+
}
|
|
71
|
+
async deleteEmailVerificationCache(email) {
|
|
72
|
+
try {
|
|
73
|
+
if (!email) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const deleteCacheCommands = [];
|
|
77
|
+
deleteCacheCommands.push({
|
|
78
|
+
cacheKey: `emailVerification_${email}`,
|
|
79
|
+
commandType: 'delete',
|
|
80
|
+
});
|
|
81
|
+
await this.cacheLambdaClient.batchInvoke(deleteCacheCommands);
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
Logger.error('Error while deleting email verification cache', { err, email });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async setEmailVerificationCache(email, emailVerificationCache) {
|
|
63
88
|
try {
|
|
64
89
|
if (!email || !emailVerificationCache) {
|
|
65
90
|
return;
|
|
66
91
|
}
|
|
67
92
|
const cacheKey = `emailVerification_${email}`;
|
|
93
|
+
Logger.info('setEmailVerificationCache', { email, emailVerificationCache });
|
|
68
94
|
await this.cacheLambdaClient.invokeSet(cacheKey, JSON.stringify(emailVerificationCache), EMAIL_VERIFICATION_CACHE_TTL_IN_SECONDS);
|
|
69
95
|
}
|
|
70
96
|
catch (error) {
|
|
71
|
-
Logger.error('Error while updating email verification cache', { error, email, emailVerificationCache });
|
|
97
|
+
Logger.error('Error while updating email verification cache redis', { error, email, emailVerificationCache });
|
|
72
98
|
}
|
|
99
|
+
}
|
|
100
|
+
getEmailVerificationCache = async (cacheKey) => {
|
|
101
|
+
const start = performance.now();
|
|
102
|
+
const cacheResponse = await this.cacheLambdaClient.invokeGet(cacheKey);
|
|
103
|
+
const end = performance.now();
|
|
104
|
+
Logger.info('getEmailVerificationCache', { cacheKey, cacheResponse, duration: end - start });
|
|
105
|
+
if (cacheResponse && cacheResponse.responseData) {
|
|
106
|
+
return cacheResponse.responseData;
|
|
107
|
+
}
|
|
108
|
+
return undefined;
|
|
73
109
|
};
|
|
74
110
|
verifyEmail = async (email) => {
|
|
75
111
|
try {
|
|
76
|
-
const
|
|
77
|
-
if (
|
|
78
|
-
|
|
112
|
+
const emailVerificationResponse = await this.emailableClient.verifyEmail(email);
|
|
113
|
+
if (emailVerificationResponse.status === 200) {
|
|
114
|
+
const emailVerification = emailVerificationResponse?.data;
|
|
115
|
+
return emailVerification;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
Logger.error('EmailableApiService - returned failure status', { emailVerificationResponse });
|
|
119
|
+
return null;
|
|
79
120
|
}
|
|
80
|
-
Logger.error('Emailable verification returned a failure status', { email, status: response.status });
|
|
81
|
-
return null;
|
|
82
121
|
}
|
|
83
122
|
catch (error) {
|
|
84
|
-
Logger.error('
|
|
123
|
+
Logger.error('EmailableApiService - Failed to verify email', { error });
|
|
85
124
|
return null;
|
|
86
125
|
}
|
|
87
126
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email-verification-service.js","sourceRoot":"","sources":["../../../../src/services/email-verification/email-verification-service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,
|
|
1
|
+
{"version":3,"file":"email-verification-service.js","sourceRoot":"","sources":["../../../../src/services/email-verification/email-verification-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export * from './email-verification-service.js';
|
|
2
|
-
export * from './contact-email-
|
|
2
|
+
export * from './contact-email-verification-service.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/email-verification/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC;AAChD,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/services/email-verification/index.ts"],"names":[],"mappings":"AAAA,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const at_tracking_event_types_1 = require("@adtrackify/at-tracking-event-types");
|
|
4
|
-
const emails_1 = require("../../../libs/emails");
|
|
5
|
-
const contact_email_verifier_1 = require("../../../services/email-verification/contact-email-verifier");
|
|
6
|
-
const createTestContact = (emailAddress, id = 'c1') => ({
|
|
7
|
-
id,
|
|
8
|
-
source: at_tracking_event_types_1.CONTACT_ACQUISITION_SOURCE.BDEX,
|
|
9
|
-
sourceId: at_tracking_event_types_1.CONTACT_SOURCE_ID.BDEX,
|
|
10
|
-
firstName: 'John',
|
|
11
|
-
lastName: 'Doe',
|
|
12
|
-
emailAddress,
|
|
13
|
-
emailStatus: at_tracking_event_types_1.EMAIL_STATUS.DELIVERABLE,
|
|
14
|
-
pixelId: 'px',
|
|
15
|
-
identityId: 'id',
|
|
16
|
-
sessionId: 'sess',
|
|
17
|
-
createdAt: '1',
|
|
18
|
-
updatedAt: '1',
|
|
19
|
-
});
|
|
20
|
-
const buildService = (impl) => ({ getEmailVerificationWithCaching: impl ?? jest.fn() });
|
|
21
|
-
describe('isBlacklistedEmail', () => {
|
|
22
|
-
it('flags blacklisted domains and passes clean ones', () => {
|
|
23
|
-
expect((0, emails_1.isBlacklistedEmail)('a@consolidated.net')).toBe(true);
|
|
24
|
-
expect((0, emails_1.isBlacklistedEmail)('a@mailinator.com')).toBe(true);
|
|
25
|
-
expect((0, emails_1.isBlacklistedEmail)('a@example.com')).toBe(false);
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
describe('verifyContactEmail', () => {
|
|
29
|
-
it('returns null for an invalid email and never calls the service', async () => {
|
|
30
|
-
const verify = jest.fn();
|
|
31
|
-
const result = await (0, contact_email_verifier_1.verifyContactEmail)(createTestContact('not-an-email'), 'not-an-email', buildService(verify));
|
|
32
|
-
expect(result).toBeNull();
|
|
33
|
-
expect(verify).not.toHaveBeenCalled();
|
|
34
|
-
});
|
|
35
|
-
it('returns null for a blacklisted email and never calls the service', async () => {
|
|
36
|
-
const verify = jest.fn();
|
|
37
|
-
const result = await (0, contact_email_verifier_1.verifyContactEmail)(createTestContact('a@consolidated.net'), 'a@consolidated.net', buildService(verify));
|
|
38
|
-
expect(result).toBeNull();
|
|
39
|
-
expect(verify).not.toHaveBeenCalled();
|
|
40
|
-
});
|
|
41
|
-
it('short-circuits a risky Yahoo email to RISKY without calling the service', async () => {
|
|
42
|
-
const verify = jest.fn();
|
|
43
|
-
const result = await (0, contact_email_verifier_1.verifyContactEmail)(createTestContact('a@yahoo.com'), 'a@yahoo.com', buildService(verify));
|
|
44
|
-
expect(result?.state).toBe(at_tracking_event_types_1.EMAIL_STATUS.RISKY);
|
|
45
|
-
expect(verify).not.toHaveBeenCalled();
|
|
46
|
-
});
|
|
47
|
-
it('verifies a Yahoo email via the service when forceVerify is true', async () => {
|
|
48
|
-
const verify = jest.fn().mockResolvedValue({ emailVerification: { state: at_tracking_event_types_1.EMAIL_STATUS.DELIVERABLE, email: 'a@yahoo.com' } });
|
|
49
|
-
const result = await (0, contact_email_verifier_1.verifyContactEmail)(createTestContact('a@yahoo.com'), 'a@yahoo.com', buildService(verify), true);
|
|
50
|
-
expect(verify).toHaveBeenCalledWith('a@yahoo.com');
|
|
51
|
-
expect(result?.state).toBe(at_tracking_event_types_1.EMAIL_STATUS.DELIVERABLE);
|
|
52
|
-
});
|
|
53
|
-
it('returns the verification result for a clean email', async () => {
|
|
54
|
-
const verify = jest.fn().mockResolvedValue({ emailVerification: { state: at_tracking_event_types_1.EMAIL_STATUS.DELIVERABLE, email: 'good@example.com' } });
|
|
55
|
-
const result = await (0, contact_email_verifier_1.verifyContactEmail)(createTestContact('good@example.com'), 'good@example.com', buildService(verify));
|
|
56
|
-
expect(verify).toHaveBeenCalledWith('good@example.com');
|
|
57
|
-
expect(result?.state).toBe(at_tracking_event_types_1.EMAIL_STATUS.DELIVERABLE);
|
|
58
|
-
});
|
|
59
|
-
it('returns null when the service yields no verification', async () => {
|
|
60
|
-
const verify = jest.fn().mockResolvedValue(undefined);
|
|
61
|
-
const result = await (0, contact_email_verifier_1.verifyContactEmail)(createTestContact('good@example.com'), 'good@example.com', buildService(verify));
|
|
62
|
-
expect(result).toBeNull();
|
|
63
|
-
});
|
|
64
|
-
});
|
|
65
|
-
describe('verifyContactsEmail', () => {
|
|
66
|
-
it('keeps verified contacts, drops failures + no-email, and does not mutate the input', async () => {
|
|
67
|
-
const verify = jest.fn(async (email) => email === 'good@example.com' ? { emailVerification: { state: at_tracking_event_types_1.EMAIL_STATUS.DELIVERABLE, email } } : undefined);
|
|
68
|
-
const good = createTestContact('good@example.com', 'good');
|
|
69
|
-
const contacts = [good, createTestContact('not-an-email', 'bad'), createTestContact(undefined, 'noemail')];
|
|
70
|
-
const result = await (0, contact_email_verifier_1.verifyContactsEmail)(contacts, buildService(verify));
|
|
71
|
-
expect(result).toHaveLength(1);
|
|
72
|
-
expect(result?.[0].id).toBe('good');
|
|
73
|
-
expect(result?.[0].emailVerification?.state).toBe(at_tracking_event_types_1.EMAIL_STATUS.DELIVERABLE);
|
|
74
|
-
expect(good.emailVerification).toBeUndefined();
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
//# sourceMappingURL=contact-email-verifier.spec.js.map
|