@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.
Files changed (168) hide show
  1. package/dist/server/model/SocialMailContext.d.ts +2 -2
  2. package/dist/server/model/SocialMailContext.js +2 -2
  3. package/dist/server/model/SocialMailContextEvents.js +2 -2
  4. package/dist/server/model/entities/AppFile.d.ts +2 -0
  5. package/dist/server/model/entities/AppFile.d.ts.map +1 -1
  6. package/dist/server/model/entities/AppFile.js.map +1 -1
  7. package/dist/server/model/entities/{MailboxEmail.d.ts → ChannelEmail.d.ts} +5 -2
  8. package/dist/server/model/entities/ChannelEmail.d.ts.map +1 -0
  9. package/dist/server/model/entities/{MailboxEmail.js → ChannelEmail.js} +26 -13
  10. package/dist/server/model/entities/ChannelEmail.js.map +1 -0
  11. package/dist/server/model/entities/Email.d.ts +2 -2
  12. package/dist/server/model/entities/Email.d.ts.map +1 -1
  13. package/dist/server/model/entities/Email.js.map +1 -1
  14. package/dist/server/model/entities/EmailAddress.d.ts +2 -0
  15. package/dist/server/model/entities/EmailAddress.d.ts.map +1 -1
  16. package/dist/server/model/entities/EmailAddress.js.map +1 -1
  17. package/dist/server/model/entities/Mailbox.d.ts +2 -2
  18. package/dist/server/model/entities/MailboxContactEmail.d.ts +1 -1
  19. package/dist/server/model/entities/MailboxContactEmail.d.ts.map +1 -1
  20. package/dist/server/model/entities/MailboxContactEmail.js +5 -0
  21. package/dist/server/model/entities/MailboxContactEmail.js.map +1 -1
  22. package/dist/server/model/events/AppFileEvents.d.ts +3 -0
  23. package/dist/server/model/events/AppFileEvents.d.ts.map +1 -1
  24. package/dist/server/model/events/AppFileEvents.js +25 -5
  25. package/dist/server/model/events/AppFileEvents.js.map +1 -1
  26. package/dist/server/model/events/AppFileTagEvents.d.ts.map +1 -1
  27. package/dist/server/model/events/AppFileTagEvents.js +2 -3
  28. package/dist/server/model/events/AppFileTagEvents.js.map +1 -1
  29. package/dist/server/model/events/EmailAddressEvents.d.ts.map +1 -1
  30. package/dist/server/model/events/EmailAddressEvents.js +2 -4
  31. package/dist/server/model/events/EmailAddressEvents.js.map +1 -1
  32. package/dist/server/model/events/EmailEngagementEvents.js +1 -1
  33. package/dist/server/model/events/EmailEngagementEvents.js.map +1 -1
  34. package/dist/server/model/events/EmailEvents.js +6 -6
  35. package/dist/server/model/events/EmailEvents.js.map +1 -1
  36. package/dist/server/model/events/EmailLogEvents.js +1 -1
  37. package/dist/server/model/events/EmailLogEvents.js.map +1 -1
  38. package/dist/server/model/events/EmailRecipientEvents.js +1 -1
  39. package/dist/server/model/events/EmailRecipientEvents.js.map +1 -1
  40. package/dist/server/model/events/EmailTagEvents.js +1 -1
  41. package/dist/server/model/events/EmailTagEvents.js.map +1 -1
  42. package/dist/server/model/events/FileContentEvents.d.ts.map +1 -1
  43. package/dist/server/model/events/FileContentEvents.js +2 -3
  44. package/dist/server/model/events/FileContentEvents.js.map +1 -1
  45. package/dist/server/model/events/MailboxContactEvents.js +4 -4
  46. package/dist/server/model/events/MailboxContactEvents.js.map +1 -1
  47. package/dist/server/model/events/MailboxEmailEvents.d.ts +9 -6
  48. package/dist/server/model/events/MailboxEmailEvents.d.ts.map +1 -1
  49. package/dist/server/model/events/MailboxEmailEvents.js +11 -2
  50. package/dist/server/model/events/MailboxEmailEvents.js.map +1 -1
  51. package/dist/server/model/events/MailboxEvents.d.ts.map +1 -1
  52. package/dist/server/model/events/MailboxEvents.js +6 -6
  53. package/dist/server/model/events/MailboxEvents.js.map +1 -1
  54. package/dist/server/model/events/TagEvents.js +1 -1
  55. package/dist/server/model/events/TagEvents.js.map +1 -1
  56. package/dist/server/model/events/TextDocumentEvents.js +2 -2
  57. package/dist/server/model/events/TextDocumentEvents.js.map +1 -1
  58. package/dist/server/model/events/ThreadParticipantEvents.js +1 -1
  59. package/dist/server/model/events/ThreadParticipantEvents.js.map +1 -1
  60. package/dist/server/seed/ui/seed-ui.js +1 -1
  61. package/dist/server/seed/ui/seed-ui.js.map +1 -1
  62. package/dist/server/services/channels/ChannelPageService.d.ts +3 -1
  63. package/dist/server/services/channels/ChannelPageService.d.ts.map +1 -1
  64. package/dist/server/services/channels/ChannelPageService.js +21 -17
  65. package/dist/server/services/channels/ChannelPageService.js.map +1 -1
  66. package/dist/server/services/dom/HtmlSanitizer.js +5 -5
  67. package/dist/server/services/dom/HtmlSanitizer.js.map +1 -1
  68. package/dist/server/services/puppeteer/PuppeteerServer.d.ts +1 -19
  69. package/dist/server/services/puppeteer/PuppeteerServer.d.ts.map +1 -1
  70. package/dist/server/services/puppeteer/PuppeteerServer.js +176 -268
  71. package/dist/server/services/puppeteer/PuppeteerServer.js.map +1 -1
  72. package/dist/server/services/puppeteer/PuppeteerService.d.ts +1 -1
  73. package/dist/server/services/puppeteer/PuppeteerService.d.ts.map +1 -1
  74. package/dist/server/services/puppeteer/PuppeteerService.js +2 -1
  75. package/dist/server/services/puppeteer/PuppeteerService.js.map +1 -1
  76. package/dist/server/smtp/services/CachedEmailService.js +1 -1
  77. package/dist/server/smtp/services/EmailReferenceService.d.ts.map +1 -1
  78. package/dist/server/smtp/services/EmailReferenceService.js +34 -35
  79. package/dist/server/smtp/services/EmailReferenceService.js.map +1 -1
  80. package/dist/server/smtp/services/EngagementService.js +1 -1
  81. package/dist/server/workflows/channel/BroadcastEmail.d.ts.map +1 -1
  82. package/dist/server/workflows/channel/BroadcastEmail.js +16 -8
  83. package/dist/server/workflows/channel/BroadcastEmail.js.map +1 -1
  84. package/dist/server/workflows/repair/channel/RepairChannelEmailCountsWorkflow.js +1 -1
  85. package/dist/server/workflows/repair/counts/RepairEmailCountsWorkflow.js +1 -1
  86. package/dist/server/workflows/repair/counts/RepairEmailCountsWorkflow.js.map +1 -1
  87. package/dist/server/workflows/repair/tags/RepairEmailTagsWorkflow.js +1 -1
  88. package/dist/server/workflows/repair/tags/RepairEmailTagsWorkflow.js.map +1 -1
  89. package/dist/server/workflows/smtp/DispatchEmailToMX.d.ts +1 -1
  90. package/dist/server/workflows/smtp/DispatchEmailToMX.d.ts.map +1 -1
  91. package/dist/server/workflows/smtp/DispatchEmailToMX.js +9 -7
  92. package/dist/server/workflows/smtp/DispatchEmailToMX.js.map +1 -1
  93. package/dist/server/workflows/smtp/MailDispatcherService.d.ts +3 -2
  94. package/dist/server/workflows/smtp/MailDispatcherService.d.ts.map +1 -1
  95. package/dist/server/workflows/smtp/MailDispatcherService.js +4 -4
  96. package/dist/server/workflows/smtp/MailDispatcherService.js.map +1 -1
  97. package/dist/server/workflows/smtp/PrepareEmailToSend.d.ts +1 -1
  98. package/dist/server/workflows/smtp/PrepareEmailToSend.js +1 -1
  99. package/dist/server/workflows/smtp/PrepareEmailToSend.js.map +1 -1
  100. package/dist/server/workflows/sync/SyncMailboxWorkflow.js +2 -2
  101. package/dist/server/workflows/sync/SyncMailboxWorkflow.js.map +1 -1
  102. package/dist/server/workflows/web-hooks/InvokeWebHookWorkflow.js +1 -1
  103. package/dist/server/workflows/web-hooks/InvokeWebHookWorkflow.js.map +1 -1
  104. package/dist/tsconfig.tsbuildinfo +1 -1
  105. package/dist/wwwroot/routes/api/emails/channel/content/attachment/index.js +2 -2
  106. package/dist/wwwroot/routes/api/emails/channel/content/attachment/index.js.map +1 -1
  107. package/dist/wwwroot/routes/api/emails/channel/content/html/index.js +6 -6
  108. package/dist/wwwroot/routes/api/emails/channel/content/html/index.js.map +1 -1
  109. package/dist/wwwroot/routes/social-mail/public/email/attachment/index.d.ts.map +1 -1
  110. package/dist/wwwroot/routes/social-mail/public/email/attachment/index.js +2 -1
  111. package/dist/wwwroot/routes/social-mail/public/email/attachment/index.js.map +1 -1
  112. package/dist/wwwroot/routes/social-mail/social/buttons/get.d.ts +1 -25
  113. package/dist/wwwroot/routes/social-mail/social/buttons/get.d.ts.map +1 -1
  114. package/dist/wwwroot/routes/social-mail/social/buttons/get.js +106 -120
  115. package/dist/wwwroot/routes/social-mail/social/buttons/get.js.map +1 -1
  116. package/dist/wwwroot/routes/social-mail/social/buttons-3x/get.d.ts +1 -26
  117. package/dist/wwwroot/routes/social-mail/social/buttons-3x/get.d.ts.map +1 -1
  118. package/dist/wwwroot/routes/social-mail/social/buttons-3x/get.js +116 -130
  119. package/dist/wwwroot/routes/social-mail/social/buttons-3x/get.js.map +1 -1
  120. package/package.json +2 -3
  121. package/src/server/model/SocialMailContext.ts +2 -2
  122. package/src/server/model/SocialMailContextEvents.ts +2 -2
  123. package/src/server/model/entities/AppFile.ts +2 -2
  124. package/src/server/model/entities/{MailboxEmail.ts → ChannelEmail.ts} +16 -2
  125. package/src/server/model/entities/Email.ts +3 -2
  126. package/src/server/model/entities/EmailAddress.ts +2 -0
  127. package/src/server/model/entities/Mailbox.ts +2 -2
  128. package/src/server/model/entities/MailboxContactEmail.ts +5 -1
  129. package/src/server/model/events/AppFileEvents.ts +24 -5
  130. package/src/server/model/events/AppFileTagEvents.ts +4 -5
  131. package/src/server/model/events/EmailAddressEvents.ts +5 -8
  132. package/src/server/model/events/EmailEngagementEvents.ts +1 -1
  133. package/src/server/model/events/EmailEvents.ts +6 -6
  134. package/src/server/model/events/EmailLogEvents.ts +1 -1
  135. package/src/server/model/events/EmailRecipientEvents.ts +1 -1
  136. package/src/server/model/events/EmailTagEvents.ts +1 -1
  137. package/src/server/model/events/FileContentEvents.ts +3 -4
  138. package/src/server/model/events/MailboxContactEvents.ts +4 -4
  139. package/src/server/model/events/MailboxEmailEvents.ts +16 -7
  140. package/src/server/model/events/MailboxEvents.ts +7 -6
  141. package/src/server/model/events/TagEvents.ts +2 -2
  142. package/src/server/model/events/TextDocumentEvents.ts +3 -3
  143. package/src/server/model/events/ThreadParticipantEvents.ts +1 -1
  144. package/src/server/seed/ui/seed-ui.ts +1 -1
  145. package/src/server/services/channels/ChannelPageService.tsx +22 -17
  146. package/src/server/services/dom/HtmlSanitizer.tsx +6 -6
  147. package/src/server/services/emails/UnreadCountService.ts +1 -1
  148. package/src/server/services/puppeteer/PuppeteerServer.ts +194 -194
  149. package/src/server/services/puppeteer/PuppeteerService.ts +1 -1
  150. package/src/server/smtp/services/CachedEmailService.ts +1 -1
  151. package/src/server/smtp/services/EmailReferenceService.ts +36 -37
  152. package/src/server/smtp/services/EngagementService.ts +1 -1
  153. package/src/server/workflows/channel/BroadcastEmail.ts +21 -8
  154. package/src/server/workflows/repair/channel/RepairChannelEmailCountsWorkflow.ts +1 -1
  155. package/src/server/workflows/repair/counts/RepairEmailCountsWorkflow.ts +1 -1
  156. package/src/server/workflows/repair/tags/RepairEmailTagsWorkflow.ts +1 -1
  157. package/src/server/workflows/smtp/DispatchEmailToMX.ts +11 -8
  158. package/src/server/workflows/smtp/MailDispatcherService.ts +5 -5
  159. package/src/server/workflows/smtp/PrepareEmailToSend.ts +1 -1
  160. package/src/server/workflows/sync/SyncMailboxWorkflow.ts +2 -2
  161. package/src/server/workflows/web-hooks/InvokeWebHookWorkflow.ts +1 -1
  162. package/src/wwwroot/routes/api/emails/channel/content/attachment/index.ts +2 -2
  163. package/src/wwwroot/routes/api/emails/channel/content/html/index.ts +6 -6
  164. package/src/wwwroot/routes/social-mail/public/email/attachment/index.ts +3 -1
  165. package/src/wwwroot/routes/social-mail/social/buttons/get.tsx +130 -130
  166. package/src/wwwroot/routes/social-mail/social/buttons-3x/get.tsx +143 -143
  167. package/dist/server/model/entities/MailboxEmail.d.ts.map +0 -1
  168. 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
- emailAddressID: number;
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, emailAddressID, accessCode, external, to, listID } = this.input;
96
- return await mds.encodeForBulk({ emailID, senderID, activityID, recipientID: emailAddressID, accessCode, external, to, listID });
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, emailAddressID, external } = this.input;
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.emailAddressID)
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.emailAddressID,
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, recipientID, activityID, accessCode, external, to, listID }:
45
- { senderID: number, emailID: number, recipientID: number, activityID: number, accessCode: string, external?: boolean, listID?: any, to: string[] }) {
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: recipientID,
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 = email.senderEmail.emailAddress;
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
- emailAddressID: x.emailAddressID,
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.mailboxes.some((mb) => mb.mailboxID === p.mailboxID)
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.mailboxes.some((mb) => mb.mailboxID === p.mailboxID)
316
+ x.mailboxContactEvents.some((mb) => mb.mailboxID === p.mailboxID)
317
317
  && x.headerMessageID === p.messageId
318
318
  && x.senderEmail.emailAddress === p.from
319
319
  )
@@ -108,7 +108,7 @@ export default class InvokeWebHookWorkflow extends Workflow<{ webHookID: number,
108
108
  lastEvent: "failed"
109
109
  }, { webHookID });
110
110
 
111
- console.error(error);
111
+ console.error(response);
112
112
  return false;
113
113
  }
114
114
 
@@ -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.mailboxes.some((c) => Sql.in(c.mailboxID, p.mailboxes))
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.mailboxes.some((c) => Sql.in(c.mailbox.domainID, p.domains))
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.mailboxes.some((c) => Sql.in(c.mailboxID, p.mailboxes) )
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.mailboxes.some((c) => Sql.in(c.mailbox.domainID, p.domains) )
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.mailboxes.some((c) => c.mailboxID === p.channelID
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.mailboxes.some((c) => c.mailboxID === p.channelID
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.mailboxes.some((c) => Sql.in(c.mailboxID, p.mailboxes))
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.mailboxes.some((c) => Sql.in(c.mailbox.domainID, p.domains))
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.mailboxes.some((c) => c.mailboxID === p.channelID
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
- * 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
- }
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
- const ec = await this.db.emails
125
- .where(ep, (p) => (x) => x.emailID === p.emailID as any)
126
- .first();
124
+ // const ec = await this.db.emails
125
+ // .where(ep, (p) => (x) => x.emailID === p.emailID as any)
126
+ // .first();
127
127
 
128
- if (ec?.viewCount) {
129
- return toKMBString(ec.viewCount);
130
- }
131
- }
128
+ // if (ec?.viewCount) {
129
+ // return toKMBString(ec.viewCount);
130
+ // }
131
+ // }
132
132
 
133
- }
133
+ // }