@social-mail/social-mail-web-server 1.7.80 → 1.7.82

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@social-mail/social-mail-web-server",
3
- "version": "1.7.80",
3
+ "version": "1.7.82",
4
4
  "description": "## Phase 1",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -1,9 +1,11 @@
1
1
  import { IEntityQuery } from "@entity-access/entity-access/dist/model/IFilterWithParameter.js";
2
2
  import BaseEvents from "./BaseEvents.js";
3
- import Inject from "@entity-access/entity-access/dist/di/di.js";
3
+ import Inject, { ServiceProvider } from "@entity-access/entity-access/dist/di/di.js";
4
4
  import BaseStorage from "../../storage/BaseStorage.js";
5
5
  import TempFileService from "../../storage/TempFileService.js";
6
6
  import { EmailLog } from "../entities/Email.js";
7
+ import ChangeEntry from "@entity-access/entity-access/dist/model/changes/ChangeEntry.js";
8
+ import EmailLogService from "../../services/email-logs/EmailLogService.js";
7
9
 
8
10
 
9
11
  export default class EmailLogEvents extends BaseEvents<EmailLog> {
@@ -39,4 +41,11 @@ export default class EmailLogEvents extends BaseEvents<EmailLog> {
39
41
  Object.defineProperty(entity, "url", { value: entity.url, enumerable: true });
40
42
  return entity;
41
43
  }
44
+
45
+ async afterDelete(entity: EmailLog, entry: ChangeEntry<EmailLog>) {
46
+ await this.storage.deleteFile(entity.cloudPath);
47
+
48
+ const els = ServiceProvider.resolve(this, EmailLogService);
49
+ await els.updateStorage({ emailID: entity.emailID, size: - entity.fileSize});
50
+ }
42
51
  }
@@ -33,6 +33,7 @@ export default class EmailLogService {
33
33
  for (const element of logs) {
34
34
  await this.storage.deleteFile(element.cloudPath);
35
35
  await this.db.emailLogs.statements.delete(element);
36
+ await this.updateStorage({ emailID: element.emailID, size: -element.fileSize});
36
37
  }
37
38
  }
38
39
 
@@ -42,6 +43,8 @@ export default class EmailLogService {
42
43
  await this.storage.deleteFile(log.cloudPath);
43
44
  await this.db.emailLogs.statements.delete({ logID });
44
45
  await tx.commit();
46
+
47
+ await this.updateStorage({ emailID: log, size: -log.fileSize});
45
48
  }
46
49
 
47
50
  async save(emailID: number, file: LocalFile, compression: string = "gz") {
@@ -54,36 +57,18 @@ export default class EmailLogService {
54
57
  const compressed = await tfs.createFrom(file.fileName + ".gz", GZip.zip(file.openRead()), "text/plain");
55
58
  await this.storage.createFile(cloudPath, compressed);
56
59
 
60
+ const size = file.contentSize;
61
+
57
62
  const log = await db.emailLogs.statements.insert({
58
63
  emailID,
59
64
  fileName: file.fileName,
60
- fileSize: file.contentSize,
65
+ fileSize: size,
61
66
  dateCreated,
62
67
  cloudPath,
63
68
  compression
64
69
  });
65
70
 
66
- let lastError;
67
-
68
- // we will make sure that we succeed once...
69
- for (let index = 0; index < 3; index++) {
70
- try {
71
- await db.mailboxes.where({ emailID}, (p) => (x) => x.emails.some((e) => e.emailID === p.emailID))
72
- .update({ size: file.contentSize }, (p) => (x) => ({
73
- storage: x.storage + Sql.cast.asInteger(p.size),
74
- dateUpdated: Sql.date.now()
75
- }));
76
- } catch (error) {
77
- lastError = error;
78
- await sleep(1000);
79
- continue;
80
- }
81
- return log;
82
- }
83
-
84
- if(lastError) {
85
- console.error(lastError);
86
- }
71
+ await this.updateStorage({ emailID, size});
87
72
 
88
73
  return log;
89
74
  }
@@ -104,4 +89,27 @@ export default class EmailLogService {
104
89
  return tf;
105
90
  }
106
91
 
92
+ async updateStorage({ emailID, size }) {
93
+ const { db } = this;
94
+ let lastError = null;
95
+ // we will make sure that we succeed once...
96
+ for (let index = 0; index < 3; index++) {
97
+ try {
98
+ await db.mailboxes.where({ emailID}, (p) => (x) => x.emails.some((e) => e.emailID === p.emailID))
99
+ .update({ size }, (p) => (x) => ({
100
+ storage: x.storage + Sql.cast.asInteger(p.size),
101
+ dateUpdated: Sql.date.now()
102
+ }));
103
+ } catch (error) {
104
+ lastError = error;
105
+ await sleep(1000);
106
+ continue;
107
+ }
108
+ return;
109
+ }
110
+ if (lastError) {
111
+ console.error(lastError);
112
+ }
113
+ }
114
+
107
115
  }
@@ -300,16 +300,17 @@ export default class DispatchEmailToMX extends Workflow<IMessageEnvelope> {
300
300
 
301
301
  if (this.response?.statusCode === SmtpStatusCodes.Ok) {
302
302
 
303
- await db.emailRecipients.statements.update({
304
- emailID,
305
- emailAddressID,
306
- status: "sent",
307
- dateSent: DateTime.now
308
- });
309
303
  await els.saveText(emailID,this.input.to.join(","), this.response.logs);
310
304
 
311
305
  if (activityID) {
312
306
  await db.subscriberActivities.statements.update({ activity: "sent" }, { activityID});
307
+ } else {
308
+ await db.emailRecipients.statements.update({
309
+ emailID,
310
+ emailAddressID,
311
+ status: "sent",
312
+ dateSent: DateTime.now
313
+ });
313
314
  }
314
315
  return;
315
316
  }