@social-mail/social-mail-web-server 1.8.355 → 1.8.356

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.8.355",
3
+ "version": "1.8.356",
4
4
  "description": "## Phase 1",
5
5
  "main": "index.js",
6
6
  "type": "module",
@@ -21,8 +21,8 @@
21
21
  "dependencies": {
22
22
  "@aws-sdk/client-s3": "^3.717.0",
23
23
  "@azure/storage-blob": "^12.25.0",
24
- "@entity-access/entity-access": "^1.0.504",
25
- "@entity-access/server-pages": "^1.1.536",
24
+ "@entity-access/entity-access": "^1.0.508",
25
+ "@entity-access/server-pages": "^1.1.539",
26
26
  "@parse/node-apn": "^6.5.0",
27
27
  "@paypal/paypal-server-sdk": "^1.0.0",
28
28
  "@peculiar/asn1-schema": "^2.3.15",
@@ -1,13 +1,16 @@
1
- import { RegisterScoped, ServiceProvider } from "@entity-access/entity-access/dist/di/di.js";
1
+ import Inject, { RegisterScoped, ServiceProvider } from "@entity-access/entity-access/dist/di/di.js";
2
2
  import AppFile from "../../model/entities/AppFile.js";
3
- import { globalServices } from "../../../globalServices.js";
4
3
  import SocialMailContext from "../../model/SocialMailContext.js";
5
4
  import DateTime from "@entity-access/entity-access/dist/types/DateTime.js";
6
5
  import { SessionUser } from "@entity-access/server-pages/dist/core/SessionUser.js";
6
+ import DeleteFileHistoryWorkflow from "../../workflows/files/DeleteFileHistoryWorkflow.js";
7
+ import { AppWorkflowContext } from "../../workflows/AppWorkflowContext.js";
7
8
 
8
9
  @RegisterScoped
9
10
  export default class FileVersionService {
10
11
 
12
+ @Inject workflowContext: AppWorkflowContext;
13
+
11
14
  public async saveVersion(user: SessionUser, file: AppFile) {
12
15
  const { userID, sessionID } = user ?? {};
13
16
  const db = ServiceProvider.resolve(this, SocialMailContext);
@@ -40,6 +43,9 @@ export default class FileVersionService {
40
43
  await db.websiteFolders.where({ rootFolder }, (p) => (x) => x.folderID === p.rootFolder)
41
44
  .update(void 0, (p) => (x) => ({ isModified: true }));
42
45
  }
46
+
47
+ // clean older versions...
48
+ await DeleteFileHistoryWorkflow.queue(this.workflowContext, file.appFileID);
43
49
  }
44
50
 
45
51
  }
@@ -115,20 +115,6 @@ export default class SnapshotService
115
115
 
116
116
  await tx.commit();
117
117
 
118
- // delete all file versions....
119
- // as snapshot version will be kept alive...
120
-
121
- await db.fileContents
122
- .where({ sourcePath }, (p) => (x) => x.versions.some((v) => Sql.text.like(v.file.path, p.sourcePath) ))
123
- .update(void 0, (p) => (x) => ({ deleted: true }));
124
-
125
- // Keep current version
126
- // Only delete the history
127
- await db.fileVersions
128
- .asQuery()
129
- .delete({ sourcePath }, (p) => (x) => x.fileContentID !== x.file.fileContentID
130
- && Sql.text.like(x.file.path, p.sourcePath));
131
-
132
118
  this.ms.snapshotRefresh.notify({ folderID });
133
119
 
134
120
  return snapshotRoot;
@@ -54,6 +54,7 @@ import DeleteWebSiteVersionWorkflow from "./web-site/DeleteWebSiteVersionWorkflo
54
54
  import SendLibraryContentWorkflow from "./channel/library/SendLibraryContentWorkflow.js";
55
55
  import CreateChannelWorkflow from "./channel/creation/CreateChannelWorkflow.js";
56
56
  import { AppWorkflowContext } from "./AppWorkflowContext.js";
57
+ import DeleteFileHistoryWorkflow from "./files/DeleteFileHistoryWorkflow.js";
57
58
 
58
59
  @RegisterSingleton
59
60
  export default class SocialWorkflowContext extends AppWorkflowContext {
@@ -108,6 +109,7 @@ export default class SocialWorkflowContext extends AppWorkflowContext {
108
109
  this.register(DeleteWebsiteWorkflow);
109
110
  this.register(DeleteWebSiteVersionWorkflow);
110
111
  this.register(DeleteFileWorkflow);
112
+ this.register(DeleteFileHistoryWorkflow);
111
113
 
112
114
  this.register(DeleteMailboxWorkflow);
113
115
  this.register(DeleteHostedDomainWorkflow);
@@ -0,0 +1,64 @@
1
+ import Inject from "@entity-access/entity-access/dist/di/di.js";
2
+ import Workflow, { UniqueActivity } from "@entity-access/entity-access/dist/workflows/Workflow.js";
3
+ import SocialMailContext from "../../model/SocialMailContext.js";
4
+ import DateTime from "@entity-access/entity-access/dist/types/DateTime.js";
5
+ import Sql from "@entity-access/entity-access/dist/sql/Sql.js";
6
+ import { AppWorkflowContext } from "../AppWorkflowContext.js";
7
+ import { randomBytes, randomUUID } from "node:crypto";
8
+
9
+ export default class DeleteFileHistoryWorkflow extends Workflow<{ appFileID }> {
10
+
11
+ static taskGroup = "background";
12
+
13
+ static queue(context: AppWorkflowContext, appFileID) {
14
+ const group = `delete-file-history-v1-${appFileID}`;
15
+ const id = `${group}-${randomBytes(8).readBigUInt64BE().toString(36)}`;
16
+ return context.queue(DeleteFileHistoryWorkflow, { appFileID }, {
17
+ id ,
18
+ throttle: {
19
+ group,
20
+ deferSeconds: 60
21
+ }
22
+ });
23
+ }
24
+
25
+ async run() {
26
+
27
+ await this.deleteVersions();
28
+
29
+ }
30
+
31
+ @UniqueActivity
32
+ async deleteVersions(
33
+ @Inject db?: SocialMailContext
34
+ ) {
35
+ const { appFileID } = this.input;
36
+
37
+ const recentVersions = await db.fileVersions.where(this.input, (p) => (x) => x.fileID === p.appFileID)
38
+ .orderByDescending(void 0, (p) => (x) => x.versionID)
39
+ .limit(30)
40
+ .toArray();
41
+
42
+ const date = DateTime.now.addDays(-30);
43
+
44
+ const oldest = await db.fileVersions.where({ appFileID, date }, (p) => (x) => x.fileID === p.appFileID
45
+ && x.dateCreated < Sql.cast.asDateTime(p.date)
46
+ )
47
+ .orderByDescending(void 0, (p) => (x) => x.versionID)
48
+ .first();
49
+
50
+ const ids = recentVersions.map((x) => x.versionID);
51
+ let oldestId = oldest?.versionID ?? "0" as any;
52
+
53
+ if (ids.includes(oldestId)) {
54
+ oldestId = ids.pop();
55
+ }
56
+
57
+ await db.fileContents.where({ appFileID, oldestId },(p) => (x) => x.versions.some((v) => v.fileID === p.appFileID && v.versionID < p.oldestId))
58
+ .update(void 0, (p) => (x) => ({ deleted: true }));
59
+
60
+ await db.fileVersions.asQuery()
61
+ .delete({ appFileID, oldestId },(p) => (v) => v.fileID === p.appFileID && v.versionID < p.oldestId);
62
+ }
63
+
64
+ }