prostgles-server 4.2.567 → 4.2.570
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/Auth/AuthTypes.d.ts +5 -5
- package/dist/Auth/AuthTypes.d.ts.map +1 -1
- package/dist/Auth/AuthTypes.js.map +1 -1
- package/dist/Auth/endpoints/setCatchAllRequestHandler.d.ts.map +1 -1
- package/dist/Auth/endpoints/setCatchAllRequestHandler.js +2 -2
- package/dist/Auth/endpoints/setCatchAllRequestHandler.js.map +1 -1
- package/dist/Auth/utils/removeExpressRoute.d.ts.map +1 -1
- package/dist/DBSchemaBuilder/getColumnTypescriptDefinition.d.ts +1 -1
- package/dist/DBSchemaBuilder/getColumnTypescriptDefinition.d.ts.map +1 -1
- package/dist/DBSchemaBuilder/getDBGeneratedSchema.d.ts +1 -1
- package/dist/DBSchemaBuilder/getDBGeneratedSchema.d.ts.map +1 -1
- package/dist/DboBuilder/DboBuilder.js +4 -4
- package/dist/DboBuilder/DboBuilder.js.map +1 -1
- package/dist/DboBuilder/DboBuilderTypes.d.ts +2 -18
- package/dist/DboBuilder/DboBuilderTypes.d.ts.map +1 -1
- package/dist/DboBuilder/DboBuilderTypes.js.map +1 -1
- package/dist/DboBuilder/TableHandler/TableHandler.d.ts +15 -5
- package/dist/DboBuilder/TableHandler/TableHandler.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/TableHandler.js +4 -3
- 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 +17 -14
- package/dist/DboBuilder/TableHandler/delete.js.map +1 -1
- package/dist/DboBuilder/TableHandler/insert/insert.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/insert/insert.js +3 -12
- package/dist/DboBuilder/TableHandler/insert/insert.js.map +1 -1
- package/dist/DboBuilder/TableHandler/insert/insertNestedRecords.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/insert/insertNestedRecords.js +10 -15
- package/dist/DboBuilder/TableHandler/insert/insertNestedRecords.js.map +1 -1
- package/dist/DboBuilder/TableHandler/insert/insertRowWithNestedRecords.js +1 -1
- package/dist/DboBuilder/TableHandler/insert/insertRowWithNestedRecords.js.map +1 -1
- package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.d.ts +8 -6
- package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.js +30 -48
- package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.js.map +1 -1
- package/dist/DboBuilder/TableHandler/update.d.ts +1 -1
- package/dist/DboBuilder/TableHandler/update.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/update.js +8 -18
- package/dist/DboBuilder/TableHandler/update.js.map +1 -1
- package/dist/DboBuilder/TableHandler/updateFile.d.ts +2 -3
- package/dist/DboBuilder/TableHandler/updateFile.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/updateFile.js +8 -28
- package/dist/DboBuilder/TableHandler/updateFile.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/ViewHandler.d.ts +2 -2
- package/dist/DboBuilder/ViewHandler/ViewHandler.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/getInfo.d.ts +1 -1
- package/dist/DboBuilder/ViewHandler/getInfo.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/getInfo.js +12 -1
- package/dist/DboBuilder/ViewHandler/getInfo.js.map +1 -1
- package/dist/DboBuilder/getColumns.d.ts.map +1 -1
- package/dist/DboBuilder/getColumns.js +29 -4
- package/dist/DboBuilder/getColumns.js.map +1 -1
- package/dist/DboBuilder/schema/getTablesForSchemaPostgresSQL.d.ts +2 -2
- package/dist/DboBuilder/uploadFile.d.ts +5 -6
- package/dist/DboBuilder/uploadFile.d.ts.map +1 -1
- package/dist/DboBuilder/uploadFile.js +28 -42
- package/dist/DboBuilder/uploadFile.js.map +1 -1
- package/dist/FileManager/FileManager.d.ts +22 -78
- package/dist/FileManager/FileManager.d.ts.map +1 -1
- package/dist/FileManager/FileManager.js +1 -219
- package/dist/FileManager/FileManager.js.map +1 -1
- package/dist/FileManager/getFileTableConfig.d.ts +26 -0
- package/dist/FileManager/getFileTableConfig.d.ts.map +1 -0
- package/dist/FileManager/getFileTableConfig.js +113 -0
- package/dist/FileManager/getFileTableConfig.js.map +1 -0
- package/dist/FileManager/getLocalStorageClient.d.ts +3 -0
- package/dist/FileManager/getLocalStorageClient.d.ts.map +1 -0
- package/dist/FileManager/getLocalStorageClient.js +105 -0
- package/dist/FileManager/getLocalStorageClient.js.map +1 -0
- package/dist/FileManager/getValidatedFileType.d.ts +2 -2
- package/dist/FileManager/getValidatedFileType.d.ts.map +1 -1
- package/dist/FileManager/getValidatedFileType.js +7 -9
- package/dist/FileManager/getValidatedFileType.js.map +1 -1
- package/dist/FileManager/setupFileServeHandler.d.ts +9 -0
- package/dist/FileManager/setupFileServeHandler.d.ts.map +1 -0
- package/dist/FileManager/setupFileServeHandler.js +114 -0
- package/dist/FileManager/setupFileServeHandler.js.map +1 -0
- package/dist/Filtering/Filtering.d.ts +1 -1
- package/dist/Logging.d.ts +1 -1
- package/dist/Logging.d.ts.map +1 -1
- package/dist/Prostgles.d.ts +52 -6
- package/dist/Prostgles.d.ts.map +1 -1
- package/dist/Prostgles.js +7 -47
- package/dist/Prostgles.js.map +1 -1
- package/dist/ProstglesTypes.d.ts +19 -22
- package/dist/ProstglesTypes.d.ts.map +1 -1
- package/dist/ProstglesTypes.js.map +1 -1
- package/dist/PubSubManager/notifListener.d.ts.map +1 -1
- package/dist/PubSubManager/notifListener.js +0 -1
- package/dist/PubSubManager/notifListener.js.map +1 -1
- package/dist/PublishParser/getDBSchemaTable.d.ts +2 -2
- package/dist/PublishParser/getDBSchemaTable.d.ts.map +1 -1
- package/dist/PublishParser/getDBSchemaTable.js +5 -3
- package/dist/PublishParser/getDBSchemaTable.js.map +1 -1
- package/dist/PublishParser/getSchemaFromPublish.d.ts.map +1 -1
- package/dist/PublishParser/getSchemaFromPublish.js +2 -2
- package/dist/PublishParser/getSchemaFromPublish.js.map +1 -1
- package/dist/PublishParser/publishTypesAndUtils.d.ts +1 -0
- package/dist/PublishParser/publishTypesAndUtils.d.ts.map +1 -1
- package/dist/PublishParser/publishTypesAndUtils.js.map +1 -1
- package/dist/RestApi.d.ts +4 -6
- package/dist/RestApi.d.ts.map +1 -1
- package/dist/RestApi.js +6 -5
- package/dist/RestApi.js.map +1 -1
- package/dist/TableConfig/{TableConfig.d.ts → TableConfigTypes.d.ts} +19 -64
- package/dist/TableConfig/TableConfigTypes.d.ts.map +1 -0
- package/dist/TableConfig/TableConfigTypes.js +3 -0
- package/dist/TableConfig/TableConfigTypes.js.map +1 -0
- package/dist/TableConfig/TableConfigurator.d.ts +104 -0
- package/dist/TableConfig/TableConfigurator.d.ts.map +1 -0
- package/dist/TableConfig/{TableConfig.js → TableConfigurator.js} +31 -44
- package/dist/TableConfig/TableConfigurator.js.map +1 -0
- package/dist/TableConfig/applyTableConfig.d.ts.map +1 -1
- package/dist/TableConfig/applyTableConfig.js +0 -1
- package/dist/TableConfig/applyTableConfig.js.map +1 -1
- package/dist/TableConfig/getColumnConfig.d.ts +1 -1
- package/dist/TableConfig/getColumnConfig.d.ts.map +1 -1
- package/dist/TableConfig/getColumnSQLDefinitionQuery.d.ts +1 -1
- package/dist/TableConfig/getColumnSQLDefinitionQuery.d.ts.map +1 -1
- package/dist/TableConfig/getColumnSQLDefinitionQuery.js +1 -1
- package/dist/TableConfig/getColumnSQLDefinitionQuery.js.map +1 -1
- package/dist/TableConfig/getConstraintDefinitionQueries.d.ts +1 -1
- package/dist/TableConfig/getConstraintDefinitionQueries.d.ts.map +1 -1
- package/dist/TableConfig/getCreateSchemaQueries.d.ts +26 -8
- package/dist/TableConfig/getCreateSchemaQueries.d.ts.map +1 -1
- package/dist/TableConfig/getSchemaDiffQueries.d.ts.map +1 -1
- package/dist/TableConfig/getSchemaDiffQueries.js +12 -8
- package/dist/TableConfig/getSchemaDiffQueries.js.map +1 -1
- package/dist/TableConfig/getTableColumnQueries.d.ts +1 -1
- package/dist/TableConfig/getTableColumnQueries.d.ts.map +1 -1
- package/dist/TableConfig/getTableColumnQueries.js +19 -19
- package/dist/TableConfig/getTableColumnQueries.js.map +1 -1
- package/dist/TableConfig/getTableConfigSchemaQueries.d.ts +26 -10
- package/dist/TableConfig/getTableConfigSchemaQueries.d.ts.map +1 -1
- package/dist/TableConfig/getTableConfigSchemaQueries.js +8 -10
- package/dist/TableConfig/getTableConfigSchemaQueries.js.map +1 -1
- package/dist/TableConfig/indexes/getIndexesQueries.d.ts +1 -1
- package/dist/TableConfig/indexes/getIndexesQueries.d.ts.map +1 -1
- package/dist/TableConfig/initTableConfig.d.ts +1 -1
- package/dist/TableConfig/initTableConfig.d.ts.map +1 -1
- package/dist/TableConfig/initTableConfig.js +6 -3
- package/dist/TableConfig/initTableConfig.js.map +1 -1
- package/dist/WebsocketAPI/getClientSchema.d.ts.map +1 -1
- package/dist/WebsocketAPI/getClientSchema.js +6 -1
- package/dist/WebsocketAPI/getClientSchema.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/initProstgles.d.ts.map +1 -1
- package/dist/initProstgles.js +1 -2
- package/dist/initProstgles.js.map +1 -1
- package/dist/runClientRequest.js +1 -1
- package/dist/runClientRequest.js.map +1 -1
- package/dist/updateConfiguration.d.ts.map +1 -1
- package/dist/updateConfiguration.js +0 -3
- package/dist/updateConfiguration.js.map +1 -1
- package/eslint.config.mjs +0 -3
- package/lib/Auth/AuthTypes.ts +6 -7
- package/lib/Auth/endpoints/setCatchAllRequestHandler.ts +6 -2
- package/lib/DBSchemaBuilder/getColumnTypescriptDefinition.ts +1 -1
- package/lib/DBSchemaBuilder/getDBGeneratedSchema.ts +1 -1
- package/lib/DboBuilder/DboBuilder.ts +4 -4
- package/lib/DboBuilder/DboBuilderTypes.ts +7 -20
- package/lib/DboBuilder/TableHandler/TableHandler.ts +7 -4
- package/lib/DboBuilder/TableHandler/delete.ts +23 -17
- package/lib/DboBuilder/TableHandler/insert/insert.ts +3 -12
- package/lib/DboBuilder/TableHandler/insert/insertNestedRecords.ts +13 -17
- package/lib/DboBuilder/TableHandler/insert/insertRowWithNestedRecords.ts +1 -1
- package/lib/DboBuilder/TableHandler/onDeleteFromFileTable.ts +41 -54
- package/lib/DboBuilder/TableHandler/update.ts +8 -19
- package/lib/DboBuilder/TableHandler/updateFile.ts +20 -42
- package/lib/DboBuilder/ViewHandler/ViewHandler.ts +1 -1
- package/lib/DboBuilder/ViewHandler/getInfo.ts +19 -2
- package/lib/DboBuilder/getColumns.ts +40 -4
- package/lib/DboBuilder/uploadFile.ts +34 -50
- package/lib/FileManager/FileManager.ts +23 -249
- package/lib/FileManager/getFileTableConfig.ts +140 -0
- package/lib/FileManager/getLocalStorageClient.ts +118 -0
- package/lib/FileManager/getValidatedFileType.ts +14 -22
- package/lib/FileManager/setupFileServeHandler.ts +102 -0
- package/lib/Logging.ts +0 -3
- package/lib/Prostgles.ts +8 -44
- package/lib/ProstglesTypes.ts +30 -24
- package/lib/PubSubManager/notifListener.ts +0 -2
- package/lib/PublishParser/getDBSchemaTable.ts +6 -3
- package/lib/PublishParser/getSchemaFromPublish.ts +2 -1
- package/lib/PublishParser/publishTypesAndUtils.ts +1 -0
- package/lib/RestApi.ts +12 -12
- package/lib/TableConfig/{TableConfig.ts → TableConfigTypes.ts} +18 -217
- package/lib/TableConfig/TableConfigurator.ts +191 -0
- package/lib/TableConfig/applyTableConfig.ts +2 -3
- package/lib/TableConfig/getColumnConfig.ts +2 -2
- package/lib/TableConfig/getColumnSQLDefinitionQuery.ts +2 -2
- package/lib/TableConfig/getConstraintDefinitionQueries.ts +1 -1
- package/lib/TableConfig/getCreateSchemaQueries.ts +1 -1
- package/lib/TableConfig/getSchemaDiffQueries.ts +14 -11
- package/lib/TableConfig/getTableColumnQueries.ts +22 -20
- package/lib/TableConfig/getTableConfigSchemaQueries.ts +20 -22
- package/lib/TableConfig/indexes/getIndexesQueries.ts +1 -1
- package/lib/TableConfig/initTableConfig.ts +7 -6
- package/lib/WebsocketAPI/getClientSchema.ts +7 -1
- package/lib/index.ts +3 -2
- package/lib/initProstgles.ts +1 -2
- package/lib/runClientRequest.ts +1 -1
- package/lib/updateConfiguration.ts +0 -3
- package/package.json +2 -3
- package/dist/FileManager/initFileManager.d.ts +0 -18
- package/dist/FileManager/initFileManager.d.ts.map +0 -1
- package/dist/FileManager/initFileManager.js +0 -257
- package/dist/FileManager/initFileManager.js.map +0 -1
- package/dist/FileManager/upload.d.ts +0 -4
- package/dist/FileManager/upload.d.ts.map +0 -1
- package/dist/FileManager/upload.js +0 -90
- package/dist/FileManager/upload.js.map +0 -1
- package/dist/FileManager/uploadStream.d.ts +0 -4
- package/dist/FileManager/uploadStream.d.ts.map +0 -1
- package/dist/FileManager/uploadStream.js +0 -100
- package/dist/FileManager/uploadStream.js.map +0 -1
- package/dist/TableConfig/TableConfig.d.ts.map +0 -1
- package/dist/TableConfig/TableConfig.js.map +0 -1
- package/lib/FileManager/initFileManager.ts +0 -254
- package/lib/FileManager/upload.ts +0 -59
- package/lib/FileManager/uploadStream.ts +0 -76
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type e from "express";
|
|
2
|
+
import * as fs from "fs";
|
|
3
|
+
import { join } from "path";
|
|
4
|
+
import { HTTP_FAIL_CODES, removeExpressRoute } from "../Auth/AuthHandler";
|
|
5
|
+
import type { DB } from "../initProstgles";
|
|
6
|
+
import type { Prostgles } from "../Prostgles";
|
|
7
|
+
import type { FileTableConfig } from "../ProstglesTypes";
|
|
8
|
+
import { runClientRequest } from "../runClientRequest";
|
|
9
|
+
import type { StorageClient } from "./FileManager";
|
|
10
|
+
import { HOUR } from "./FileManager";
|
|
11
|
+
import type { FileTableRow } from "./getFileTableConfig";
|
|
12
|
+
|
|
13
|
+
export const setupFileServeHandler = (
|
|
14
|
+
db: DB,
|
|
15
|
+
config: FileTableConfig,
|
|
16
|
+
storageClient: StorageClient,
|
|
17
|
+
app: e.Express,
|
|
18
|
+
prg: Prostgles,
|
|
19
|
+
) => {
|
|
20
|
+
const fileTableName = config.tableName;
|
|
21
|
+
const fileServeRoute = config.fileServePath ?? `/${fileTableName}`;
|
|
22
|
+
if (fileServeRoute.endsWith("/")) {
|
|
23
|
+
throw `fileServeRoute must not end with a '/'`;
|
|
24
|
+
}
|
|
25
|
+
const fileRouteExpress = fileServeRoute + "/:name";
|
|
26
|
+
|
|
27
|
+
app.get(fileRouteExpress, async (req, res) => {
|
|
28
|
+
try {
|
|
29
|
+
const { name } = req.params;
|
|
30
|
+
if (typeof name !== "string" || !name) {
|
|
31
|
+
throw "Invalid media name";
|
|
32
|
+
}
|
|
33
|
+
const id = name.slice(0, 36);
|
|
34
|
+
const selectParams = {
|
|
35
|
+
select: {
|
|
36
|
+
id: 1,
|
|
37
|
+
name: 1,
|
|
38
|
+
signed_url: 1,
|
|
39
|
+
signed_url_expires: 1,
|
|
40
|
+
content_type: 1,
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
const file = (await runClientRequest.bind(prg)(
|
|
44
|
+
{
|
|
45
|
+
command: "findOne",
|
|
46
|
+
tableName: fileTableName,
|
|
47
|
+
param1: { id },
|
|
48
|
+
param2: selectParams,
|
|
49
|
+
param3: undefined,
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
res,
|
|
53
|
+
httpReq: req,
|
|
54
|
+
},
|
|
55
|
+
undefined,
|
|
56
|
+
)) as FileTableRow | undefined;
|
|
57
|
+
|
|
58
|
+
if (!file) {
|
|
59
|
+
res.status(HTTP_FAIL_CODES.NOT_FOUND).send("File not found or not allowed");
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (storageClient.type === "cloud") {
|
|
64
|
+
let url = file.signed_url;
|
|
65
|
+
const expires = +(file.signed_url_expires || 0);
|
|
66
|
+
|
|
67
|
+
const EXPIRES = Date.now() + HOUR;
|
|
68
|
+
if (!url || expires < EXPIRES) {
|
|
69
|
+
url = await storageClient.getSignedUrlForDownload(file.name, 60 * 60);
|
|
70
|
+
|
|
71
|
+
await db.any(
|
|
72
|
+
"UPDATE ${fileTableName:name} SET signed_url = ${signed_url}, signed_url_expires = ${signed_url_expires} WHERE id = ${id}",
|
|
73
|
+
{
|
|
74
|
+
fileTableName,
|
|
75
|
+
id: file.id,
|
|
76
|
+
signed_url: url,
|
|
77
|
+
signed_url_expires: EXPIRES,
|
|
78
|
+
},
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
res.redirect(url);
|
|
83
|
+
} else {
|
|
84
|
+
const localFilePath = join(storageClient.localFolderPath, file.name);
|
|
85
|
+
if (!fs.existsSync(localFilePath)) {
|
|
86
|
+
throw new Error("File not found");
|
|
87
|
+
}
|
|
88
|
+
res.contentType(file.content_type);
|
|
89
|
+
res.sendFile(localFilePath);
|
|
90
|
+
}
|
|
91
|
+
} catch (e) {
|
|
92
|
+
console.log(e);
|
|
93
|
+
res.status(HTTP_FAIL_CODES.BAD_REQUEST).send("Invalid/disallowed file");
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
const destroy = () => {
|
|
98
|
+
removeExpressRoute(app, [fileRouteExpress]);
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
return { destroy };
|
|
102
|
+
};
|
package/lib/Logging.ts
CHANGED
|
@@ -164,7 +164,6 @@ export namespace EventTypes {
|
|
|
164
164
|
type: "debug";
|
|
165
165
|
command:
|
|
166
166
|
| "applyTableConfig"
|
|
167
|
-
| "initFileTable"
|
|
168
167
|
| "initTableConfig"
|
|
169
168
|
| "runSQLFile"
|
|
170
169
|
| "schemaChangeNotif"
|
|
@@ -174,8 +173,6 @@ export namespace EventTypes {
|
|
|
174
173
|
| "refreshDBO.end"
|
|
175
174
|
| "tableConfigurator.init.start"
|
|
176
175
|
| "tableConfigurator.init.end"
|
|
177
|
-
| "initFileTable.start"
|
|
178
|
-
| "initFileTable.end"
|
|
179
176
|
| "initFileManager.runQuery"
|
|
180
177
|
| "DboBuilder.getTablesForSchemaPostgresSQL"
|
|
181
178
|
| "PubSubManager.create";
|
package/lib/Prostgles.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import type pgPromise from "pg-promise";
|
|
2
2
|
import { AuthHandler } from "./Auth/AuthHandler";
|
|
3
|
-
import { FileManager } from "./FileManager/FileManager";
|
|
4
3
|
import type { OnInitReason } from "./initProstgles";
|
|
5
4
|
import { initProstgles } from "./initProstgles";
|
|
6
5
|
import type { SchemaWatch } from "./SchemaWatch/SchemaWatch";
|
|
@@ -10,7 +9,7 @@ import pg = require("pg-promise/typescript/pg-subset");
|
|
|
10
9
|
|
|
11
10
|
import type { ProstglesInitOptions } from "./ProstglesTypes";
|
|
12
11
|
import { RestApi } from "./RestApi";
|
|
13
|
-
import TableConfigurator from "./TableConfig/
|
|
12
|
+
import { TableConfigurator } from "./TableConfig/TableConfigurator";
|
|
14
13
|
|
|
15
14
|
import type { PRGLIOSocket } from "./DboBuilder/DboBuilder";
|
|
16
15
|
import { DBHandlerServer, DboBuilder } from "./DboBuilder/DboBuilder";
|
|
@@ -59,8 +58,9 @@ const DEFAULT_KEYWORDS = {
|
|
|
59
58
|
|
|
60
59
|
import { randomUUID } from "crypto";
|
|
61
60
|
import * as fs from "fs";
|
|
62
|
-
import type { TableHandler } from "./DboBuilder/TableHandler/TableHandler";
|
|
63
61
|
import type { getAdminClient } from "./DboBuilder/runSql/getAdminClient";
|
|
62
|
+
import type { TableHandler } from "./DboBuilder/TableHandler/TableHandler";
|
|
63
|
+
import { getFileTableConfig } from "./FileManager/getFileTableConfig";
|
|
64
64
|
|
|
65
65
|
export class Prostgles {
|
|
66
66
|
/**
|
|
@@ -108,11 +108,14 @@ export class Prostgles {
|
|
|
108
108
|
dbEventsManager?: DBEventsManager;
|
|
109
109
|
schemaAge = "0";
|
|
110
110
|
|
|
111
|
-
fileManager?: FileManager;
|
|
112
111
|
restApi?: RestApi;
|
|
113
112
|
|
|
114
113
|
tableConfigurator?: TableConfigurator;
|
|
115
114
|
|
|
115
|
+
get mergedTableConfig() {
|
|
116
|
+
return getFileTableConfig(this);
|
|
117
|
+
}
|
|
118
|
+
|
|
116
119
|
isMedia(tableName: string) {
|
|
117
120
|
return this.opts.fileTable?.tableName === tableName;
|
|
118
121
|
}
|
|
@@ -147,6 +150,7 @@ export class Prostgles {
|
|
|
147
150
|
onLog: 1,
|
|
148
151
|
restApi: 1,
|
|
149
152
|
testRulesOnConnect: 1,
|
|
153
|
+
modifyClientSchema: 1,
|
|
150
154
|
};
|
|
151
155
|
const unknownParams = Object.keys(params).filter(
|
|
152
156
|
(key: string) => !Object.keys(config).includes(key),
|
|
@@ -157,10 +161,6 @@ export class Prostgles {
|
|
|
157
161
|
|
|
158
162
|
this.opts = { ...this.opts, ...params };
|
|
159
163
|
|
|
160
|
-
/* set defaults */
|
|
161
|
-
if (this.opts.fileTable) {
|
|
162
|
-
this.opts.fileTable.tableName ??= "media";
|
|
163
|
-
}
|
|
164
164
|
this.opts.schemaFilter ??= { public: 1 };
|
|
165
165
|
|
|
166
166
|
this.keywords = {
|
|
@@ -195,10 +195,8 @@ export class Prostgles {
|
|
|
195
195
|
if (this.opts.tsGeneratedTypesDir) {
|
|
196
196
|
const { fullPath, fileName } = this.getTSFileName();
|
|
197
197
|
const { tsSchema: fileContent } = this.dboBuilder.getTsDefinitions();
|
|
198
|
-
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
199
198
|
fs.readFile(fullPath, "utf8", function (err, data) {
|
|
200
199
|
if (err || force || data !== fileContent) {
|
|
201
|
-
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
202
200
|
fs.writeFileSync(fullPath, fileContent);
|
|
203
201
|
console.log("Prostgles: Created typescript schema definition file: \n " + fileName);
|
|
204
202
|
}
|
|
@@ -285,39 +283,6 @@ export class Prostgles {
|
|
|
285
283
|
return res.data;
|
|
286
284
|
};
|
|
287
285
|
|
|
288
|
-
/* Create media table if required */
|
|
289
|
-
initFileTable = async () => {
|
|
290
|
-
const res = await tryCatchV2(async () => {
|
|
291
|
-
if (this.opts.fileTable) {
|
|
292
|
-
const { cloudClient, localConfig, imageOptions } = this.opts.fileTable;
|
|
293
|
-
await this.refreshDBO();
|
|
294
|
-
if (!cloudClient && !localConfig)
|
|
295
|
-
throw "fileTable missing param: Must provide awsS3Config OR localConfig";
|
|
296
|
-
|
|
297
|
-
this.fileManager = new FileManager(cloudClient || localConfig!, imageOptions);
|
|
298
|
-
|
|
299
|
-
try {
|
|
300
|
-
await this.fileManager.init(this);
|
|
301
|
-
} catch (e) {
|
|
302
|
-
console.error("FileManager: ", e);
|
|
303
|
-
this.fileManager = undefined;
|
|
304
|
-
}
|
|
305
|
-
} else {
|
|
306
|
-
this.fileManager?.destroy();
|
|
307
|
-
this.fileManager = undefined;
|
|
308
|
-
}
|
|
309
|
-
await this.refreshDBO();
|
|
310
|
-
return { data: {} };
|
|
311
|
-
});
|
|
312
|
-
await this.opts.onLog?.({
|
|
313
|
-
type: "debug",
|
|
314
|
-
command: "initFileTable",
|
|
315
|
-
...res,
|
|
316
|
-
});
|
|
317
|
-
if (res.error !== undefined) throw res.error;
|
|
318
|
-
return res.data;
|
|
319
|
-
};
|
|
320
|
-
|
|
321
286
|
isSuperUser = false;
|
|
322
287
|
|
|
323
288
|
init = initProstgles.bind(this);
|
|
@@ -365,7 +330,6 @@ export async function getIsSuperUser(db: DBorTx): Promise<boolean> {
|
|
|
365
330
|
|
|
366
331
|
export const getFileText = (fullPath: string, _format = "utf8"): Promise<string> => {
|
|
367
332
|
return new Promise((resolve, reject) => {
|
|
368
|
-
// eslint-disable-next-line security/detect-non-literal-fs-filename
|
|
369
333
|
fs.readFile(fullPath, "utf8", function (err, data) {
|
|
370
334
|
if (err) reject(err);
|
|
371
335
|
else resolve(data);
|
package/lib/ProstglesTypes.ts
CHANGED
|
@@ -1,23 +1,28 @@
|
|
|
1
|
-
import type { FileColumnConfig } from "prostgles-types";
|
|
2
|
-
import type {
|
|
1
|
+
import type { DBSchemaTable, FileColumnConfig, MaybePromise } from "prostgles-types";
|
|
2
|
+
import type {
|
|
3
|
+
AuthConfig,
|
|
4
|
+
AuthRequestParams,
|
|
5
|
+
AuthResultWithSID,
|
|
6
|
+
SessionUser,
|
|
7
|
+
} from "./Auth/AuthTypes";
|
|
3
8
|
import type { EventTriggerTagFilter } from "./Event_Trigger_Tags";
|
|
4
|
-
import type {
|
|
9
|
+
import type { StorageClient } from "./FileManager/FileManager";
|
|
5
10
|
import type { DbConnection, OnReadyCallback } from "./initProstgles";
|
|
6
11
|
import type { EventInfo } from "./Logging";
|
|
7
|
-
import type {
|
|
12
|
+
import type { RestApiConfig } from "./RestApi";
|
|
8
13
|
import type { OnSchemaChangeCallback } from "./SchemaWatch/SchemaWatch";
|
|
9
14
|
import type { PGConstraint } from "./TableConfig/fetchTableConstraints";
|
|
10
|
-
import type { TableConfig } from "./TableConfig/
|
|
11
|
-
import type { Express } from "express";
|
|
15
|
+
import type { TableConfig } from "./TableConfig/TableConfigTypes";
|
|
12
16
|
|
|
13
17
|
import type { PRGLIOSocket } from "./DboBuilder/DboBuilder";
|
|
14
18
|
|
|
19
|
+
import type e from "express";
|
|
15
20
|
import type pgPromise from "pg-promise";
|
|
16
21
|
import type pg from "pg-promise/typescript/pg-subset";
|
|
17
22
|
import type { AnyObject } from "prostgles-types";
|
|
18
23
|
import type { Server } from "socket.io";
|
|
19
|
-
import type { Awaitable, Publish, PublishParams } from "./PublishParser/PublishParser";
|
|
20
24
|
import type { ServerFunctionDefinitions } from "./PublishParser/defineServerFunction";
|
|
25
|
+
import type { Awaitable, Publish, PublishParams } from "./PublishParser/PublishParser";
|
|
21
26
|
|
|
22
27
|
/**
|
|
23
28
|
* Allows uploading and downloading files.
|
|
@@ -37,15 +42,16 @@ import type { ServerFunctionDefinitions } from "./PublishParser/defineServerFunc
|
|
|
37
42
|
export type FileTableConfig = {
|
|
38
43
|
/**
|
|
39
44
|
* Name of the table that will contain the file metadata.
|
|
40
|
-
* Defaults to "files"
|
|
41
45
|
*/
|
|
42
|
-
tableName
|
|
46
|
+
tableName: string;
|
|
43
47
|
|
|
44
48
|
/**
|
|
45
49
|
* GET path used in serving media. defaults to /${tableName}
|
|
46
50
|
*/
|
|
47
51
|
fileServePath?: string;
|
|
48
52
|
|
|
53
|
+
expressApp: e.Express;
|
|
54
|
+
|
|
49
55
|
/**
|
|
50
56
|
* If defined the the files will not be deleted immediately
|
|
51
57
|
* Instead, the "deleted" field will be updated to the current timestamp and after the day interval provided in "deleteAfterNDays" the files will be deleted
|
|
@@ -57,16 +63,11 @@ export type FileTableConfig = {
|
|
|
57
63
|
*/
|
|
58
64
|
deleteAfterNDays: number;
|
|
59
65
|
/**
|
|
60
|
-
* How
|
|
66
|
+
* How frequently the files will be checked for deletion delay
|
|
61
67
|
*/
|
|
62
68
|
checkIntervalHours?: number;
|
|
63
69
|
};
|
|
64
70
|
|
|
65
|
-
/**
|
|
66
|
-
* Express server instance
|
|
67
|
-
*/
|
|
68
|
-
expressApp: ExpressApp | Express;
|
|
69
|
-
|
|
70
71
|
/**
|
|
71
72
|
* Specifying referencedTables with referenceColumns allows restricting the
|
|
72
73
|
* allowed file types that can be inserted and referenced in the specified tables.
|
|
@@ -78,18 +79,12 @@ export type FileTableConfig = {
|
|
|
78
79
|
* */
|
|
79
80
|
{ type: "column"; referenceColumns: Record<string, FileColumnConfig> };
|
|
80
81
|
};
|
|
81
|
-
imageOptions?: ImageOptions;
|
|
82
82
|
|
|
83
83
|
/**
|
|
84
84
|
* Callbacks for file upload and download.
|
|
85
85
|
* Used for custom file handling.
|
|
86
86
|
*/
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Local file storage configuration.
|
|
91
|
-
*/
|
|
92
|
-
localConfig?: LocalConfig;
|
|
87
|
+
storageClient: StorageClient;
|
|
93
88
|
};
|
|
94
89
|
|
|
95
90
|
export const JOIN_TYPES = ["one-many", "many-one", "one-one", "many-many"] as const;
|
|
@@ -100,6 +95,11 @@ export type Join = {
|
|
|
100
95
|
};
|
|
101
96
|
type Joins = Join[] | "inferred";
|
|
102
97
|
|
|
98
|
+
type ModifyClientSchema<SUser extends SessionUser = SessionUser> = (
|
|
99
|
+
tables: DBSchemaTable,
|
|
100
|
+
userData: AuthResultWithSID<SUser> | undefined,
|
|
101
|
+
) => MaybePromise<DBSchemaTable>;
|
|
102
|
+
|
|
103
103
|
export type ProstglesInitOptions<S = void, SUser extends SessionUser = SessionUser> = {
|
|
104
104
|
/**
|
|
105
105
|
* Database connection details and options
|
|
@@ -189,7 +189,7 @@ export type ProstglesInitOptions<S = void, SUser extends SessionUser = SessionUs
|
|
|
189
189
|
|
|
190
190
|
/**
|
|
191
191
|
* Allows defining table relationships that can then be used in filters and data inserts:
|
|
192
|
-
* - `
|
|
192
|
+
* - `inferred` - uses the foreign keys to infer the joins
|
|
193
193
|
* - `Join[]` - specifies the joins manually
|
|
194
194
|
*/
|
|
195
195
|
joins?: Joins;
|
|
@@ -307,9 +307,15 @@ export type ProstglesInitOptions<S = void, SUser extends SessionUser = SessionUs
|
|
|
307
307
|
tableConfigMigrations?: TableConfigMigrations;
|
|
308
308
|
|
|
309
309
|
/**
|
|
310
|
-
*
|
|
310
|
+
* Useful for logging or debugging
|
|
311
311
|
*/
|
|
312
312
|
onLog?: (evt: EventInfo) => Promise<void> | void;
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Used to add custom metadata to the table and column schemas.
|
|
316
|
+
* This metadata is then available in the client schema and can be used for custom logic on the client side.
|
|
317
|
+
*/
|
|
318
|
+
modifyClientSchema?: ModifyClientSchema<SUser>;
|
|
313
319
|
};
|
|
314
320
|
|
|
315
321
|
export type TableConfigMigrations = {
|
|
@@ -15,8 +15,6 @@ export async function notifListener(this: PubSubManager, data: { payload: string
|
|
|
15
15
|
const dataArr = str.split(DELIMITER);
|
|
16
16
|
const notifType = dataArr[0] as NotifTypeName;
|
|
17
17
|
|
|
18
|
-
log(str);
|
|
19
|
-
|
|
20
18
|
const commonLog = {
|
|
21
19
|
triggers: this._triggers,
|
|
22
20
|
sid: undefined,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getObjectEntries, includes, type DBSchemaTable } from "prostgles-types";
|
|
2
|
-
import type { AuthClientRequest } from "../Auth/AuthTypes";
|
|
2
|
+
import type { AuthClientRequest, AuthResultWithSID } from "../Auth/AuthTypes";
|
|
3
3
|
import { getErrorAsObject } from "../DboBuilder/dboBuilderUtils";
|
|
4
4
|
import type { TableHandler } from "../DboBuilder/TableHandler/TableHandler";
|
|
5
5
|
import { TABLE_METHODS } from "../Prostgles";
|
|
@@ -11,6 +11,7 @@ export const getDBSchemaTable = async (
|
|
|
11
11
|
tableHandler: TableHandler,
|
|
12
12
|
parsedTableRule: ParsedTableRule,
|
|
13
13
|
clientReq: AuthClientRequest,
|
|
14
|
+
clientInfo: AuthResultWithSID | undefined,
|
|
14
15
|
scope: PermissionScope | undefined,
|
|
15
16
|
): Promise<DBSchemaTable> => {
|
|
16
17
|
const tableName = tableHandler.name;
|
|
@@ -20,11 +21,13 @@ export const getDBSchemaTable = async (
|
|
|
20
21
|
}
|
|
21
22
|
const info = await tableHandler.getInfo(undefined, undefined, undefined, parsedTableRule, {
|
|
22
23
|
...clientReq,
|
|
23
|
-
isRemoteRequest: {
|
|
24
|
+
isRemoteRequest: {
|
|
25
|
+
clientInfo,
|
|
26
|
+
},
|
|
24
27
|
});
|
|
25
28
|
const columns = await tableHandler.getColumns(undefined, undefined, undefined, parsedTableRule, {
|
|
26
29
|
...clientReq,
|
|
27
|
-
isRemoteRequest: {},
|
|
30
|
+
isRemoteRequest: { clientInfo },
|
|
28
31
|
});
|
|
29
32
|
const allowedCommands = getAllowedTableMethods(info);
|
|
30
33
|
for (const method of allowedCommands) {
|
|
@@ -45,7 +45,7 @@ export async function getSchemaFromPublish(
|
|
|
45
45
|
* Add file table to the list of published tables if it's referenced by other published tables.
|
|
46
46
|
* Access to the file table is controlled through the publish rules of the tables referencing it.
|
|
47
47
|
*/
|
|
48
|
-
const fileTableName = this.prostgles.
|
|
48
|
+
const fileTableName = this.prostgles.opts.fileTable?.tableName;
|
|
49
49
|
if (fileTableName && this.dbo[fileTableName]?.is_media && !tableNames.includes(fileTableName)) {
|
|
50
50
|
const isReferenced = this.prostgles.dboBuilder.tablesOrViews?.some((t) =>
|
|
51
51
|
t.columns.some((c) => c.references?.some((r) => r.ftable === fileTableName)),
|
|
@@ -83,6 +83,7 @@ export async function getSchemaFromPublish(
|
|
|
83
83
|
tableHandler,
|
|
84
84
|
parsedTableRule,
|
|
85
85
|
clientReq,
|
|
86
|
+
clientInfo,
|
|
86
87
|
scope,
|
|
87
88
|
);
|
|
88
89
|
tables.push(tableSchema);
|
|
@@ -60,6 +60,7 @@ export type ValidateBeforeRowArgsCommon<R = AnyObject, DBX = DBHandlerServer> =
|
|
|
60
60
|
tx: pgPromise.ITask<{}> | DB;
|
|
61
61
|
command: "insert" | "update";
|
|
62
62
|
data: Partial<R>;
|
|
63
|
+
filter: AnyObject | undefined;
|
|
63
64
|
};
|
|
64
65
|
export type ValidateRowArgsCommon<R = AnyObject, DBX = DBHandlerServer> = {
|
|
65
66
|
row: R;
|
package/lib/RestApi.ts
CHANGED
|
@@ -6,6 +6,7 @@ import type { Prostgles } from "./Prostgles";
|
|
|
6
6
|
import { runClientMethod, runClientRequest, runClientSqlRequest } from "./runClientRequest";
|
|
7
7
|
import type { VoidFunction } from "./SchemaWatch/SchemaWatch";
|
|
8
8
|
import { isDefined } from "prostgles-types";
|
|
9
|
+
import type e from "express";
|
|
9
10
|
|
|
10
11
|
type ExpressInternalRouter = {
|
|
11
12
|
stack?: {
|
|
@@ -31,10 +32,7 @@ export type ExpressApp = {
|
|
|
31
32
|
} & Omit<Express, "_router" | "router">;
|
|
32
33
|
|
|
33
34
|
export type RestApiConfig = {
|
|
34
|
-
|
|
35
|
-
* Express server instance
|
|
36
|
-
*/
|
|
37
|
-
expressApp: Express;
|
|
35
|
+
expressApp: e.Express;
|
|
38
36
|
|
|
39
37
|
/**
|
|
40
38
|
* Defaults to "/api"
|
|
@@ -50,9 +48,9 @@ export class RestApi {
|
|
|
50
48
|
methods: string;
|
|
51
49
|
schema: string;
|
|
52
50
|
};
|
|
53
|
-
expressApp:
|
|
51
|
+
expressApp: e.Express;
|
|
54
52
|
path = "/api";
|
|
55
|
-
constructor({
|
|
53
|
+
constructor({ path, prostgles, expressApp }: RestApiConfig & { prostgles: Prostgles }) {
|
|
56
54
|
if (isDefined(path) && !path.trim()) {
|
|
57
55
|
throw new Error("path cannot be empty");
|
|
58
56
|
}
|
|
@@ -64,19 +62,21 @@ export class RestApi {
|
|
|
64
62
|
methods: `${path}/methods/:name`,
|
|
65
63
|
schema: `${path}/schema`,
|
|
66
64
|
};
|
|
67
|
-
|
|
65
|
+
|
|
66
|
+
this.expressApp = expressApp;
|
|
68
67
|
/** Must check if json parser is loaded */
|
|
69
68
|
|
|
70
|
-
expressApp.post(this.routes.db, this.onPostTableCommand);
|
|
71
|
-
expressApp.post(this.routes.sql, this.onPostSql);
|
|
72
|
-
expressApp.post(this.routes.methods, this.onPostMethod);
|
|
73
|
-
expressApp.post(this.routes.schema, this.onPostSchema);
|
|
69
|
+
this.expressApp.post(this.routes.db, this.onPostTableCommand);
|
|
70
|
+
this.expressApp.post(this.routes.sql, this.onPostSql);
|
|
71
|
+
this.expressApp.post(this.routes.methods, this.onPostMethod);
|
|
72
|
+
this.expressApp.post(this.routes.schema, this.onPostSchema);
|
|
74
73
|
}
|
|
75
74
|
|
|
76
75
|
destroy = () => {
|
|
77
76
|
this.expressApp.removeListener(this.routes.db, this.onPostTableCommand);
|
|
78
77
|
this.expressApp.removeListener(this.routes.sql, this.onPostSql);
|
|
79
78
|
this.expressApp.removeListener(this.routes.methods, this.onPostMethod);
|
|
79
|
+
this.expressApp.removeListener(this.routes.schema, this.onPostSchema);
|
|
80
80
|
removeExpressRoute(this.expressApp, [this.path]);
|
|
81
81
|
};
|
|
82
82
|
onPostMethod = async (req: ExpressReq, res: ExpressRes) => {
|
|
@@ -120,7 +120,7 @@ export class RestApi {
|
|
|
120
120
|
onPostSql = async (req: ExpressReq, res: ExpressRes) => {
|
|
121
121
|
const [query, params, options] = req.body || [];
|
|
122
122
|
try {
|
|
123
|
-
const data = await runClientSqlRequest.bind(this.prostgles)(
|
|
123
|
+
const data: unknown = await runClientSqlRequest.bind(this.prostgles)(
|
|
124
124
|
{
|
|
125
125
|
query,
|
|
126
126
|
params,
|