@social-mail/social-mail-web-server 1.8.354 → 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/dist/server/seed/ui/seed-ui.js +1 -1
- package/dist/server/services/files/FileVersionService.d.ts +2 -0
- package/dist/server/services/files/FileVersionService.d.ts.map +1 -1
- package/dist/server/services/files/FileVersionService.js +12 -1
- package/dist/server/services/files/FileVersionService.js.map +1 -1
- package/dist/server/services/files/SnapshotService.d.ts.map +1 -1
- package/dist/server/services/files/SnapshotService.js +0 -11
- package/dist/server/services/files/SnapshotService.js.map +1 -1
- package/dist/server/workflows/SocialWorkflowContext.d.ts.map +1 -1
- package/dist/server/workflows/SocialWorkflowContext.js +2 -0
- package/dist/server/workflows/SocialWorkflowContext.js.map +1 -1
- package/dist/server/workflows/files/DeleteFileHistoryWorkflow.d.ts +12 -0
- package/dist/server/workflows/files/DeleteFileHistoryWorkflow.d.ts.map +1 -0
- package/dist/server/workflows/files/DeleteFileHistoryWorkflow.js +65 -0
- package/dist/server/workflows/files/DeleteFileHistoryWorkflow.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/server/seed/ui/seed-ui.ts +1 -1
- package/src/server/services/files/FileVersionService.ts +8 -2
- package/src/server/services/files/SnapshotService.ts +0 -14
- package/src/server/workflows/SocialWorkflowContext.ts +2 -0
- package/src/server/workflows/files/DeleteFileHistoryWorkflow.ts +64 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@social-mail/social-mail-web-server",
|
|
3
|
-
"version": "1.8.
|
|
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.
|
|
25
|
-
"@entity-access/server-pages": "^1.1.
|
|
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",
|
|
@@ -17,7 +17,7 @@ export default async function seedUI(config: DBConfig) {
|
|
|
17
17
|
await config.saveVersion(UIPackageConfig, {
|
|
18
18
|
package: "@social-mail/social-mail-client",
|
|
19
19
|
view: "dist/web/AppIndex",
|
|
20
|
-
version: "1.9.
|
|
20
|
+
version: "1.9.56"
|
|
21
21
|
});
|
|
22
22
|
|
|
23
23
|
await config.saveVersion(WebComponentsPackageConfig, {
|
|
@@ -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
|
+
}
|