@social-mail/social-mail-web-server 1.5.455 → 1.7.2
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/server/model/SocialMailContext.d.ts +2 -2
- package/dist/server/model/SocialMailContext.js +2 -2
- package/dist/server/model/SocialMailContextEvents.js +2 -2
- package/dist/server/model/entities/AppFile.d.ts +2 -0
- package/dist/server/model/entities/AppFile.d.ts.map +1 -1
- package/dist/server/model/entities/AppFile.js.map +1 -1
- package/dist/server/model/entities/{MailboxEmail.d.ts → ChannelEmail.d.ts} +5 -2
- package/dist/server/model/entities/ChannelEmail.d.ts.map +1 -0
- package/dist/server/model/entities/{MailboxEmail.js → ChannelEmail.js} +26 -13
- package/dist/server/model/entities/ChannelEmail.js.map +1 -0
- package/dist/server/model/entities/Email.d.ts +2 -2
- package/dist/server/model/entities/Email.d.ts.map +1 -1
- package/dist/server/model/entities/Email.js.map +1 -1
- package/dist/server/model/entities/EmailAddress.d.ts +2 -0
- package/dist/server/model/entities/EmailAddress.d.ts.map +1 -1
- package/dist/server/model/entities/EmailAddress.js.map +1 -1
- package/dist/server/model/entities/Mailbox.d.ts +2 -2
- package/dist/server/model/entities/MailboxContactEmail.d.ts +1 -1
- package/dist/server/model/entities/MailboxContactEmail.d.ts.map +1 -1
- package/dist/server/model/entities/MailboxContactEmail.js +5 -0
- package/dist/server/model/entities/MailboxContactEmail.js.map +1 -1
- package/dist/server/model/events/AppFileEvents.d.ts +3 -0
- package/dist/server/model/events/AppFileEvents.d.ts.map +1 -1
- package/dist/server/model/events/AppFileEvents.js +25 -5
- package/dist/server/model/events/AppFileEvents.js.map +1 -1
- package/dist/server/model/events/AppFileTagEvents.d.ts.map +1 -1
- package/dist/server/model/events/AppFileTagEvents.js +2 -3
- package/dist/server/model/events/AppFileTagEvents.js.map +1 -1
- package/dist/server/model/events/EmailAddressEvents.d.ts.map +1 -1
- package/dist/server/model/events/EmailAddressEvents.js +2 -4
- package/dist/server/model/events/EmailAddressEvents.js.map +1 -1
- package/dist/server/model/events/EmailEngagementEvents.js +1 -1
- package/dist/server/model/events/EmailEngagementEvents.js.map +1 -1
- package/dist/server/model/events/EmailEvents.js +6 -6
- package/dist/server/model/events/EmailEvents.js.map +1 -1
- package/dist/server/model/events/EmailLogEvents.js +1 -1
- package/dist/server/model/events/EmailLogEvents.js.map +1 -1
- package/dist/server/model/events/EmailRecipientEvents.js +1 -1
- package/dist/server/model/events/EmailRecipientEvents.js.map +1 -1
- package/dist/server/model/events/EmailTagEvents.js +1 -1
- package/dist/server/model/events/EmailTagEvents.js.map +1 -1
- package/dist/server/model/events/FileContentEvents.d.ts.map +1 -1
- package/dist/server/model/events/FileContentEvents.js +2 -3
- package/dist/server/model/events/FileContentEvents.js.map +1 -1
- package/dist/server/model/events/MailboxContactEvents.js +4 -4
- package/dist/server/model/events/MailboxContactEvents.js.map +1 -1
- package/dist/server/model/events/MailboxEmailEvents.d.ts +9 -6
- package/dist/server/model/events/MailboxEmailEvents.d.ts.map +1 -1
- package/dist/server/model/events/MailboxEmailEvents.js +11 -2
- package/dist/server/model/events/MailboxEmailEvents.js.map +1 -1
- package/dist/server/model/events/MailboxEvents.d.ts.map +1 -1
- package/dist/server/model/events/MailboxEvents.js +6 -6
- package/dist/server/model/events/MailboxEvents.js.map +1 -1
- package/dist/server/model/events/TagEvents.js +1 -1
- package/dist/server/model/events/TagEvents.js.map +1 -1
- package/dist/server/model/events/TextDocumentEvents.js +2 -2
- package/dist/server/model/events/TextDocumentEvents.js.map +1 -1
- package/dist/server/model/events/ThreadParticipantEvents.js +1 -1
- package/dist/server/model/events/ThreadParticipantEvents.js.map +1 -1
- package/dist/server/seed/ui/seed-ui.js +1 -1
- package/dist/server/seed/ui/seed-ui.js.map +1 -1
- package/dist/server/services/channels/ChannelPageService.d.ts +3 -1
- package/dist/server/services/channels/ChannelPageService.d.ts.map +1 -1
- package/dist/server/services/channels/ChannelPageService.js +21 -17
- package/dist/server/services/channels/ChannelPageService.js.map +1 -1
- package/dist/server/services/dom/HtmlSanitizer.js +5 -5
- package/dist/server/services/dom/HtmlSanitizer.js.map +1 -1
- package/dist/server/services/puppeteer/PuppeteerServer.d.ts +1 -19
- package/dist/server/services/puppeteer/PuppeteerServer.d.ts.map +1 -1
- package/dist/server/services/puppeteer/PuppeteerServer.js +176 -268
- package/dist/server/services/puppeteer/PuppeteerServer.js.map +1 -1
- package/dist/server/services/puppeteer/PuppeteerService.d.ts +1 -1
- package/dist/server/services/puppeteer/PuppeteerService.d.ts.map +1 -1
- package/dist/server/services/puppeteer/PuppeteerService.js +2 -1
- package/dist/server/services/puppeteer/PuppeteerService.js.map +1 -1
- package/dist/server/smtp/services/CachedEmailService.js +1 -1
- package/dist/server/smtp/services/EmailReferenceService.d.ts.map +1 -1
- package/dist/server/smtp/services/EmailReferenceService.js +34 -35
- package/dist/server/smtp/services/EmailReferenceService.js.map +1 -1
- package/dist/server/smtp/services/EngagementService.js +1 -1
- package/dist/server/workflows/channel/BroadcastEmail.d.ts.map +1 -1
- package/dist/server/workflows/channel/BroadcastEmail.js +16 -8
- package/dist/server/workflows/channel/BroadcastEmail.js.map +1 -1
- package/dist/server/workflows/repair/channel/RepairChannelEmailCountsWorkflow.js +1 -1
- package/dist/server/workflows/repair/counts/RepairEmailCountsWorkflow.js +1 -1
- package/dist/server/workflows/repair/counts/RepairEmailCountsWorkflow.js.map +1 -1
- package/dist/server/workflows/repair/tags/RepairEmailTagsWorkflow.js +1 -1
- package/dist/server/workflows/repair/tags/RepairEmailTagsWorkflow.js.map +1 -1
- package/dist/server/workflows/smtp/DispatchEmailToMX.d.ts +1 -1
- package/dist/server/workflows/smtp/DispatchEmailToMX.d.ts.map +1 -1
- package/dist/server/workflows/smtp/DispatchEmailToMX.js +9 -7
- package/dist/server/workflows/smtp/DispatchEmailToMX.js.map +1 -1
- package/dist/server/workflows/smtp/MailDispatcherService.d.ts +3 -2
- package/dist/server/workflows/smtp/MailDispatcherService.d.ts.map +1 -1
- package/dist/server/workflows/smtp/MailDispatcherService.js +4 -4
- package/dist/server/workflows/smtp/MailDispatcherService.js.map +1 -1
- package/dist/server/workflows/smtp/PrepareEmailToSend.d.ts +1 -1
- package/dist/server/workflows/smtp/PrepareEmailToSend.js +1 -1
- package/dist/server/workflows/smtp/PrepareEmailToSend.js.map +1 -1
- package/dist/server/workflows/sync/SyncMailboxWorkflow.js +2 -2
- package/dist/server/workflows/sync/SyncMailboxWorkflow.js.map +1 -1
- package/dist/server/workflows/web-hooks/InvokeWebHookWorkflow.js +1 -1
- package/dist/server/workflows/web-hooks/InvokeWebHookWorkflow.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/wwwroot/routes/api/emails/channel/content/attachment/index.js +2 -2
- package/dist/wwwroot/routes/api/emails/channel/content/attachment/index.js.map +1 -1
- package/dist/wwwroot/routes/api/emails/channel/content/html/index.js +6 -6
- package/dist/wwwroot/routes/api/emails/channel/content/html/index.js.map +1 -1
- package/dist/wwwroot/routes/social-mail/public/email/attachment/index.d.ts.map +1 -1
- package/dist/wwwroot/routes/social-mail/public/email/attachment/index.js +2 -1
- package/dist/wwwroot/routes/social-mail/public/email/attachment/index.js.map +1 -1
- package/dist/wwwroot/routes/social-mail/social/buttons/get.d.ts +1 -25
- package/dist/wwwroot/routes/social-mail/social/buttons/get.d.ts.map +1 -1
- package/dist/wwwroot/routes/social-mail/social/buttons/get.js +106 -120
- package/dist/wwwroot/routes/social-mail/social/buttons/get.js.map +1 -1
- package/dist/wwwroot/routes/social-mail/social/buttons-3x/get.d.ts +1 -26
- package/dist/wwwroot/routes/social-mail/social/buttons-3x/get.d.ts.map +1 -1
- package/dist/wwwroot/routes/social-mail/social/buttons-3x/get.js +116 -130
- package/dist/wwwroot/routes/social-mail/social/buttons-3x/get.js.map +1 -1
- package/package.json +2 -3
- package/src/server/model/SocialMailContext.ts +2 -2
- package/src/server/model/SocialMailContextEvents.ts +2 -2
- package/src/server/model/entities/AppFile.ts +2 -2
- package/src/server/model/entities/{MailboxEmail.ts → ChannelEmail.ts} +16 -2
- package/src/server/model/entities/Email.ts +3 -2
- package/src/server/model/entities/EmailAddress.ts +2 -0
- package/src/server/model/entities/Mailbox.ts +2 -2
- package/src/server/model/entities/MailboxContactEmail.ts +5 -1
- package/src/server/model/events/AppFileEvents.ts +24 -5
- package/src/server/model/events/AppFileTagEvents.ts +4 -5
- package/src/server/model/events/EmailAddressEvents.ts +5 -8
- package/src/server/model/events/EmailEngagementEvents.ts +1 -1
- package/src/server/model/events/EmailEvents.ts +6 -6
- package/src/server/model/events/EmailLogEvents.ts +1 -1
- package/src/server/model/events/EmailRecipientEvents.ts +1 -1
- package/src/server/model/events/EmailTagEvents.ts +1 -1
- package/src/server/model/events/FileContentEvents.ts +3 -4
- package/src/server/model/events/MailboxContactEvents.ts +4 -4
- package/src/server/model/events/MailboxEmailEvents.ts +16 -7
- package/src/server/model/events/MailboxEvents.ts +7 -6
- package/src/server/model/events/TagEvents.ts +2 -2
- package/src/server/model/events/TextDocumentEvents.ts +3 -3
- package/src/server/model/events/ThreadParticipantEvents.ts +1 -1
- package/src/server/seed/ui/seed-ui.ts +1 -1
- package/src/server/services/channels/ChannelPageService.tsx +22 -17
- package/src/server/services/dom/HtmlSanitizer.tsx +6 -6
- package/src/server/services/emails/UnreadCountService.ts +1 -1
- package/src/server/services/puppeteer/PuppeteerServer.ts +194 -194
- package/src/server/services/puppeteer/PuppeteerService.ts +1 -1
- package/src/server/smtp/services/CachedEmailService.ts +1 -1
- package/src/server/smtp/services/EmailReferenceService.ts +36 -37
- package/src/server/smtp/services/EngagementService.ts +1 -1
- package/src/server/workflows/channel/BroadcastEmail.ts +21 -8
- package/src/server/workflows/repair/channel/RepairChannelEmailCountsWorkflow.ts +1 -1
- package/src/server/workflows/repair/counts/RepairEmailCountsWorkflow.ts +1 -1
- package/src/server/workflows/repair/tags/RepairEmailTagsWorkflow.ts +1 -1
- package/src/server/workflows/smtp/DispatchEmailToMX.ts +11 -8
- package/src/server/workflows/smtp/MailDispatcherService.ts +5 -5
- package/src/server/workflows/smtp/PrepareEmailToSend.ts +1 -1
- package/src/server/workflows/sync/SyncMailboxWorkflow.ts +2 -2
- package/src/server/workflows/web-hooks/InvokeWebHookWorkflow.ts +1 -1
- package/src/wwwroot/routes/api/emails/channel/content/attachment/index.ts +2 -2
- package/src/wwwroot/routes/api/emails/channel/content/html/index.ts +6 -6
- package/src/wwwroot/routes/social-mail/public/email/attachment/index.ts +3 -1
- package/src/wwwroot/routes/social-mail/social/buttons/get.tsx +130 -130
- package/src/wwwroot/routes/social-mail/social/buttons-3x/get.tsx +143 -143
- package/dist/server/model/entities/MailboxEmail.d.ts.map +0 -1
- package/dist/server/model/entities/MailboxEmail.js.map +0 -1
|
@@ -34,7 +34,7 @@ export const smtpPool = new NamedObjectPool<SMTPClient>((host) => ({
|
|
|
34
34
|
|
|
35
35
|
interface IMessageEnvelope {
|
|
36
36
|
emailID: number;
|
|
37
|
-
|
|
37
|
+
recipientAddressID: number;
|
|
38
38
|
host: string;
|
|
39
39
|
from: string;
|
|
40
40
|
to: string[];
|
|
@@ -92,8 +92,8 @@ export default class DispatchEmailToMX extends Workflow<IMessageEnvelope> {
|
|
|
92
92
|
async signEmail(
|
|
93
93
|
@Inject mds?: MailDispatcherService
|
|
94
94
|
) {
|
|
95
|
-
const { emailID, senderID, activityID,
|
|
96
|
-
return await mds.encodeForBulk({ emailID, senderID, activityID,
|
|
95
|
+
const { emailID, senderID, activityID, recipientAddressID, accessCode, external, to, listID, from } = this.input;
|
|
96
|
+
return await mds.encodeForBulk({ emailID, senderID, activityID, recipientAddressID , accessCode, external, to, listID, from });
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
@UniqueActivity
|
|
@@ -174,7 +174,7 @@ export default class DispatchEmailToMX extends Workflow<IMessageEnvelope> {
|
|
|
174
174
|
|
|
175
175
|
// if it is local...
|
|
176
176
|
// save signedFileLogID to MailboxContactEmail
|
|
177
|
-
const { senderID, emailID,
|
|
177
|
+
const { senderID, emailID, recipientAddressID, external } = this.input;
|
|
178
178
|
const { signedFileLogID } = this;
|
|
179
179
|
const mailboxID = await eas.getHostedMailboxID(this.input.to[0]);
|
|
180
180
|
|
|
@@ -186,6 +186,8 @@ export default class DispatchEmailToMX extends Workflow<IMessageEnvelope> {
|
|
|
186
186
|
// internal broad casting is not working
|
|
187
187
|
// we either need to create an email or add the recipient
|
|
188
188
|
|
|
189
|
+
const emailAddressID = senderID;
|
|
190
|
+
|
|
189
191
|
const email = await db.emails.loadByKeys({ emailID });
|
|
190
192
|
await db.changeSet.getEntry(email).loadNavigationAsync((x) => x.emailTags);
|
|
191
193
|
|
|
@@ -204,7 +206,8 @@ export default class DispatchEmailToMX extends Workflow<IMessageEnvelope> {
|
|
|
204
206
|
await db.mailboxContacts.statements.upsert({
|
|
205
207
|
mailboxID,
|
|
206
208
|
emailAddressID,
|
|
207
|
-
folderTagID
|
|
209
|
+
folderTagID,
|
|
210
|
+
newRequest: true,
|
|
208
211
|
}, (x) => {
|
|
209
212
|
addFolder = false;
|
|
210
213
|
x.unread++;
|
|
@@ -305,7 +308,7 @@ export default class DispatchEmailToMX extends Workflow<IMessageEnvelope> {
|
|
|
305
308
|
@Inject db?: SocialMailContext,
|
|
306
309
|
@Inject els?: EmailLogService
|
|
307
310
|
) {
|
|
308
|
-
const { emailID, emailAddressID, activityID } = this.input;
|
|
311
|
+
const { emailID, recipientAddressID: emailAddressID, activityID } = this.input;
|
|
309
312
|
db.verifyFilters = false;
|
|
310
313
|
if (this.response?.statusCode === SmtpStatusCodes.Ok) {
|
|
311
314
|
|
|
@@ -327,7 +330,7 @@ export default class DispatchEmailToMX extends Workflow<IMessageEnvelope> {
|
|
|
327
330
|
if (!this.input.doNotSendDR) {
|
|
328
331
|
|
|
329
332
|
const e = await db.emailRecipients
|
|
330
|
-
.where(this.input, (p) => (x) => x.emailID === p.emailID && x.emailAddressID === p.
|
|
333
|
+
.where(this.input, (p) => (x) => x.emailID === p.emailID && x.emailAddressID === p.recipientAddressID)
|
|
331
334
|
.include((x) => [x.email, x.emailAddress])
|
|
332
335
|
.first();
|
|
333
336
|
|
|
@@ -337,7 +340,7 @@ export default class DispatchEmailToMX extends Workflow<IMessageEnvelope> {
|
|
|
337
340
|
// send mailer daemon...
|
|
338
341
|
db.emails.add({
|
|
339
342
|
senderName: e.name ?? "Mailer Daemon",
|
|
340
|
-
senderID: this.input.
|
|
343
|
+
senderID: this.input.recipientAddressID,
|
|
341
344
|
parentID: e.emailID,
|
|
342
345
|
subject: `Mailer Daemon Delivery Failed`,
|
|
343
346
|
textBody: `Mail delivery to ${e.emailAddress.emailAddress} failed with following error\r\nError Code: ${this.response.statusCode}\r\n${this.response.status}`,
|
|
@@ -41,8 +41,8 @@ export default class MailDispatcherService {
|
|
|
41
41
|
@Inject
|
|
42
42
|
encryptionService: EncryptionService;
|
|
43
43
|
|
|
44
|
-
async encodeForBulk({ senderID, emailID,
|
|
45
|
-
{ senderID: number, emailID: number,
|
|
44
|
+
async encodeForBulk({ senderID, emailID, recipientAddressID, activityID, accessCode, external, to, listID, from }:
|
|
45
|
+
{ senderID: number, emailID: number, recipientAddressID: number, activityID: number, accessCode: string, external?: boolean, listID?: any, from: string, to: string[] }) {
|
|
46
46
|
const { db, tfs, storage, htmlSanitizer } = this;
|
|
47
47
|
db.verifyFilters = false;
|
|
48
48
|
db.raiseEvents = false;
|
|
@@ -55,7 +55,7 @@ export default class MailDispatcherService {
|
|
|
55
55
|
const a = await db.subscriberActivities.statements.insert({
|
|
56
56
|
emailID,
|
|
57
57
|
mailboxID: senderID,
|
|
58
|
-
emailAddressID:
|
|
58
|
+
emailAddressID: recipientAddressID,
|
|
59
59
|
dateCreated,
|
|
60
60
|
accessCode,
|
|
61
61
|
activity: "scheduled"
|
|
@@ -120,7 +120,7 @@ export default class MailDispatcherService {
|
|
|
120
120
|
}
|
|
121
121
|
}
|
|
122
122
|
|
|
123
|
-
const senderEmail =
|
|
123
|
+
const senderEmail = from ?? mb.emailAddress.emailAddress;
|
|
124
124
|
|
|
125
125
|
|
|
126
126
|
let html = email.htmlBody ?? await this.cachedEmailService.getHtmlText(email);
|
|
@@ -141,7 +141,7 @@ export default class MailDispatcherService {
|
|
|
141
141
|
html = s.html;
|
|
142
142
|
}
|
|
143
143
|
|
|
144
|
-
const fromAddress = mb.emailAddress.emailAddress;
|
|
144
|
+
const fromAddress = from ?? mb.emailAddress.emailAddress;
|
|
145
145
|
|
|
146
146
|
if (listID) {
|
|
147
147
|
headers["List-ID"] = `${mb.emailAddress.name} <${fromAddress}>`;
|
|
@@ -94,7 +94,7 @@ export default class PrepareEmailToSend extends Workflow<number, string> {
|
|
|
94
94
|
from: email.senderEmail.emailAddress,
|
|
95
95
|
senderID: email.senderID,
|
|
96
96
|
emailID: x.emailID,
|
|
97
|
-
|
|
97
|
+
recipientAddressID: x.emailAddressID,
|
|
98
98
|
external: email.senderEmail.mailbox.isExternal,
|
|
99
99
|
to: [ x.replyTo ?? x.emailAddress.emailAddress],
|
|
100
100
|
maxPerSecond,
|
|
@@ -296,7 +296,7 @@ export default class SyncMailboxWorkflow extends Workflow<any, any> {
|
|
|
296
296
|
|
|
297
297
|
if (emailID) {
|
|
298
298
|
const e = await this.db.emails.where({ emailID, mailboxID, messageId }, (p) => (x) =>
|
|
299
|
-
x.
|
|
299
|
+
x.mailboxContactEvents.some((mb) => mb.mailboxID === p.mailboxID)
|
|
300
300
|
&& (
|
|
301
301
|
x.externalEmailID === p.emailID
|
|
302
302
|
|| (x.headerMessageID === p.messageId
|
|
@@ -313,7 +313,7 @@ export default class SyncMailboxWorkflow extends Workflow<any, any> {
|
|
|
313
313
|
return await this.db.emails.where({ mailboxID, messageId, from }, (p) => (x) =>
|
|
314
314
|
x.sentMessageID === p.messageId
|
|
315
315
|
|| (
|
|
316
|
-
x.
|
|
316
|
+
x.mailboxContactEvents.some((mb) => mb.mailboxID === p.mailboxID)
|
|
317
317
|
&& x.headerMessageID === p.messageId
|
|
318
318
|
&& x.senderEmail.emailAddress === p.from
|
|
319
319
|
)
|
|
@@ -34,14 +34,14 @@ export default class extends Page {
|
|
|
34
34
|
x.appFileID === p.fileID
|
|
35
35
|
&& x.emailID === p.emailID
|
|
36
36
|
&& x.email.headerMessageID === p.messageID
|
|
37
|
-
&& x.email.
|
|
37
|
+
&& x.email.channelEmails.some((c) => Sql.in(c.mailboxID, p.mailboxes))
|
|
38
38
|
)
|
|
39
39
|
: this.db.appFiles
|
|
40
40
|
.where({ fileID, emailID, messageID, channelID, domains }, (p) => (x) =>
|
|
41
41
|
x.appFileID === p.fileID
|
|
42
42
|
&& x.emailID === p.emailID
|
|
43
43
|
&& x.email.headerMessageID === p.messageID
|
|
44
|
-
&& x.email.
|
|
44
|
+
&& x.email.channelEmails.some((c) => Sql.in(c.mailbox.domainID, p.domains))
|
|
45
45
|
);
|
|
46
46
|
|
|
47
47
|
// verify host ...
|
|
@@ -46,12 +46,12 @@ export default class extends Page {
|
|
|
46
46
|
email = mailboxes
|
|
47
47
|
? await q
|
|
48
48
|
.where({ mailboxes }, (p) => (x) =>
|
|
49
|
-
x.
|
|
49
|
+
x.channelEmails.some((c) => Sql.in(c.mailboxID, p.mailboxes) )
|
|
50
50
|
)
|
|
51
51
|
.first()
|
|
52
52
|
: await q
|
|
53
53
|
.where({ domains }, (p) => (x) =>
|
|
54
|
-
x.
|
|
54
|
+
x.channelEmails.some((c) => Sql.in(c.mailbox.domainID, p.domains) )
|
|
55
55
|
)
|
|
56
56
|
.first();
|
|
57
57
|
if (!email) {
|
|
@@ -62,7 +62,7 @@ export default class extends Page {
|
|
|
62
62
|
email = mailboxes
|
|
63
63
|
? await q
|
|
64
64
|
.where({ channelID, mailboxes, userID }, (p) => (x) =>
|
|
65
|
-
x.
|
|
65
|
+
x.channelEmails.some((c) => c.mailboxID === p.channelID
|
|
66
66
|
&& Sql.in(c.mailboxID, p.mailboxes)
|
|
67
67
|
&& c.mailbox.userMailboxes.some((mu) => mu.userID === p.userID)
|
|
68
68
|
)
|
|
@@ -70,7 +70,7 @@ export default class extends Page {
|
|
|
70
70
|
.first()
|
|
71
71
|
: await q
|
|
72
72
|
.where({ channelID, domains, userID }, (p) => (x) =>
|
|
73
|
-
x.
|
|
73
|
+
x.channelEmails.some((c) => c.mailboxID === p.channelID
|
|
74
74
|
&& Sql.in(c.mailbox.domainID, p.domains)
|
|
75
75
|
)
|
|
76
76
|
)
|
|
@@ -82,12 +82,12 @@ export default class extends Page {
|
|
|
82
82
|
email = mailboxes
|
|
83
83
|
? await q
|
|
84
84
|
.where({ mailboxes }, (p) => (x) =>
|
|
85
|
-
x.
|
|
85
|
+
x.channelEmails.some((c) => Sql.in(c.mailboxID, p.mailboxes))
|
|
86
86
|
)
|
|
87
87
|
.first()
|
|
88
88
|
: await q
|
|
89
89
|
.where({ domains }, (p) => (x) =>
|
|
90
|
-
x.
|
|
90
|
+
x.channelEmails.some((c) => Sql.in(c.mailbox.domainID, p.domains))
|
|
91
91
|
)
|
|
92
92
|
.first();
|
|
93
93
|
if (!email) {
|
|
@@ -18,6 +18,8 @@ export default class extends Page {
|
|
|
18
18
|
|
|
19
19
|
async run() {
|
|
20
20
|
|
|
21
|
+
console.warn(`Do not use this, ${this.request.url}`);
|
|
22
|
+
|
|
21
23
|
let { 0:channelID, 1: emailID, 3: fileID} = this.childPath as any[];
|
|
22
24
|
const {2: messageID } = this.childPath;
|
|
23
25
|
|
|
@@ -33,7 +35,7 @@ export default class extends Page {
|
|
|
33
35
|
x.appFileID === p.fileID
|
|
34
36
|
&& x.emailID === p.emailID
|
|
35
37
|
&& x.email.headerMessageID === p.messageID
|
|
36
|
-
&& x.email.
|
|
38
|
+
&& x.email.channelEmails.some((c) => c.mailboxID === p.channelID
|
|
37
39
|
&& c.mailbox.websiteChannels.some((wc) =>
|
|
38
40
|
wc.website.hosts.some((h) => h.host === p.host)))
|
|
39
41
|
)
|
|
@@ -1,133 +1,133 @@
|
|
|
1
|
-
import Inject, { ServiceProvider } from "@entity-access/entity-access/dist/di/di.js";
|
|
2
|
-
import Content, { TempFileResult } from "@entity-access/server-pages/dist/Content.js";
|
|
3
|
-
import Page from "@entity-access/server-pages/dist/Page.js";
|
|
4
|
-
import CacheService from "../../../../../server/services/cache/CacheService.js";
|
|
5
|
-
import TimeSpan from "@entity-access/entity-access/dist/types/TimeSpan.js";
|
|
6
|
-
import SocialMailContext from "../../../../../server/model/SocialMailContext.js";
|
|
7
|
-
import CachedEmailService from "../../../../../server/smtp/services/CachedEmailService.js";
|
|
8
|
-
import { Base36 } from "../../../../../common/Base36.js";
|
|
9
|
-
import { toKMBString } from "../../../../../common/NumberFormats.js";
|
|
10
|
-
import { PuppeteerService } from "../../../../../server/services/puppeteer/PuppeteerService.js";
|
|
11
|
-
import TempFileService from "../../../../../server/storage/TempFileService.js";
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
export default class SocialButtonPage extends Page {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
1
|
+
// import Inject, { ServiceProvider } from "@entity-access/entity-access/dist/di/di.js";
|
|
2
|
+
// import Content, { TempFileResult } from "@entity-access/server-pages/dist/Content.js";
|
|
3
|
+
// import Page from "@entity-access/server-pages/dist/Page.js";
|
|
4
|
+
// import CacheService from "../../../../../server/services/cache/CacheService.js";
|
|
5
|
+
// import TimeSpan from "@entity-access/entity-access/dist/types/TimeSpan.js";
|
|
6
|
+
// import SocialMailContext from "../../../../../server/model/SocialMailContext.js";
|
|
7
|
+
// import CachedEmailService from "../../../../../server/smtp/services/CachedEmailService.js";
|
|
8
|
+
// import { Base36 } from "../../../../../common/Base36.js";
|
|
9
|
+
// import { toKMBString } from "../../../../../common/NumberFormats.js";
|
|
10
|
+
// import { PuppeteerService } from "../../../../../server/services/puppeteer/PuppeteerService.js";
|
|
11
|
+
// import TempFileService from "../../../../../server/storage/TempFileService.js";
|
|
12
|
+
|
|
13
|
+
// /**
|
|
14
|
+
// * Social Buttons URL Pattern
|
|
15
|
+
// *
|
|
16
|
+
// * /social-mail/social/buttons/{method}/{selector}/{emailID}/{activityID}
|
|
17
|
+
// *
|
|
18
|
+
// * method: can be track or any unicode emoji that will be considered as an engagement.
|
|
19
|
+
// *
|
|
20
|
+
// * selector: unique selector button that will be converted to PNG
|
|
21
|
+
// *
|
|
22
|
+
// * emailID: email id of the email, Base36 encoded.
|
|
23
|
+
// *
|
|
24
|
+
// * activityID: activity id of subscription activity to track activity/engagement of specific subscriber.
|
|
25
|
+
// * We are not going to use subscriberID as each activityID will be unique and it will be new for
|
|
26
|
+
// * new email.
|
|
27
|
+
// */
|
|
28
|
+
// export default class SocialButtonPage extends Page {
|
|
29
|
+
|
|
30
|
+
// @Inject
|
|
31
|
+
// private cacheService: CacheService;
|
|
32
|
+
|
|
33
|
+
// @Inject
|
|
34
|
+
// private cachedEmailService: CachedEmailService;
|
|
35
|
+
|
|
36
|
+
// @Inject
|
|
37
|
+
// private db: SocialMailContext;
|
|
38
|
+
|
|
39
|
+
// async run() {
|
|
40
|
+
|
|
41
|
+
// const [method, selector, emailIDEncoded, activityID] = this.childPath;
|
|
42
|
+
|
|
43
|
+
// let emailID = emailIDEncoded;
|
|
44
|
+
|
|
45
|
+
// if (!/^\$/.test(emailID)) {
|
|
46
|
+
// emailID = Base36.decode(emailID, false);
|
|
47
|
+
// }
|
|
48
|
+
|
|
49
|
+
// const key = `buttons/${method}/${emailID}`;
|
|
50
|
+
|
|
51
|
+
// /**
|
|
52
|
+
// * why do we need to cache this?
|
|
53
|
+
// *
|
|
54
|
+
// * It is to avoid putting load on puppeteer service.
|
|
55
|
+
// * As rendering html to png will require significant cpu and network
|
|
56
|
+
// * resources, as styles can reference any external images.
|
|
57
|
+
// */
|
|
58
|
+
|
|
59
|
+
// // const file = await this.cacheService.get({
|
|
60
|
+
// // key, factory: () => this.createImage(method, selector, emailID, activityID),
|
|
61
|
+
// // ttl: TimeSpan.fromSeconds(8600)
|
|
62
|
+
// // });
|
|
63
|
+
|
|
64
|
+
// const file = await this.createImage(method, selector, emailID, activityID);
|
|
65
|
+
|
|
66
|
+
// this.cacheControl = "public, max-age=8600";
|
|
67
|
+
|
|
68
|
+
// return new TempFileResult(file, {});
|
|
69
|
+
// }
|
|
70
|
+
|
|
71
|
+
// async createImage(method: string, selector, emailID, activityID) {
|
|
72
|
+
// const db = ServiceProvider.resolve(this, SocialMailContext);
|
|
73
|
+
// const puppeteerService = ServiceProvider.resolve(this, PuppeteerService);
|
|
74
|
+
// const tempFileService = ServiceProvider.resolve(this, TempFileService);
|
|
75
|
+
|
|
76
|
+
// let count: string;
|
|
77
|
+
|
|
78
|
+
// if (method === "track") {
|
|
79
|
+
// count = await this.track(emailID, activityID);
|
|
80
|
+
// } else {
|
|
81
|
+
// const engagement = decodeURIComponent(method);
|
|
82
|
+
// // console.log(`Search for engagement ${engagement} in ${emailID}`);
|
|
83
|
+
// const ec = await this.db.emailEngagements
|
|
84
|
+
// .where({ emailID, engagement }, (p) => (x) => x.emailID === p.emailID && x.engagement === p.engagement)
|
|
85
|
+
// .first();
|
|
86
|
+
|
|
87
|
+
// if (ec?.count) {
|
|
88
|
+
// count = toKMBString(ec.count);
|
|
89
|
+
// }
|
|
90
|
+
// }
|
|
91
|
+
|
|
92
|
+
// count ??= "";
|
|
93
|
+
|
|
94
|
+
// const html = await this.cachedEmailService.getHtml(emailID);
|
|
95
|
+
|
|
96
|
+
// const png = await tempFileService.createTempFile(".png", "button.png", "image/png");
|
|
97
|
+
// await puppeteerService.htmlToPng(await html.readAsText(), { selector, outputFile: png.path, count });
|
|
98
|
+
// return png;
|
|
99
|
+
// }
|
|
100
|
+
|
|
101
|
+
// async track(emailID: any, activityID: any) {
|
|
102
|
+
|
|
103
|
+
// const ep = { emailID };
|
|
104
|
+
// const isValidActivityID = !/^\$/.test(activityID);
|
|
105
|
+
// if (isValidActivityID) {
|
|
106
|
+
// const activity = await this.db.subscriberActivities
|
|
107
|
+
// .where({
|
|
108
|
+
// activityID: Base36.decode(activityID, false) ?? 0,
|
|
109
|
+
// emailID
|
|
110
|
+
// }, (p) => (x) => x.activityID === p.activityID && x.emailID === p.emailID)
|
|
111
|
+
// .first();
|
|
112
|
+
|
|
113
|
+
// if (activity) {
|
|
114
|
+
// delete activity.activityID;
|
|
115
|
+
// activity.activity = "view";
|
|
116
|
+
// activity.ipAddress = this.request?.remoteIPAddress;
|
|
117
|
+
// await this.db.subscriberActivities.statements.insert(activity);
|
|
118
|
+
|
|
119
|
+
// await this.db.emails.where(ep, (p) => (x) => x.emailID === p.emailID as any)
|
|
120
|
+
// .update(ep, (p) => (x) => ({ viewCount: x.viewCount + 1}));
|
|
121
|
+
// }
|
|
122
|
+
// }
|
|
123
123
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
124
|
+
// const ec = await this.db.emails
|
|
125
|
+
// .where(ep, (p) => (x) => x.emailID === p.emailID as any)
|
|
126
|
+
// .first();
|
|
127
127
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
128
|
+
// if (ec?.viewCount) {
|
|
129
|
+
// return toKMBString(ec.viewCount);
|
|
130
|
+
// }
|
|
131
|
+
// }
|
|
132
132
|
|
|
133
|
-
}
|
|
133
|
+
// }
|