prostgles-server 4.2.614 → 4.2.616
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/DBSchemaBuilder/DBSchemaBuilder.d.ts +2 -2
- package/dist/DBSchemaBuilder/DBSchemaBuilder.d.ts.map +1 -1
- package/dist/DboBuilder/DboBuilder.d.ts +2 -0
- package/dist/DboBuilder/DboBuilder.d.ts.map +1 -1
- package/dist/DboBuilder/DboBuilder.js +17 -3
- package/dist/DboBuilder/DboBuilder.js.map +1 -1
- package/dist/DboBuilder/TableHandler/TableHandler.d.ts +5 -6
- package/dist/DboBuilder/TableHandler/TableHandler.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/TableHandler.js +17 -7
- package/dist/DboBuilder/TableHandler/TableHandler.js.map +1 -1
- package/dist/DboBuilder/TableHandler/delete.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/delete.js +1 -0
- package/dist/DboBuilder/TableHandler/delete.js.map +1 -1
- package/dist/DboBuilder/TableHandler/executeAfterHooksCheckAndPostValidation.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/executeAfterHooksCheckAndPostValidation.js +1 -1
- package/dist/DboBuilder/TableHandler/executeAfterHooksCheckAndPostValidation.js.map +1 -1
- package/dist/DboBuilder/TableHandler/insert/insert.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/insert/insert.js +16 -5
- package/dist/DboBuilder/TableHandler/insert/insert.js.map +1 -1
- package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.d.ts +3 -5
- package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.js +13 -26
- package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.js.map +1 -1
- package/dist/DboBuilder/TableHandler/update.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/update.js +26 -11
- package/dist/DboBuilder/TableHandler/update.js.map +1 -1
- package/dist/DboBuilder/TableHandler/updateFile.d.ts +6 -2
- package/dist/DboBuilder/TableHandler/updateFile.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/updateFile.js +27 -11
- package/dist/DboBuilder/TableHandler/updateFile.js.map +1 -1
- package/dist/DboBuilder/TableHandler/uploadFile.d.ts +3 -2
- package/dist/DboBuilder/TableHandler/uploadFile.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/uploadFile.js +15 -4
- package/dist/DboBuilder/TableHandler/uploadFile.js.map +1 -1
- package/dist/Logging.d.ts +1 -1
- package/dist/Logging.d.ts.map +1 -1
- package/dist/PublishParser/publishTypesAndUtils.d.ts +12 -6
- package/dist/PublishParser/publishTypesAndUtils.d.ts.map +1 -1
- package/dist/PublishParser/publishTypesAndUtils.js.map +1 -1
- package/dist/StorageClient/deleteUnreferencedFile.d.ts +4 -0
- package/dist/StorageClient/deleteUnreferencedFile.d.ts.map +1 -0
- package/dist/StorageClient/deleteUnreferencedFile.js +15 -0
- package/dist/StorageClient/deleteUnreferencedFile.js.map +1 -0
- package/dist/StorageClient/getFileStorageKey.d.ts +4 -0
- package/dist/StorageClient/getFileStorageKey.d.ts.map +1 -0
- package/dist/StorageClient/getFileStorageKey.js +7 -0
- package/dist/StorageClient/getFileStorageKey.js.map +1 -0
- package/dist/StorageClient/getFileTableConfig.d.ts +1 -0
- package/dist/StorageClient/getFileTableConfig.d.ts.map +1 -1
- package/dist/StorageClient/getFileTableConfig.js +9 -4
- package/dist/StorageClient/getFileTableConfig.js.map +1 -1
- package/dist/StorageClient/getFileType.d.ts.map +1 -1
- package/dist/StorageClient/getFileType.js +8 -10
- package/dist/StorageClient/getFileType.js.map +1 -1
- package/dist/StorageClient/getLocalStorageClient.d.ts.map +1 -1
- package/dist/StorageClient/getLocalStorageClient.js +20 -37
- package/dist/StorageClient/getLocalStorageClient.js.map +1 -1
- package/dist/StorageClient/getValidatedFileType.d.ts.map +1 -1
- package/dist/StorageClient/getValidatedFileType.js +4 -2
- package/dist/StorageClient/getValidatedFileType.js.map +1 -1
- package/dist/StorageClient/setupFileServeHandler.d.ts.map +1 -1
- package/dist/StorageClient/setupFileServeHandler.js +11 -3
- package/dist/StorageClient/setupFileServeHandler.js.map +1 -1
- package/dist/TableHooks/TableHooks.d.ts +11 -4
- package/dist/TableHooks/TableHooks.d.ts.map +1 -1
- package/lib/DBSchemaBuilder/DBSchemaBuilder.ts +3 -2
- package/lib/DboBuilder/DboBuilder.ts +18 -3
- package/lib/DboBuilder/TableHandler/TableHandler.ts +19 -7
- package/lib/DboBuilder/TableHandler/delete.ts +1 -0
- package/lib/DboBuilder/TableHandler/executeAfterHooksCheckAndPostValidation.ts +1 -2
- package/lib/DboBuilder/TableHandler/insert/insert.ts +16 -6
- package/lib/DboBuilder/TableHandler/onDeleteFromFileTable.ts +17 -33
- package/lib/DboBuilder/TableHandler/update.ts +26 -12
- package/lib/DboBuilder/TableHandler/updateFile.ts +42 -19
- package/lib/DboBuilder/TableHandler/uploadFile.ts +32 -7
- package/lib/Logging.ts +1 -0
- package/lib/PublishParser/publishTypesAndUtils.ts +27 -16
- package/lib/StorageClient/deleteUnreferencedFile.ts +19 -0
- package/lib/StorageClient/getFileStorageKey.ts +5 -0
- package/lib/StorageClient/getFileTableConfig.ts +19 -5
- package/lib/StorageClient/getFileType.ts +11 -14
- package/lib/StorageClient/getLocalStorageClient.ts +20 -43
- package/lib/StorageClient/getValidatedFileType.ts +4 -1
- package/lib/StorageClient/setupFileServeHandler.ts +11 -3
- package/lib/TableHooks/TableHooks.ts +24 -14
- package/package.json +2 -2
|
@@ -4,6 +4,7 @@ import type { TableRowFromColumnDefinitions } from "../TableConfig/TableRowFromC
|
|
|
4
4
|
import type { TableHooks } from "../TableHooks/TableHooks";
|
|
5
5
|
declare const FILE_TABLE_COLUMN_DEFINITIONS: {
|
|
6
6
|
readonly id: "UUID PRIMARY KEY DEFAULT gen_random_uuid()";
|
|
7
|
+
readonly storage_key: "UUID UNIQUE";
|
|
7
8
|
readonly extension: "TEXT NOT NULL DEFAULT ''";
|
|
8
9
|
readonly content_type: "TEXT NOT NULL DEFAULT ''";
|
|
9
10
|
readonly content_length: "BIGINT NOT NULL DEFAULT 0";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFileTableConfig.d.ts","sourceRoot":"","sources":["../../lib/StorageClient/getFileTableConfig.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,8CAA8C,CAAC;AAClG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"getFileTableConfig.d.ts","sourceRoot":"","sources":["../../lib/StorageClient/getFileTableConfig.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,8CAA8C,CAAC;AAClG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAI3D,QAAA,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;CAmBzB,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG,6BAA6B,CAAC,OAAO,6BAA6B,CAAC,CAAC;AAE/F,eAAO,MAAM,kBAAkB,GAC7B,KAAK,SAAS,KACb;IAAE,WAAW,EAAE,WAAW,GAAG,SAAS,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,SAAS,CAAA;CAyIvF,CAAC"}
|
|
@@ -8,6 +8,7 @@ const uploadFile_1 = require("../DboBuilder/TableHandler/uploadFile");
|
|
|
8
8
|
const setupFileServeHandler_1 = require("./setupFileServeHandler");
|
|
9
9
|
const FILE_TABLE_COLUMN_DEFINITIONS = {
|
|
10
10
|
id: `UUID PRIMARY KEY DEFAULT gen_random_uuid()`,
|
|
11
|
+
storage_key: `UUID UNIQUE`, // NULL for legacy objects stored under their file ID.
|
|
11
12
|
extension: `TEXT NOT NULL DEFAULT ''`,
|
|
12
13
|
content_type: `TEXT NOT NULL DEFAULT ''`,
|
|
13
14
|
content_length: `BIGINT NOT NULL DEFAULT 0`,
|
|
@@ -77,8 +78,8 @@ const getFileTableConfig = (prg) => {
|
|
|
77
78
|
insert: 1,
|
|
78
79
|
update: 1,
|
|
79
80
|
},
|
|
80
|
-
validate: async ({ data: insertData, localParams, command, filter }) => {
|
|
81
|
-
const tableHandler =
|
|
81
|
+
validate: async ({ data: insertData, localParams, command, filter, dbx, onCommit, onRollback, }) => {
|
|
82
|
+
const tableHandler = dbx[fileTableName];
|
|
82
83
|
if (!tableHandler)
|
|
83
84
|
throw "Storage tableHandler not found";
|
|
84
85
|
(0, uploadFile_1.assertFileObjectValid)(insertData);
|
|
@@ -86,6 +87,8 @@ const getFileTableConfig = (prg) => {
|
|
|
86
87
|
const data = dataBlob;
|
|
87
88
|
if (command === "update") {
|
|
88
89
|
const { newData } = await (0, updateFile_1.updateFile)(tableHandler, fileTable, {
|
|
90
|
+
onCommit,
|
|
91
|
+
onRollback,
|
|
89
92
|
filter: filter ?? {},
|
|
90
93
|
localParams,
|
|
91
94
|
data,
|
|
@@ -100,6 +103,8 @@ const getFileTableConfig = (prg) => {
|
|
|
100
103
|
};
|
|
101
104
|
}
|
|
102
105
|
const media = await (0, uploadFile_1.uploadFile)(fileTable, {
|
|
106
|
+
onCommit,
|
|
107
|
+
onRollback,
|
|
103
108
|
data,
|
|
104
109
|
original_name,
|
|
105
110
|
localParams,
|
|
@@ -116,9 +121,9 @@ const getFileTableConfig = (prg) => {
|
|
|
116
121
|
},
|
|
117
122
|
...(userFileTableHooks?.beforeEach || []),
|
|
118
123
|
],
|
|
119
|
-
onInsteadOfDelete: async ({
|
|
124
|
+
onInsteadOfDelete: async ({ onCommit, tx, returningQuery, isOneOrNone, filterOpts }) => {
|
|
120
125
|
return (0, onDeleteFromFileTable_1.onDeleteFromFileTable)(fileTable, {
|
|
121
|
-
|
|
126
|
+
onCommit,
|
|
122
127
|
t: tx,
|
|
123
128
|
returningQuery,
|
|
124
129
|
isOneOrNone,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFileTableConfig.js","sourceRoot":"","sources":["../../lib/StorageClient/getFileTableConfig.ts"],"names":[],"mappings":";;;AAAA,qDAA2C;AAC3C,4FAAyF;AACzF,sEAAmE;AACnE,sEAA0F;AAM1F,mEAAgE;
|
|
1
|
+
{"version":3,"file":"getFileTableConfig.js","sourceRoot":"","sources":["../../lib/StorageClient/getFileTableConfig.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFileType.d.ts","sourceRoot":"","sources":["../../lib/StorageClient/getFileType.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getFileType.d.ts","sourceRoot":"","sources":["../../lib/StorageClient/getFileType.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAG/E,eAAO,MAAM,WAAW,GACtB,MAAM,MAAM,GAAG,MAAM,EACrB,UAAU,MAAM,KACf,OAAO,CAAC;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,GAAG,EAAE,iBAAiB,CAAA;CAAE,CA4BhE,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAClC,UAAU,MAAM,KACf;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,GAAG,EAAE,iBAAiB,CAAA;CAAE,GAAG,SAgB3D,CAAC"}
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
// const fileType = require("file-type");
|
|
3
|
-
// const res = await fileType.fromBuffer(typeof file === "string"? Buffer.from(file, 'utf8') : file);
|
|
4
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
3
|
exports.getFileTypeFromFilename = exports.getFileType = void 0;
|
|
6
4
|
const prostgles_types_1 = require("prostgles-types");
|
|
@@ -9,21 +7,21 @@ const getFileType = async (file, fileName) => {
|
|
|
9
7
|
const fileNameMime = (0, exports.getFileTypeFromFilename)(fileName);
|
|
10
8
|
if (!fileNameMime?.ext)
|
|
11
9
|
throw new Error("File name must contain extension");
|
|
12
|
-
const
|
|
13
|
-
if (!
|
|
14
|
-
|
|
15
|
-
const
|
|
16
|
-
if (
|
|
10
|
+
const detectedFileType = await fileTypeFromBuffer(typeof file === "string" ? Buffer.from(file, "utf8") : file);
|
|
11
|
+
if (!detectedFileType) {
|
|
12
|
+
// Text formats may not have a detectable binary signature.
|
|
13
|
+
const { mime } = fileNameMime;
|
|
14
|
+
if (mime.startsWith("text/") || mime.endsWith("+xml") || mime === "application/sql") {
|
|
17
15
|
return fileNameMime;
|
|
18
16
|
}
|
|
19
17
|
throw new Error("Could not get the file type from file buffer");
|
|
20
18
|
}
|
|
21
19
|
else {
|
|
22
|
-
if (fileNameMime.ext.toLowerCase() !==
|
|
23
|
-
throw new Error(`There is a mismatch between file name extension and actual buffer extension: ${fileNameMime.ext} vs ${
|
|
20
|
+
if (fileNameMime.ext.toLowerCase() !== detectedFileType.ext.toLowerCase()) {
|
|
21
|
+
throw new Error(`There is a mismatch between file name extension and actual buffer extension: ${fileNameMime.ext} vs ${detectedFileType.ext}`);
|
|
24
22
|
}
|
|
25
23
|
}
|
|
26
|
-
return
|
|
24
|
+
return detectedFileType;
|
|
27
25
|
};
|
|
28
26
|
exports.getFileType = getFileType;
|
|
29
27
|
const getFileTypeFromFilename = (fileName) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getFileType.js","sourceRoot":"","sources":["../../lib/StorageClient/getFileType.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getFileType.js","sourceRoot":"","sources":["../../lib/StorageClient/getFileType.ts"],"names":[],"mappings":";;;AACA,qDAA+D;AAExD,MAAM,WAAW,GAAG,KAAK,EAC9B,IAAqB,EACrB,QAAgB,EACiD,EAAE;IACnE,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAO,IAAI,CAAC,qBAAqB,CAG9D,CAAC;IAEH,MAAM,YAAY,GAAG,IAAA,+BAAuB,EAAC,QAAQ,CAAC,CAAC;IACvD,IAAI,CAAC,YAAY,EAAE,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC5E,MAAM,gBAAgB,GAAG,MAAM,kBAAkB,CAC/C,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAC5D,CAAC;IAEF,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACtB,2DAA2D;QAC3D,MAAM,EAAE,IAAI,EAAE,GAAG,YAAY,CAAC;QAC9B,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,KAAK,iBAAiB,EAAE,CAAC;YACpF,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;SAAM,CAAC;QACN,IAAI,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,gBAAgB,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC;YAC1E,MAAM,IAAI,KAAK,CACb,gFAAgF,YAAY,CAAC,GAAG,OAAO,gBAAgB,CAAC,GAAG,EAAE,CAC9H,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,gBAAuB,CAAC;AACjC,CAAC,CAAC;AA/BW,QAAA,WAAW,eA+BtB;AAEK,MAAM,uBAAuB,GAAG,CACrC,QAAgB,EACoD,EAAE;IACtE,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEtC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAE3C,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,EAC7C,IAAI,GAAG,IAAA,yBAAO,EAAC,qCAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5C,qCAAmB,CAAC,CAAC,CAAuB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAChE,CAAC;IAEJ,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAE5B,OAAO;QACL,IAAI;QACJ,GAAG,EAAE,OAA4B;KAClC,CAAC;AACJ,CAAC,CAAC;AAlBW,QAAA,uBAAuB,2BAkBlC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getLocalStorageClient.d.ts","sourceRoot":"","sources":["../../lib/StorageClient/getLocalStorageClient.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"getLocalStorageClient.d.ts","sourceRoot":"","sources":["../../lib/StorageClient/getLocalStorageClient.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAEV,kBAAkB,EAEnB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,MAAM,WAAW,GAAG;IACxB;;;OAGG;IACH,eAAe,EAAE,MAAM,CAAC;IAExB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,aAAa,WAAW,KAAG,kBAiFhE,CAAC"}
|
|
@@ -8,6 +8,7 @@ const crypto_1 = __importDefault(require("crypto"));
|
|
|
8
8
|
const fs_1 = __importDefault(require("fs"));
|
|
9
9
|
const path_1 = __importDefault(require("path"));
|
|
10
10
|
const stream_1 = __importDefault(require("stream"));
|
|
11
|
+
const promises_1 = require("stream/promises");
|
|
11
12
|
const getLocalStorageClient = (localConfig) => {
|
|
12
13
|
const { localFolderPath, minFreeBytes = 100 * 1024 * 1024 } = localConfig; // Default 100MB
|
|
13
14
|
// Helper to ensure we have enough free disk space (Requires Node >= 18.17.0)
|
|
@@ -35,46 +36,28 @@ const getLocalStorageClient = (localConfig) => {
|
|
|
35
36
|
const filePath = path_1.default.join(localFolderPath, args.fileName);
|
|
36
37
|
const hash = crypto_1.default.createHash("md5");
|
|
37
38
|
let contentLength = 0;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
});
|
|
48
|
-
});
|
|
49
|
-
if (typeof args.file === "string" || Buffer.isBuffer(args.file)) {
|
|
50
|
-
const buffer = Buffer.isBuffer(args.file) ? args.file : Buffer.from(args.file);
|
|
51
|
-
contentLength = buffer.length;
|
|
52
|
-
hash.update(buffer);
|
|
53
|
-
if (args.onProgress) {
|
|
39
|
+
const buffered = typeof args.file === "string" || Buffer.isBuffer(args.file);
|
|
40
|
+
const source = buffered ? stream_1.default.Readable.from([args.file]) : args.file;
|
|
41
|
+
let lastProgress = Date.now();
|
|
42
|
+
const measure = new stream_1.default.Transform({
|
|
43
|
+
transform: (chunk, _encoding, callback) => {
|
|
44
|
+
contentLength += chunk.length;
|
|
45
|
+
hash.update(chunk);
|
|
46
|
+
if (args.onProgress && (buffered || Date.now() - lastProgress > 1000)) {
|
|
47
|
+
lastProgress = Date.now();
|
|
54
48
|
args.onProgress(contentLength);
|
|
55
49
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
else if (args.file instanceof stream_1.default.Readable ||
|
|
60
|
-
args.file instanceof stream_1.default.PassThrough) {
|
|
61
|
-
let lastProgress = Date.now();
|
|
62
|
-
const throttle = 1000; // 1 second
|
|
63
|
-
args.file.on("data", (chunk) => {
|
|
64
|
-
contentLength += chunk.length;
|
|
65
|
-
hash.update(chunk);
|
|
66
|
-
if (args.onProgress && Date.now() - lastProgress > throttle) {
|
|
67
|
-
lastProgress = Date.now();
|
|
68
|
-
args.onProgress(contentLength);
|
|
69
|
-
}
|
|
70
|
-
});
|
|
71
|
-
args.file.on("error", reject);
|
|
72
|
-
args.file.pipe(writeStream);
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
reject(new Error("Unsupported file type provided to upload."));
|
|
76
|
-
}
|
|
50
|
+
callback(null, chunk);
|
|
51
|
+
},
|
|
77
52
|
});
|
|
53
|
+
// Wait for all streams to close before transaction cleanup can remove a failed upload.
|
|
54
|
+
await (0, promises_1.pipeline)(source, measure, fs_1.default.createWriteStream(filePath));
|
|
55
|
+
return {
|
|
56
|
+
type: "local",
|
|
57
|
+
filePath,
|
|
58
|
+
contentHash: hash.digest("hex"),
|
|
59
|
+
contentLength,
|
|
60
|
+
};
|
|
78
61
|
},
|
|
79
62
|
downloadAsStream: async (name) => {
|
|
80
63
|
const filePath = path_1.default.join(localFolderPath, name);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getLocalStorageClient.js","sourceRoot":"","sources":["../../lib/StorageClient/getLocalStorageClient.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAC5B,4CAAoB;AACpB,gDAAwB;AACxB,oDAA4B;
|
|
1
|
+
{"version":3,"file":"getLocalStorageClient.js","sourceRoot":"","sources":["../../lib/StorageClient/getLocalStorageClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getValidatedFileType.d.ts","sourceRoot":"","sources":["../../lib/StorageClient/getValidatedFileType.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAG5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGzD,KAAK,IAAI,GAAG;IACV,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AACF,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,eAAe,EACvB,MAAM,IAAI,KACT,OAAO,CAAC;IACT,IAAI,EAAE,oBAAoB,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;CAIb,
|
|
1
|
+
{"version":3,"file":"getValidatedFileType.d.ts","sourceRoot":"","sources":["../../lib/StorageClient/getValidatedFileType.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAG5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGzD,KAAK,IAAI,GAAG;IACV,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AACF,eAAO,MAAM,oBAAoB,GAC/B,QAAQ,eAAe,EACvB,MAAM,IAAI,KACT,OAAO,CAAC;IACT,IAAI,EAAE,oBAAoB,CAAC;IAC3B,GAAG,EAAE,MAAM,CAAC;CAIb,CAyEA,CAAC"}
|
|
@@ -48,8 +48,10 @@ const getValidatedFileType = async (config, args) => {
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
|
-
if (!result?.mime)
|
|
52
|
-
|
|
51
|
+
if (!result?.mime) {
|
|
52
|
+
const extension = fileName.includes(".") ? fileName.split(".").at(-1) : "(none)";
|
|
53
|
+
throw `File MIME type not found for the provided extension: ${extension}`;
|
|
54
|
+
}
|
|
53
55
|
return result;
|
|
54
56
|
};
|
|
55
57
|
exports.getValidatedFileType = getValidatedFileType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getValidatedFileType.js","sourceRoot":"","sources":["../../lib/StorageClient/getValidatedFileType.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"getValidatedFileType.js","sourceRoot":"","sources":["../../lib/StorageClient/getValidatedFileType.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setupFileServeHandler.d.ts","sourceRoot":"","sources":["../../lib/StorageClient/setupFileServeHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAC;AAI7B,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"setupFileServeHandler.d.ts","sourceRoot":"","sources":["../../lib/StorageClient/setupFileServeHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAC;AAI7B,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI1D,eAAO,MAAM,iBAAiB,GAAI,QAAQ,eAAe,WAOxD,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAChC,IAAI,EAAE,EACN,QAAQ,eAAe,EACvB,eAAe,aAAa,EAC5B,KAAK,CAAC,CAAC,OAAO,EACd,KAAK,SAAS;;CAwFf,CAAC"}
|
|
@@ -38,6 +38,7 @@ const fs = __importStar(require("fs"));
|
|
|
38
38
|
const path_1 = require("path");
|
|
39
39
|
const AuthHandler_1 = require("../Auth/AuthHandler");
|
|
40
40
|
const runClientRequest_1 = require("../runClientRequest");
|
|
41
|
+
const getFileStorageKey_1 = require("./getFileStorageKey");
|
|
41
42
|
const getFileServeRoute = (config) => {
|
|
42
43
|
const fileTableName = config.tableName;
|
|
43
44
|
const fileServeRoute = config.fileServePath ?? `/${fileTableName}`;
|
|
@@ -60,6 +61,7 @@ const setupFileServeHandler = (db, config, storageClient, app, prg) => {
|
|
|
60
61
|
const selectParams = {
|
|
61
62
|
select: {
|
|
62
63
|
id: 1,
|
|
64
|
+
storage_key: 1,
|
|
63
65
|
signed_url: 1,
|
|
64
66
|
signed_url_expires: 1,
|
|
65
67
|
content_type: 1,
|
|
@@ -85,10 +87,16 @@ const setupFileServeHandler = (db, config, storageClient, app, prg) => {
|
|
|
85
87
|
const HOUR = 3600 * 1000;
|
|
86
88
|
const EXPIRES = Date.now() + HOUR;
|
|
87
89
|
if (!url || expires < EXPIRES) {
|
|
88
|
-
url = await storageClient.getSignedUrlForDownload(file
|
|
89
|
-
|
|
90
|
+
url = await storageClient.getSignedUrlForDownload((0, getFileStorageKey_1.getFileStorageKey)(file), 60 * 60);
|
|
91
|
+
// Match the storage key to avoid caching a stale URL after replacement; NULL matches legacy files.
|
|
92
|
+
await db.any("UPDATE ${fileTableName:name} \
|
|
93
|
+
SET signed_url = ${signed_url}, \
|
|
94
|
+
signed_url_expires = ${signed_url_expires} \
|
|
95
|
+
WHERE id = ${id} \
|
|
96
|
+
AND storage_key IS NOT DISTINCT FROM ${storage_key}::uuid", {
|
|
90
97
|
fileTableName,
|
|
91
98
|
id: file.id,
|
|
99
|
+
storage_key: file.storage_key,
|
|
92
100
|
signed_url: url,
|
|
93
101
|
signed_url_expires: EXPIRES,
|
|
94
102
|
});
|
|
@@ -96,7 +104,7 @@ const setupFileServeHandler = (db, config, storageClient, app, prg) => {
|
|
|
96
104
|
res.redirect(url);
|
|
97
105
|
}
|
|
98
106
|
else {
|
|
99
|
-
const localFilePath = (0, path_1.join)(storageClient.localFolderPath,
|
|
107
|
+
const localFilePath = (0, path_1.join)(storageClient.localFolderPath, (0, getFileStorageKey_1.getFileStorageKey)(file));
|
|
100
108
|
if (!fs.existsSync(localFilePath)) {
|
|
101
109
|
throw new Error("File not found");
|
|
102
110
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setupFileServeHandler.js","sourceRoot":"","sources":["../../lib/StorageClient/setupFileServeHandler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,uCAAyB;AACzB,+BAA4B;AAC5B,qDAA0E;AAI1E,0DAAuD;
|
|
1
|
+
{"version":3,"file":"setupFileServeHandler.js","sourceRoot":"","sources":["../../lib/StorageClient/setupFileServeHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,15 +2,21 @@ import type pgPromise from "pg-promise";
|
|
|
2
2
|
import type { AnyObject, DBSchema } from "prostgles-types";
|
|
3
3
|
import type { DbTxTableHandlers } from "../DboBuilder/DboBuilderTypes";
|
|
4
4
|
import type { DBOFullyTyped } from "../DBSchemaBuilder/DBSchemaBuilder";
|
|
5
|
-
import type { AfterAllTsTrigger, AfterEachTsTrigger, BeforeEachTsTrigger } from "../PublishParser/PublishParser";
|
|
5
|
+
import type { AfterAllTsTrigger, AfterEachTsTrigger, BeforeEachTsTrigger, TransactionCallbacks } from "../PublishParser/PublishParser";
|
|
6
6
|
export type TableHooks<S = void, Context = undefined> = S extends DBSchema ? Partial<{
|
|
7
7
|
[tableName in keyof S]: TableHooksDefinition<Required<S[tableName]["columns"]>, DBOFullyTyped<S>, Context>;
|
|
8
8
|
}> : Record<string, TableHooksDefinition<AnyObject, DbTxTableHandlers, Context>>;
|
|
9
9
|
export type TableHooksDefinition<RowDataType = AnyObject, DBX = DbTxTableHandlers, Context = undefined> = {
|
|
10
10
|
/**
|
|
11
|
-
* Runs sequentially before validation and SQL for each insert row,
|
|
11
|
+
* Runs sequentially before data validation and mutation SQL for each insert row,
|
|
12
|
+
* or once per update request, including requests with no matching rows.
|
|
13
|
+
* The update filter includes the publish forcedFilter.
|
|
14
|
+
* Also runs when generating SQL statements (including updateBatch).
|
|
15
|
+
* File inserts/updates reject SQL-only requests; file updates lock matching rows before hooks.
|
|
12
16
|
* May replace the pending data and pass `hookContext` to the next hook.
|
|
13
|
-
* `
|
|
17
|
+
* Register `onCommit`/`onRollback` before starting external work so cleanup also runs if the
|
|
18
|
+
* hook throws. These callbacks are awaited after the outer transaction finishes and receive
|
|
19
|
+
* the non-transactional `db` and `dbo` objects.
|
|
14
20
|
*/
|
|
15
21
|
beforeEach?: BeforeEachTsTrigger<RowDataType, DBX, Context>[];
|
|
16
22
|
/**
|
|
@@ -31,6 +37,7 @@ export type TableHooksDefinition<RowDataType = AnyObject, DBX = DbTxTableHandler
|
|
|
31
37
|
/**
|
|
32
38
|
* Replaces the generated DELETE. Must perform the mutation and shape its return value using
|
|
33
39
|
* the prepared filter and returning arguments. Delete `afterEach`/`afterAll` hooks do not run.
|
|
40
|
+
* Use `onCommit`/`onRollback` for external side effects after the outer transaction finishes.
|
|
34
41
|
*/
|
|
35
42
|
onInsteadOfDelete?: (args: {
|
|
36
43
|
context: Context;
|
|
@@ -43,6 +50,6 @@ export type TableHooksDefinition<RowDataType = AnyObject, DBX = DbTxTableHandler
|
|
|
43
50
|
where: string;
|
|
44
51
|
filter: AnyObject;
|
|
45
52
|
};
|
|
46
|
-
}) => Promise<AnyObject[] | undefined>;
|
|
53
|
+
} & TransactionCallbacks<DBX>) => Promise<AnyObject[] | undefined>;
|
|
47
54
|
};
|
|
48
55
|
//# sourceMappingURL=TableHooks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TableHooks.d.ts","sourceRoot":"","sources":["../../lib/TableHooks/TableHooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"TableHooks.d.ts","sourceRoot":"","sources":["../../lib/TableHooks/TableHooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,gCAAgC,CAAC;AAExC,MAAM,MAAM,UAAU,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,GAAG,SAAS,IAClD,CAAC,SAAS,QAAQ,GAChB,OAAO,CAAC;KACL,SAAS,IAAI,MAAM,CAAC,GAAG,oBAAoB,CAC1C,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,CAAC,EACjC,aAAa,CAAC,CAAC,CAAC,EAChB,OAAO,CACR;CACF,CAAC,GACF,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,SAAS,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC;AAEhF,MAAM,MAAM,oBAAoB,CAC9B,WAAW,GAAG,SAAS,EACvB,GAAG,GAAG,iBAAiB,EACvB,OAAO,GAAG,SAAS,IACjB;IACF;;;;;;;;;;OAUG;IACH,UAAU,CAAC,EAAE,mBAAmB,CAAC,WAAW,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;IAE9D;;;;;OAKG;IACH,SAAS,CAAC,EAAE,kBAAkB,CAAC,WAAW,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;IAE5D;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC,WAAW,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;IAE1D;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,CAClB,IAAI,EAAE;QACJ,OAAO,EAAE,OAAO,CAAC;QACjB,GAAG,EAAE,GAAG,CAAC;QACT,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC;QACvB,WAAW,EAAE,OAAO,CAAC;QACrB,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC;QAC1B,UAAU,EAAE;YACV,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,SAAS,CAAC;SACnB,CAAC;KACH,GAAG,oBAAoB,CAAC,GAAG,CAAC,KAC1B,OAAO,CAAC,SAAS,EAAE,GAAG,SAAS,CAAC,CAAC;CACvC,CAAC"}
|
|
@@ -6,12 +6,13 @@ import { type PublishObject } from "../PublishParser/PublishParser";
|
|
|
6
6
|
export type ServerTableHandler<
|
|
7
7
|
T extends AnyObject = AnyObject,
|
|
8
8
|
Schema extends DBSchema | void = void,
|
|
9
|
-
|
|
9
|
+
TName extends PropertyKey = never,
|
|
10
|
+
> = TableHandler<T, Schema, TName> & { isView: boolean };
|
|
10
11
|
|
|
11
12
|
export type DBTableHandlersFromSchema<Schema = void> =
|
|
12
13
|
Schema extends DBSchema ?
|
|
13
14
|
{
|
|
14
|
-
[tov_name in keyof Schema]: ServerTableHandler<Schema[tov_name]["columns"], Schema>;
|
|
15
|
+
[tov_name in keyof Schema]: ServerTableHandler<Schema[tov_name]["columns"], Schema, tov_name>;
|
|
15
16
|
}
|
|
16
17
|
: Record<string, Partial<ServerTableHandler>>;
|
|
17
18
|
|
|
@@ -141,6 +141,13 @@ export class DboBuilder {
|
|
|
141
141
|
onSchemaChange?: (event: { command: string; query: string }) => void;
|
|
142
142
|
|
|
143
143
|
private readonly onCommitCallbacksByTransaction = new WeakMap<object, OnCommitCallback[]>();
|
|
144
|
+
private readonly onRollbackCallbacksByTransaction = new WeakMap<object, OnCommitCallback[]>();
|
|
145
|
+
|
|
146
|
+
registerOnRollbackCallback = (transaction: object, callback: OnCommitCallback) => {
|
|
147
|
+
const callbacks = this.onRollbackCallbacksByTransaction.get(transaction);
|
|
148
|
+
if (!callbacks) throw new Error("Transaction is not active");
|
|
149
|
+
callbacks.push(callback);
|
|
150
|
+
};
|
|
144
151
|
|
|
145
152
|
registerOnCommitCallback = (transaction: object, callback: OnCommitCallback) => {
|
|
146
153
|
const callbacks = this.onCommitCallbacksByTransaction.get(transaction);
|
|
@@ -150,7 +157,10 @@ export class DboBuilder {
|
|
|
150
157
|
callbacks.push(callback);
|
|
151
158
|
};
|
|
152
159
|
|
|
153
|
-
private runOnCommitCallbacks = async (
|
|
160
|
+
private runOnCommitCallbacks = async (
|
|
161
|
+
callbacks: OnCommitCallback[],
|
|
162
|
+
command: "DboBuilder.onCommit" | "DboBuilder.onRollback" = "DboBuilder.onCommit",
|
|
163
|
+
) => {
|
|
154
164
|
for (const callback of callbacks) {
|
|
155
165
|
const start = Date.now();
|
|
156
166
|
try {
|
|
@@ -159,13 +169,13 @@ export class DboBuilder {
|
|
|
159
169
|
const error = getSerialisableError(rawError);
|
|
160
170
|
const onLog = this.prostgles.opts.onLog;
|
|
161
171
|
if (!onLog) {
|
|
162
|
-
console.error(
|
|
172
|
+
console.error(`${command} callback failed`, error);
|
|
163
173
|
continue;
|
|
164
174
|
}
|
|
165
175
|
try {
|
|
166
176
|
await onLog({
|
|
167
177
|
type: "debug",
|
|
168
|
-
command
|
|
178
|
+
command,
|
|
169
179
|
duration: Date.now() - start,
|
|
170
180
|
error,
|
|
171
181
|
});
|
|
@@ -423,12 +433,14 @@ export class DboBuilder {
|
|
|
423
433
|
|
|
424
434
|
getTX = async <R, TH extends DbTxTableHandlers>(cb: TxCB<Promise<R> | R, TH>) => {
|
|
425
435
|
const onCommitCallbacks: OnCommitCallback[] = [];
|
|
436
|
+
const onRollbackCallbacks: OnCommitCallback[] = [];
|
|
426
437
|
let transaction: object | undefined;
|
|
427
438
|
let result: R;
|
|
428
439
|
try {
|
|
429
440
|
result = await this.db.tx((t) => {
|
|
430
441
|
transaction = t;
|
|
431
442
|
this.onCommitCallbacksByTransaction.set(transaction, onCommitCallbacks);
|
|
443
|
+
this.onRollbackCallbacksByTransaction.set(transaction, onRollbackCallbacks);
|
|
432
444
|
|
|
433
445
|
const dbTX: DbTxTableHandlers = {};
|
|
434
446
|
this.tablesOrViews?.map((tov) => {
|
|
@@ -447,10 +459,13 @@ export class DboBuilder {
|
|
|
447
459
|
});
|
|
448
460
|
} catch (error) {
|
|
449
461
|
if (transaction) this.onCommitCallbacksByTransaction.delete(transaction);
|
|
462
|
+
if (transaction) this.onRollbackCallbacksByTransaction.delete(transaction);
|
|
463
|
+
await this.runOnCommitCallbacks(onRollbackCallbacks, "DboBuilder.onRollback");
|
|
450
464
|
throw error;
|
|
451
465
|
}
|
|
452
466
|
|
|
453
467
|
if (transaction) this.onCommitCallbacksByTransaction.delete(transaction);
|
|
468
|
+
if (transaction) this.onRollbackCallbacksByTransaction.delete(transaction);
|
|
454
469
|
await this.runOnCommitCallbacks(onCommitCallbacks);
|
|
455
470
|
return result;
|
|
456
471
|
};
|
|
@@ -40,6 +40,7 @@ import { upsert } from "./upsert";
|
|
|
40
40
|
import { isApplicableHook } from "./isApplicableHook";
|
|
41
41
|
import type { TableConfigurator } from "../../TableConfig/TableConfigurator";
|
|
42
42
|
import type { TableHooksDefinition } from "../../TableHooks/TableHooks";
|
|
43
|
+
import type { TransactionCallbacks } from "../../PublishParser/publishTypesAndUtils";
|
|
43
44
|
|
|
44
45
|
export type ValidatedParams = {
|
|
45
46
|
row: AnyObject;
|
|
@@ -98,12 +99,13 @@ export class TableHandler extends ViewHandler {
|
|
|
98
99
|
await transaction.t.none(withUserRLS(localParams, ""));
|
|
99
100
|
}
|
|
100
101
|
let newRow = row;
|
|
102
|
+
const initialKeys = Object.keys(row);
|
|
101
103
|
let newHookContext: AnyObject | undefined = undefined;
|
|
102
|
-
const successCallbacks: (() => void)[] = [];
|
|
103
104
|
for (const hook of hooks) {
|
|
104
105
|
const isApplicable = isApplicableHook(this, [newRow], hook, command);
|
|
105
106
|
if (!isApplicable) continue;
|
|
106
107
|
const hookResult = await hook.validate({
|
|
108
|
+
...this.getTransactionCallbacks(localParams),
|
|
107
109
|
command,
|
|
108
110
|
context: this.dboBuilder.prostgles.context,
|
|
109
111
|
data: newRow,
|
|
@@ -116,21 +118,31 @@ export class TableHandler extends ViewHandler {
|
|
|
116
118
|
if (hookResult) {
|
|
117
119
|
newRow = hookResult.row;
|
|
118
120
|
newHookContext = hookResult.hookContext;
|
|
119
|
-
const { onInserted } = hookResult;
|
|
120
|
-
if (onInserted) {
|
|
121
|
-
successCallbacks.push(onInserted);
|
|
122
|
-
}
|
|
123
121
|
}
|
|
124
122
|
}
|
|
125
123
|
|
|
126
|
-
const initialKeys = Object.keys(row);
|
|
127
124
|
return {
|
|
128
125
|
row: newRow,
|
|
129
|
-
successCallbacks,
|
|
130
126
|
columnsAdded: Object.keys(newRow).filter((col) => !initialKeys.includes(col)),
|
|
131
127
|
};
|
|
132
128
|
};
|
|
133
129
|
|
|
130
|
+
getTransactionCallbacks = (
|
|
131
|
+
localParams: LocalParams | undefined,
|
|
132
|
+
): TransactionCallbacks<TableHandlers> => {
|
|
133
|
+
const transaction = this.getTransaction(localParams);
|
|
134
|
+
return {
|
|
135
|
+
onCommit: (callback) => {
|
|
136
|
+
if (!transaction) throw new Error("onCommit requires a transaction");
|
|
137
|
+
this.dboBuilder.registerOnCommitCallback(transaction.t, callback);
|
|
138
|
+
},
|
|
139
|
+
onRollback: (callback) => {
|
|
140
|
+
if (!transaction) throw new Error("onRollback requires a transaction");
|
|
141
|
+
this.dboBuilder.registerOnRollbackCallback(transaction.t, callback);
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
};
|
|
145
|
+
|
|
134
146
|
getAfterHooksAndChecks = (
|
|
135
147
|
command:
|
|
136
148
|
| { name: "delete"; rule: undefined | DeleteRule }
|
|
@@ -163,6 +163,7 @@ export async function _delete(
|
|
|
163
163
|
await transaction.t.none(withUserRLS(localParams, ""));
|
|
164
164
|
}
|
|
165
165
|
const result = await onInsteadOfDelete({
|
|
166
|
+
...this.getTransactionCallbacks(localParams),
|
|
166
167
|
context: this.dboBuilder.prostgles.context,
|
|
167
168
|
queryType,
|
|
168
169
|
isOneOrNone,
|
|
@@ -47,8 +47,7 @@ export const executeAfterHooksCheckAndPostValidation = async ({
|
|
|
47
47
|
const txParams = {
|
|
48
48
|
tx: transaction.t,
|
|
49
49
|
dbx: transaction.dbTX,
|
|
50
|
-
|
|
51
|
-
tableHandler.dboBuilder.registerOnCommitCallback(transaction.t, callback),
|
|
50
|
+
...tableHandler.getTransactionCallbacks(localParams),
|
|
52
51
|
};
|
|
53
52
|
|
|
54
53
|
const txKey = transaction.t as unknown as object;
|
|
@@ -86,22 +86,29 @@ export async function insert(
|
|
|
86
86
|
});
|
|
87
87
|
|
|
88
88
|
validateInsertParams(insertParams);
|
|
89
|
+
if (this.is_media) {
|
|
90
|
+
if (insertParams?.returnType === "statement" || localParams?.returnQuery) {
|
|
91
|
+
throw new Error("File inserts cannot return SQL statements");
|
|
92
|
+
}
|
|
93
|
+
const conflict = insertParams?.onConflict;
|
|
94
|
+
if ((typeof conflict === "string" ? conflict : conflict?.action) === "DoUpdate") {
|
|
95
|
+
throw new Error("Use update to replace an existing file");
|
|
96
|
+
}
|
|
97
|
+
}
|
|
89
98
|
|
|
90
99
|
const transaction = this.getTransaction(localParams);
|
|
91
100
|
const tx = transaction?.t || this.db;
|
|
92
101
|
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
rows.map(async (nonValidated) => {
|
|
102
|
+
const preparedRows = await Promise.allSettled(
|
|
103
|
+
rows.map(async (input) => {
|
|
96
104
|
const { preValidate } = rule ?? {};
|
|
97
105
|
const { tableConfigurator } = this.dboBuilder.prostgles;
|
|
98
106
|
if (!tableConfigurator) {
|
|
99
107
|
throw "tableConfigurator missing";
|
|
100
108
|
}
|
|
101
109
|
|
|
102
|
-
const beforeResult = await this.beforeEach(
|
|
110
|
+
const beforeResult = await this.beforeEach(input, localParams, "insert", undefined);
|
|
103
111
|
let row = beforeResult.row;
|
|
104
|
-
beforeResult.successCallbacks.forEach((cb) => successCallbacks.push(cb));
|
|
105
112
|
|
|
106
113
|
if (preValidate) {
|
|
107
114
|
if (!localParams) {
|
|
@@ -120,6 +127,10 @@ export async function insert(
|
|
|
120
127
|
return { row, columnsAddedFromBeforeHooks: beforeResult.columnsAdded };
|
|
121
128
|
}),
|
|
122
129
|
);
|
|
130
|
+
const preValidatedRows: InsertedRowWithInfo[] = preparedRows.map((result) => {
|
|
131
|
+
if (result.status === "rejected") throw result.reason;
|
|
132
|
+
return result.value;
|
|
133
|
+
});
|
|
123
134
|
const preValidatedRowOrRows = isMultiInsert ? preValidatedRows : preValidatedRows[0]!;
|
|
124
135
|
|
|
125
136
|
/**
|
|
@@ -204,7 +215,6 @@ export async function insert(
|
|
|
204
215
|
data: { rowOrRows, param2: insertParams },
|
|
205
216
|
duration: Date.now() - start,
|
|
206
217
|
});
|
|
207
|
-
successCallbacks.forEach((cb) => cb());
|
|
208
218
|
return result;
|
|
209
219
|
} catch (e) {
|
|
210
220
|
await this._log({
|