@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.
- package/dist/WebServer.js +1 -1
- package/dist/WebServer.js.map +1 -1
- package/dist/common/globalEnv.d.ts +1 -0
- package/dist/common/globalEnv.d.ts.map +1 -1
- package/dist/common/globalEnv.js +7 -0
- package/dist/common/globalEnv.js.map +1 -1
- package/dist/server/model/entities/Email.d.ts +1 -2
- package/dist/server/model/entities/Email.d.ts.map +1 -1
- package/dist/server/model/entities/Email.js +1 -5
- package/dist/server/model/entities/Email.js.map +1 -1
- package/dist/server/model/entities/MailboxContact.d.ts +1 -0
- package/dist/server/model/entities/MailboxContact.d.ts.map +1 -1
- package/dist/server/model/entities/MailboxContact.js +4 -0
- package/dist/server/model/entities/MailboxContact.js.map +1 -1
- package/dist/server/model/entities/User.d.ts +1 -0
- package/dist/server/model/entities/User.d.ts.map +1 -1
- package/dist/server/model/entities/User.js.map +1 -1
- package/dist/server/model/events/MailboxContactEvents.d.ts +1 -2
- package/dist/server/model/events/MailboxContactEvents.d.ts.map +1 -1
- package/dist/server/model/events/MailboxContactEvents.js +49 -11
- package/dist/server/model/events/MailboxContactEvents.js.map +1 -1
- package/dist/server/seed/seed.d.ts.map +1 -1
- package/dist/server/seed/seed.js +3 -2
- package/dist/server/seed/seed.js.map +1 -1
- package/dist/server/smtp/services/EmailReferenceService.js +1 -1
- package/dist/server/smtp/services/EmailReferenceService.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -2
- package/src/WebServer.ts +1 -1
- package/src/common/globalEnv.ts +9 -0
- package/src/server/model/entities/Email.ts +3 -3
- package/src/server/model/entities/MailboxContact.ts +3 -0
- package/src/server/model/entities/User.ts +1 -0
- package/src/server/model/events/MailboxContactEvents.ts +62 -12
- package/src/server/seed/seed.ts +4 -2
- 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.
|
|
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.
|
|
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) {
|
package/src/common/globalEnv.ts
CHANGED
|
@@ -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, {
|
|
@@ -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
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
128
|
+
entity.openThreads = all.openThreads;
|
|
129
|
+
entity.totalThreads = all.totalThreads;
|
|
80
130
|
}
|
|
81
131
|
}
|
|
82
132
|
|
package/src/server/seed/seed.ts
CHANGED
|
@@ -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;
|