@social-mail/social-mail-web-server 1.4.779 → 1.4.781

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 (36) hide show
  1. package/dist/WebServer.js +1 -1
  2. package/dist/WebServer.js.map +1 -1
  3. package/dist/common/globalEnv.d.ts +1 -0
  4. package/dist/common/globalEnv.d.ts.map +1 -1
  5. package/dist/common/globalEnv.js +7 -0
  6. package/dist/common/globalEnv.js.map +1 -1
  7. package/dist/server/model/entities/Email.d.ts +1 -2
  8. package/dist/server/model/entities/Email.d.ts.map +1 -1
  9. package/dist/server/model/entities/Email.js +1 -5
  10. package/dist/server/model/entities/Email.js.map +1 -1
  11. package/dist/server/model/entities/MailboxContact.d.ts +1 -0
  12. package/dist/server/model/entities/MailboxContact.d.ts.map +1 -1
  13. package/dist/server/model/entities/MailboxContact.js +4 -0
  14. package/dist/server/model/entities/MailboxContact.js.map +1 -1
  15. package/dist/server/model/entities/User.d.ts +1 -0
  16. package/dist/server/model/entities/User.d.ts.map +1 -1
  17. package/dist/server/model/entities/User.js.map +1 -1
  18. package/dist/server/model/events/MailboxContactEvents.d.ts +1 -2
  19. package/dist/server/model/events/MailboxContactEvents.d.ts.map +1 -1
  20. package/dist/server/model/events/MailboxContactEvents.js +49 -11
  21. package/dist/server/model/events/MailboxContactEvents.js.map +1 -1
  22. package/dist/server/seed/seed.d.ts.map +1 -1
  23. package/dist/server/seed/seed.js +3 -2
  24. package/dist/server/seed/seed.js.map +1 -1
  25. package/dist/server/smtp/services/EmailReferenceService.js +1 -1
  26. package/dist/server/smtp/services/EmailReferenceService.js.map +1 -1
  27. package/dist/tsconfig.tsbuildinfo +1 -1
  28. package/package.json +2 -2
  29. package/src/WebServer.ts +1 -1
  30. package/src/common/globalEnv.ts +9 -0
  31. package/src/server/model/entities/Email.ts +3 -3
  32. package/src/server/model/entities/MailboxContact.ts +3 -0
  33. package/src/server/model/entities/User.ts +1 -0
  34. package/src/server/model/events/MailboxContactEvents.ts +62 -12
  35. package/src/server/seed/seed.ts +4 -2
  36. package/src/server/smtp/services/EmailReferenceService.ts +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@social-mail/social-mail-web-server",
3
- "version": "1.4.779",
3
+ "version": "1.4.781",
4
4
  "description": "## Phase 1",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -21,7 +21,7 @@
21
21
  "dependencies": {
22
22
  "@aws-sdk/client-s3": "^3.609.0",
23
23
  "@azure/storage-blob": "^12.23.0",
24
- "@entity-access/entity-access": "^1.0.339",
24
+ "@entity-access/entity-access": "^1.0.341",
25
25
  "@entity-access/server-pages": "^1.1.220",
26
26
  "@otplib/preset-v11": "^12.0.1",
27
27
  "@social-mail/noto-emoji-svg": "^2.0.42",
package/src/WebServer.ts CHANGED
@@ -182,7 +182,7 @@ export default class WebServer {
182
182
 
183
183
  async seed() {
184
184
  await seed();
185
- await globalServices.resolve(WorkflowContext).storage.seed();
185
+ await globalServices.resolve(WorkflowContext).storage.seed(globalEnv.version);
186
186
  }
187
187
 
188
188
  registerRoutes(server: ServerPages) {
@@ -1,5 +1,13 @@
1
+ import { readFileSync } from "node:fs";
1
2
  import { availableParallelism } from "node:os";
3
+ import { join } from "node:path";
4
+ import { fileURLToPath } from "node:url";
2
5
 
6
+ const packageJsonPath = join(fileURLToPath(import.meta.url), "../../../package.json");
7
+
8
+ const packageJson = JSON.parse(readFileSync(packageJsonPath , "utf8"));
9
+
10
+ const { version } = packageJson;
3
11
 
4
12
  const isTestMode = (process.env.LOGGER_SERVER_TEST_MODE ?? "false") === "true";
5
13
 
@@ -10,6 +18,7 @@ if (Number.isNaN(port)) {
10
18
 
11
19
  export const globalEnv = {
12
20
  protocol: void 0,
21
+ version,
13
22
  host: process.env.SOCIAL_MAIL_HOST,
14
23
  cdn: process.env.SOCIAL_MAIL_CDN,
15
24
  path: process.env.SOCIAL_MAIL_PATH || "/",
@@ -19,7 +19,7 @@ import type EmailEngagement from "./EmailEngagement.js";
19
19
  import Sql from "@entity-access/entity-access/dist/sql/Sql.js";
20
20
  import { apiPath } from "../../../common/globalEnv.js";
21
21
 
22
- const emailStatuses = [ "queued", "received", "draft", "published", "pending-approval", "scheduled", "sent", "sent-failed", "deleted"] as const;
22
+ const emailStatuses = [ "queued", "received", "draft", "published", "pending-approval", "scheduled", "sent", "sent-failed", "deleted", "closed"] as const;
23
23
  export type emailStatusType = typeof emailStatuses[number];
24
24
 
25
25
 
@@ -200,8 +200,8 @@ export class Email {
200
200
  })
201
201
  public forwardedID: number;
202
202
 
203
- @Column({ dataType: "DateTime", nullable: true })
204
- public closed: DateTime;
203
+ // @Column({ dataType: "DateTime", nullable: true })
204
+ // public closed: DateTime;
205
205
 
206
206
  @Column({ dataType: "BigInt" , nullable: true })
207
207
  @RelateTo(Email, {
@@ -118,6 +118,9 @@ export default class MailboxContact {
118
118
  @Column({ dataType: "Boolean", default: () => false})
119
119
  public mute: boolean;
120
120
 
121
+ @JsonProperty({})
122
+ public closeAllConversations: boolean;
123
+
121
124
  /**
122
125
  * Used at client end ...
123
126
  */
@@ -126,6 +126,7 @@ export class User {
126
126
 
127
127
  // storeOrders: StoreBill[];
128
128
  stores: StoreUser[];
129
+ closedEmails: Email[];
129
130
 
130
131
  // [GraphService.toGraph]() {
131
132
  // return {
@@ -7,6 +7,7 @@ import EmailAddressService from "../../services/EmailAddressService.js";
7
7
  import { ForeignKeyFilter } from "@entity-access/entity-access/dist/model/events/EntityEvents.js";
8
8
  import SocialMailContext from "../SocialMailContext.js";
9
9
  import Sql from "@entity-access/entity-access/dist/sql/Sql.js";
10
+ import DateTime from "@entity-access/entity-access/dist/types/DateTime.js";
10
11
 
11
12
  export default class MailboxContactEvents extends AuthenticatedEvents<MailboxContact> {
12
13
 
@@ -26,10 +27,6 @@ export default class MailboxContactEvents extends AuthenticatedEvents<MailboxCon
26
27
  || x.mailbox.domain.domainUsers.some((u) => u.userID === p.userID || u.isAdmin === true));
27
28
  }
28
29
 
29
- beforeUpdate(entity: MailboxContact, entry: ChangeEntry<MailboxContact>) {
30
- // do nothing...
31
- }
32
-
33
30
  async beforeInsert(entity: MailboxContact, entry: ChangeEntry<MailboxContact>) {
34
31
  if (this.verify) {
35
32
  this.sessionUser.ensureLoggedIn();
@@ -45,12 +42,68 @@ export default class MailboxContactEvents extends AuthenticatedEvents<MailboxCon
45
42
  }
46
43
  }
47
44
 
48
- async afterUpdate(entity: MailboxContact, entry: ChangeEntry<MailboxContact>) {
45
+ async beforeUpdate(entity: MailboxContact, entry: ChangeEntry<MailboxContact>) {
49
46
  // if blocked was changed
50
47
  const { mailboxID, blocked, autoClose, emailAddressID, openThreads } = entity;
51
48
 
52
49
  const db = ServiceProvider.resolve(this, SocialMailContext);
53
- if (entry.isUpdated("autoClose") || entry.isUpdated("blocked")) {
50
+ if (entity.closeAllConversations) {
51
+
52
+ // we will simply put a dummy email
53
+ // with userID set to current userid
54
+ // and set it as lastReplyID
55
+
56
+ // check if there are any open threads..
57
+ if (entity.openThreads) {
58
+
59
+ const dateCreated = DateTime.now;
60
+ const dateSent = dateCreated;
61
+ const dateUpdated = dateCreated;
62
+
63
+ const email = await db.emails.statements.insert({
64
+ subject: "Thread Closed",
65
+ textBody: "",
66
+ htmlBody: "",
67
+ senderID: mailboxID,
68
+ userID: this.sessionUser.userID,
69
+ dateCreated,
70
+ dateSent,
71
+ dateUpdated,
72
+ status: "closed"
73
+ });
74
+
75
+ const { emailID } = email;
76
+ await db.mailboxContactEmails.statements.insert({
77
+ emailID,
78
+ emailAddressID,
79
+ mailboxID,
80
+ dateReceived: dateSent,
81
+ timeRead: dateSent
82
+ });
83
+
84
+ await db.mailboxEmails.statements.insert({
85
+ emailID,
86
+ mailboxID
87
+ });
88
+
89
+ await db.emails
90
+ .where(entity , (p) => (x) => x.threadContacts.some((t) => t.mailboxID === p.mailboxID
91
+ && t.emailAddressID === p.emailAddressID)
92
+ && x.threadID === null
93
+ && x.lastReplyID === null
94
+ )
95
+ .update(email, (p) => (x) => ({
96
+ lastReplyID: p.emailID
97
+ }));
98
+
99
+ entity.openThreads = 0;
100
+
101
+ }
102
+
103
+ }
104
+
105
+
106
+ if (entry.isModified("autoClose") || entry.isModified("blocked")) {
54
107
  if (autoClose || blocked) {
55
108
 
56
109
  await db.mailboxes.where({ mailboxID }, (p) => (x) => x.mailboxID === p.mailboxID)
@@ -58,11 +111,7 @@ export default class MailboxContactEvents extends AuthenticatedEvents<MailboxCon
58
111
  openThreads: Sql.math.max(0, x.openThreads - Sql.cast.asInteger(p.openThreads)),
59
112
  }));
60
113
 
61
- await db.mailboxContacts.where(entity, (p) => (x) => x.mailboxID === p.mailboxID
62
- && x.emailAddressID === p.emailAddressID)
63
- .update(void 0, (p) => (x) => ({
64
- openThreads: 0
65
- }));
114
+ entity.openThreads = 0;
66
115
 
67
116
  } else {
68
117
  // we need to recalculate
@@ -76,7 +125,8 @@ export default class MailboxContactEvents extends AuthenticatedEvents<MailboxCon
76
125
  totalThreads: 1,
77
126
  openThreads: x.lastReplyID === null ? 1 : 0
78
127
  }));
79
- await db.mailboxContacts.statements.update(all, { mailboxID, emailAddressID});
128
+ entity.openThreads = all.openThreads;
129
+ entity.totalThreads = all.totalThreads;
80
130
  }
81
131
  }
82
132
 
@@ -17,13 +17,15 @@ export default async function seed() {
17
17
  // making sure multiple workers don't interfere
18
18
  using fl = await LockFile.lock(`seed-lock-${globalEnv.serverID}.lock`);
19
19
 
20
+ const migrationConfig = { version: globalEnv.version };
21
+
20
22
  const lc = scope.resolve(DbLockContext);
21
23
  await lc.connection.ensureDatabase();
22
- await lc.connection.automaticMigrations().migrate(lc);
24
+ await lc.connection.automaticMigrations().migrate(lc, migrationConfig);
23
25
 
24
26
  const context = scope.resolve(SocialMailContext);
25
27
  await context.connection.ensureDatabase();
26
- await context.connection.automaticMigrations().migrate(context);
28
+ await context.connection.automaticMigrations().migrate(context, migrationConfig);
27
29
 
28
30
 
29
31
  context.verifyFilters = false;
@@ -121,7 +121,7 @@ export default class EmailReferenceService {
121
121
  let newThread = 0;
122
122
  let newOpenThread = 0;
123
123
 
124
- if (thread) {
124
+ if (thread && !email.hasUnsubscribe) {
125
125
  // yes thread exists...
126
126
  // and was already open
127
127