@betterinternship/core 2.20.0 → 2.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface IArchiveContext {
|
|
2
|
+
sender?: string;
|
|
3
|
+
alias: string;
|
|
4
|
+
source: string;
|
|
5
|
+
to: string[];
|
|
6
|
+
cc: string[];
|
|
7
|
+
bcc: string[];
|
|
8
|
+
subject: string;
|
|
9
|
+
content: string;
|
|
10
|
+
tags?: Record<string, string>;
|
|
11
|
+
configurationSetName?: string;
|
|
12
|
+
}
|
|
13
|
+
export declare const archiveSentEmail: (context: IArchiveContext, messageId: string | undefined, attempts: number) => Promise<void>;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { randomUUID } from 'crypto';
|
|
2
|
+
import { ENV } from '../env.js';
|
|
3
|
+
let warnedMissingBucket = false;
|
|
4
|
+
let warnedMissingCredentials = false;
|
|
5
|
+
const getArchiveBucketName = () => {
|
|
6
|
+
const bucketName = ENV.EMAIL_ARCHIVE_BUCKET;
|
|
7
|
+
if (!bucketName) {
|
|
8
|
+
if (!warnedMissingBucket) {
|
|
9
|
+
console.warn('[EMAIL_ARCHIVE] EMAIL_ARCHIVE_BUCKET not set; sent emails will not be archived.');
|
|
10
|
+
warnedMissingBucket = true;
|
|
11
|
+
}
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
if (!ENV.GOOGLE_CLOUD_CREDENTIALS || !ENV.GOOGLE_CLOUD_PROJECT_ID) {
|
|
15
|
+
if (!warnedMissingCredentials) {
|
|
16
|
+
console.error('[ERROR:EMAIL_ARCHIVE] EMAIL_ARCHIVE_BUCKET is set but GOOGLE_CLOUD_CREDENTIALS/GOOGLE_CLOUD_PROJECT_ID are missing; sent emails will not be archived.');
|
|
17
|
+
warnedMissingCredentials = true;
|
|
18
|
+
}
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
return bucketName;
|
|
22
|
+
};
|
|
23
|
+
let _bucket = null;
|
|
24
|
+
const getArchiveBucket = async (bucketName) => {
|
|
25
|
+
if (!_bucket) {
|
|
26
|
+
const { Storage } = await import('@google-cloud/storage');
|
|
27
|
+
const credentials = JSON.parse(ENV.GOOGLE_CLOUD_CREDENTIALS);
|
|
28
|
+
_bucket = new Storage({
|
|
29
|
+
projectId: ENV.GOOGLE_CLOUD_PROJECT_ID,
|
|
30
|
+
credentials,
|
|
31
|
+
}).bucket(bucketName);
|
|
32
|
+
}
|
|
33
|
+
return _bucket;
|
|
34
|
+
};
|
|
35
|
+
const buildObjectKey = (sentAt, idForKey) => {
|
|
36
|
+
const iso = sentAt.toISOString();
|
|
37
|
+
const [year, month, day] = iso.slice(0, 10).split('-');
|
|
38
|
+
const sanitizedTimestamp = iso.replace(/[:.]/g, '-');
|
|
39
|
+
const key = `email-archive/${year}/${month}/${day}/${sanitizedTimestamp}_${idForKey}.json`;
|
|
40
|
+
return ENV.NODE_ENV !== 'production' ? `debug/${key}` : key;
|
|
41
|
+
};
|
|
42
|
+
const recordArchiveEvent = async (event) => {
|
|
43
|
+
if (!ENV.DATABASE_URL) {
|
|
44
|
+
console.warn('[EMAIL_ARCHIVE] DATABASE_URL not set; archive event not recorded.');
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const { internalDb } = await import('@betterinternship/schema');
|
|
49
|
+
await internalDb
|
|
50
|
+
.insertInto('internal.email_delivery_events')
|
|
51
|
+
.values({
|
|
52
|
+
event_type: 'send_success',
|
|
53
|
+
recipient_email: event.recipient,
|
|
54
|
+
feedback_id: event.feedbackId,
|
|
55
|
+
attempts: event.attempts,
|
|
56
|
+
correlation_type: event.correlationDetail ? 'email_archive' : null,
|
|
57
|
+
correlation_detail: event.correlationDetail,
|
|
58
|
+
})
|
|
59
|
+
.execute();
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
console.error('[ERROR:EMAIL_ARCHIVE] Could not record archive event.', error);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
export const archiveSentEmail = async (context, messageId, attempts) => {
|
|
66
|
+
const bucketName = getArchiveBucketName();
|
|
67
|
+
if (!bucketName)
|
|
68
|
+
return;
|
|
69
|
+
const sentAt = new Date();
|
|
70
|
+
const idForKey = messageId ?? randomUUID();
|
|
71
|
+
const key = buildObjectKey(sentAt, idForKey);
|
|
72
|
+
const payload = {
|
|
73
|
+
message_id: messageId ?? null,
|
|
74
|
+
sent_at: sentAt.toISOString(),
|
|
75
|
+
service: ENV.EMAIL_ARCHIVE_SERVICE,
|
|
76
|
+
attempts,
|
|
77
|
+
source: context.source,
|
|
78
|
+
sender: context.sender ?? null,
|
|
79
|
+
alias: context.alias,
|
|
80
|
+
to: context.to,
|
|
81
|
+
cc: context.cc,
|
|
82
|
+
bcc: context.bcc,
|
|
83
|
+
subject: context.subject,
|
|
84
|
+
content: context.content,
|
|
85
|
+
tags: context.tags,
|
|
86
|
+
configuration_set_name: context.configurationSetName ?? null,
|
|
87
|
+
};
|
|
88
|
+
let uploadedKey = null;
|
|
89
|
+
try {
|
|
90
|
+
const bucket = await getArchiveBucket(bucketName);
|
|
91
|
+
await bucket.file(key).save(JSON.stringify(payload, null, 2), {
|
|
92
|
+
contentType: 'application/json',
|
|
93
|
+
resumable: false,
|
|
94
|
+
});
|
|
95
|
+
uploadedKey = key;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
console.error('[ERROR:EMAIL_ARCHIVE] Could not upload archive object.', error);
|
|
99
|
+
}
|
|
100
|
+
await recordArchiveEvent({
|
|
101
|
+
recipient: context.to[0],
|
|
102
|
+
feedbackId: idForKey,
|
|
103
|
+
attempts,
|
|
104
|
+
correlationDetail: uploadedKey,
|
|
105
|
+
});
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=archive.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"archive.js","sourceRoot":"","sources":["../../../lib/email/archive.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/email/email.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { SendEmailCommand, SESClient, } from '@aws-sdk/client-ses';
|
|
2
2
|
import { randomUUID } from 'crypto';
|
|
3
3
|
import { ENV } from '../env.js';
|
|
4
|
+
import { archiveSentEmail } from './archive.js';
|
|
4
5
|
let _sesClient = null;
|
|
5
6
|
const getSesClient = () => {
|
|
6
7
|
if (!_sesClient) {
|
|
@@ -71,13 +72,14 @@ const toSesTags = (tags) => Object.entries(tags).map(([name, value]) => ({
|
|
|
71
72
|
Name: name,
|
|
72
73
|
Value: value.trim().slice(0, 256).replaceAll(' ', ''),
|
|
73
74
|
}));
|
|
74
|
-
const sendWithRetries = async (params, logRecipients) => {
|
|
75
|
+
const sendWithRetries = async (params, logRecipients, archiveContext) => {
|
|
75
76
|
const maxAttempts = getMaxAttempts();
|
|
76
77
|
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
77
78
|
try {
|
|
78
79
|
const command = new SendEmailCommand(params);
|
|
79
80
|
const result = await getSesClient().send(command);
|
|
80
81
|
console.warn('[AWSSES] Email sent to ' + logRecipients.join(', '));
|
|
82
|
+
void archiveSentEmail(archiveContext, result.MessageId, attempt).catch((error) => console.error('[ERROR:EMAIL_ARCHIVE] Archive failed.', error));
|
|
81
83
|
return {
|
|
82
84
|
messageId: result.MessageId,
|
|
83
85
|
response: 'Successfully sent via Amazon SES.',
|
|
@@ -108,6 +110,7 @@ export const sendMultiEmail = async ({ sender, subject, to, cc, bcc, content, al
|
|
|
108
110
|
const ccRecipients = normalizeRecipients(cc);
|
|
109
111
|
const bccRecipients = normalizeRecipients(bcc);
|
|
110
112
|
const logRecipients = [...toRecipients, ...ccRecipients, ...bccRecipients];
|
|
113
|
+
const source = `"${sender ?? 'BetterInternship'}" <${alias}@betterinternship.com>`;
|
|
111
114
|
const params = {
|
|
112
115
|
Destination: {
|
|
113
116
|
ToAddresses: toRecipients,
|
|
@@ -120,11 +123,23 @@ export const sendMultiEmail = async ({ sender, subject, to, cc, bcc, content, al
|
|
|
120
123
|
Html: { Data: content },
|
|
121
124
|
},
|
|
122
125
|
},
|
|
123
|
-
Source:
|
|
126
|
+
Source: source,
|
|
124
127
|
ConfigurationSetName: configurationSetName,
|
|
125
128
|
Tags: tags ? toSesTags(tags) : undefined,
|
|
126
129
|
};
|
|
127
|
-
|
|
130
|
+
const archiveContext = {
|
|
131
|
+
sender,
|
|
132
|
+
alias,
|
|
133
|
+
source,
|
|
134
|
+
to: toRecipients,
|
|
135
|
+
cc: ccRecipients,
|
|
136
|
+
bcc: bccRecipients,
|
|
137
|
+
subject,
|
|
138
|
+
content,
|
|
139
|
+
tags,
|
|
140
|
+
configurationSetName,
|
|
141
|
+
};
|
|
142
|
+
return await sendWithRetries(params, logRecipients, archiveContext);
|
|
128
143
|
};
|
|
129
144
|
export const sendSingleEmail = async (params) => {
|
|
130
145
|
if (!normalizeRecipients(params.recipient).length) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../../lib/email/email.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../../lib/email/email.ts"],"names":[],"mappings":"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"}
|