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.
Files changed (224) hide show
  1. package/dist/Auth/AuthTypes.d.ts +5 -5
  2. package/dist/Auth/AuthTypes.d.ts.map +1 -1
  3. package/dist/Auth/AuthTypes.js.map +1 -1
  4. package/dist/Auth/endpoints/setCatchAllRequestHandler.d.ts.map +1 -1
  5. package/dist/Auth/endpoints/setCatchAllRequestHandler.js +2 -2
  6. package/dist/Auth/endpoints/setCatchAllRequestHandler.js.map +1 -1
  7. package/dist/Auth/utils/removeExpressRoute.d.ts.map +1 -1
  8. package/dist/DBSchemaBuilder/getColumnTypescriptDefinition.d.ts +1 -1
  9. package/dist/DBSchemaBuilder/getColumnTypescriptDefinition.d.ts.map +1 -1
  10. package/dist/DBSchemaBuilder/getDBGeneratedSchema.d.ts +1 -1
  11. package/dist/DBSchemaBuilder/getDBGeneratedSchema.d.ts.map +1 -1
  12. package/dist/DboBuilder/DboBuilder.js +4 -4
  13. package/dist/DboBuilder/DboBuilder.js.map +1 -1
  14. package/dist/DboBuilder/DboBuilderTypes.d.ts +2 -18
  15. package/dist/DboBuilder/DboBuilderTypes.d.ts.map +1 -1
  16. package/dist/DboBuilder/DboBuilderTypes.js.map +1 -1
  17. package/dist/DboBuilder/TableHandler/TableHandler.d.ts +15 -5
  18. package/dist/DboBuilder/TableHandler/TableHandler.d.ts.map +1 -1
  19. package/dist/DboBuilder/TableHandler/TableHandler.js +4 -3
  20. package/dist/DboBuilder/TableHandler/TableHandler.js.map +1 -1
  21. package/dist/DboBuilder/TableHandler/delete.d.ts.map +1 -1
  22. package/dist/DboBuilder/TableHandler/delete.js +17 -14
  23. package/dist/DboBuilder/TableHandler/delete.js.map +1 -1
  24. package/dist/DboBuilder/TableHandler/insert/insert.d.ts.map +1 -1
  25. package/dist/DboBuilder/TableHandler/insert/insert.js +3 -12
  26. package/dist/DboBuilder/TableHandler/insert/insert.js.map +1 -1
  27. package/dist/DboBuilder/TableHandler/insert/insertNestedRecords.d.ts.map +1 -1
  28. package/dist/DboBuilder/TableHandler/insert/insertNestedRecords.js +10 -15
  29. package/dist/DboBuilder/TableHandler/insert/insertNestedRecords.js.map +1 -1
  30. package/dist/DboBuilder/TableHandler/insert/insertRowWithNestedRecords.js +1 -1
  31. package/dist/DboBuilder/TableHandler/insert/insertRowWithNestedRecords.js.map +1 -1
  32. package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.d.ts +8 -6
  33. package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.d.ts.map +1 -1
  34. package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.js +30 -48
  35. package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.js.map +1 -1
  36. package/dist/DboBuilder/TableHandler/update.d.ts +1 -1
  37. package/dist/DboBuilder/TableHandler/update.d.ts.map +1 -1
  38. package/dist/DboBuilder/TableHandler/update.js +8 -18
  39. package/dist/DboBuilder/TableHandler/update.js.map +1 -1
  40. package/dist/DboBuilder/TableHandler/updateFile.d.ts +2 -3
  41. package/dist/DboBuilder/TableHandler/updateFile.d.ts.map +1 -1
  42. package/dist/DboBuilder/TableHandler/updateFile.js +8 -28
  43. package/dist/DboBuilder/TableHandler/updateFile.js.map +1 -1
  44. package/dist/DboBuilder/ViewHandler/ViewHandler.d.ts +2 -2
  45. package/dist/DboBuilder/ViewHandler/ViewHandler.d.ts.map +1 -1
  46. package/dist/DboBuilder/ViewHandler/getInfo.d.ts +1 -1
  47. package/dist/DboBuilder/ViewHandler/getInfo.d.ts.map +1 -1
  48. package/dist/DboBuilder/ViewHandler/getInfo.js +12 -1
  49. package/dist/DboBuilder/ViewHandler/getInfo.js.map +1 -1
  50. package/dist/DboBuilder/getColumns.d.ts.map +1 -1
  51. package/dist/DboBuilder/getColumns.js +29 -4
  52. package/dist/DboBuilder/getColumns.js.map +1 -1
  53. package/dist/DboBuilder/schema/getTablesForSchemaPostgresSQL.d.ts +2 -2
  54. package/dist/DboBuilder/uploadFile.d.ts +5 -6
  55. package/dist/DboBuilder/uploadFile.d.ts.map +1 -1
  56. package/dist/DboBuilder/uploadFile.js +28 -42
  57. package/dist/DboBuilder/uploadFile.js.map +1 -1
  58. package/dist/FileManager/FileManager.d.ts +22 -78
  59. package/dist/FileManager/FileManager.d.ts.map +1 -1
  60. package/dist/FileManager/FileManager.js +1 -219
  61. package/dist/FileManager/FileManager.js.map +1 -1
  62. package/dist/FileManager/getFileTableConfig.d.ts +26 -0
  63. package/dist/FileManager/getFileTableConfig.d.ts.map +1 -0
  64. package/dist/FileManager/getFileTableConfig.js +113 -0
  65. package/dist/FileManager/getFileTableConfig.js.map +1 -0
  66. package/dist/FileManager/getLocalStorageClient.d.ts +3 -0
  67. package/dist/FileManager/getLocalStorageClient.d.ts.map +1 -0
  68. package/dist/FileManager/getLocalStorageClient.js +105 -0
  69. package/dist/FileManager/getLocalStorageClient.js.map +1 -0
  70. package/dist/FileManager/getValidatedFileType.d.ts +2 -2
  71. package/dist/FileManager/getValidatedFileType.d.ts.map +1 -1
  72. package/dist/FileManager/getValidatedFileType.js +7 -9
  73. package/dist/FileManager/getValidatedFileType.js.map +1 -1
  74. package/dist/FileManager/setupFileServeHandler.d.ts +9 -0
  75. package/dist/FileManager/setupFileServeHandler.d.ts.map +1 -0
  76. package/dist/FileManager/setupFileServeHandler.js +114 -0
  77. package/dist/FileManager/setupFileServeHandler.js.map +1 -0
  78. package/dist/Filtering/Filtering.d.ts +1 -1
  79. package/dist/Logging.d.ts +1 -1
  80. package/dist/Logging.d.ts.map +1 -1
  81. package/dist/Prostgles.d.ts +52 -6
  82. package/dist/Prostgles.d.ts.map +1 -1
  83. package/dist/Prostgles.js +7 -47
  84. package/dist/Prostgles.js.map +1 -1
  85. package/dist/ProstglesTypes.d.ts +19 -22
  86. package/dist/ProstglesTypes.d.ts.map +1 -1
  87. package/dist/ProstglesTypes.js.map +1 -1
  88. package/dist/PubSubManager/notifListener.d.ts.map +1 -1
  89. package/dist/PubSubManager/notifListener.js +0 -1
  90. package/dist/PubSubManager/notifListener.js.map +1 -1
  91. package/dist/PublishParser/getDBSchemaTable.d.ts +2 -2
  92. package/dist/PublishParser/getDBSchemaTable.d.ts.map +1 -1
  93. package/dist/PublishParser/getDBSchemaTable.js +5 -3
  94. package/dist/PublishParser/getDBSchemaTable.js.map +1 -1
  95. package/dist/PublishParser/getSchemaFromPublish.d.ts.map +1 -1
  96. package/dist/PublishParser/getSchemaFromPublish.js +2 -2
  97. package/dist/PublishParser/getSchemaFromPublish.js.map +1 -1
  98. package/dist/PublishParser/publishTypesAndUtils.d.ts +1 -0
  99. package/dist/PublishParser/publishTypesAndUtils.d.ts.map +1 -1
  100. package/dist/PublishParser/publishTypesAndUtils.js.map +1 -1
  101. package/dist/RestApi.d.ts +4 -6
  102. package/dist/RestApi.d.ts.map +1 -1
  103. package/dist/RestApi.js +6 -5
  104. package/dist/RestApi.js.map +1 -1
  105. package/dist/TableConfig/{TableConfig.d.ts → TableConfigTypes.d.ts} +19 -64
  106. package/dist/TableConfig/TableConfigTypes.d.ts.map +1 -0
  107. package/dist/TableConfig/TableConfigTypes.js +3 -0
  108. package/dist/TableConfig/TableConfigTypes.js.map +1 -0
  109. package/dist/TableConfig/TableConfigurator.d.ts +104 -0
  110. package/dist/TableConfig/TableConfigurator.d.ts.map +1 -0
  111. package/dist/TableConfig/{TableConfig.js → TableConfigurator.js} +31 -44
  112. package/dist/TableConfig/TableConfigurator.js.map +1 -0
  113. package/dist/TableConfig/applyTableConfig.d.ts.map +1 -1
  114. package/dist/TableConfig/applyTableConfig.js +0 -1
  115. package/dist/TableConfig/applyTableConfig.js.map +1 -1
  116. package/dist/TableConfig/getColumnConfig.d.ts +1 -1
  117. package/dist/TableConfig/getColumnConfig.d.ts.map +1 -1
  118. package/dist/TableConfig/getColumnSQLDefinitionQuery.d.ts +1 -1
  119. package/dist/TableConfig/getColumnSQLDefinitionQuery.d.ts.map +1 -1
  120. package/dist/TableConfig/getColumnSQLDefinitionQuery.js +1 -1
  121. package/dist/TableConfig/getColumnSQLDefinitionQuery.js.map +1 -1
  122. package/dist/TableConfig/getConstraintDefinitionQueries.d.ts +1 -1
  123. package/dist/TableConfig/getConstraintDefinitionQueries.d.ts.map +1 -1
  124. package/dist/TableConfig/getCreateSchemaQueries.d.ts +26 -8
  125. package/dist/TableConfig/getCreateSchemaQueries.d.ts.map +1 -1
  126. package/dist/TableConfig/getSchemaDiffQueries.d.ts.map +1 -1
  127. package/dist/TableConfig/getSchemaDiffQueries.js +12 -8
  128. package/dist/TableConfig/getSchemaDiffQueries.js.map +1 -1
  129. package/dist/TableConfig/getTableColumnQueries.d.ts +1 -1
  130. package/dist/TableConfig/getTableColumnQueries.d.ts.map +1 -1
  131. package/dist/TableConfig/getTableColumnQueries.js +19 -19
  132. package/dist/TableConfig/getTableColumnQueries.js.map +1 -1
  133. package/dist/TableConfig/getTableConfigSchemaQueries.d.ts +26 -10
  134. package/dist/TableConfig/getTableConfigSchemaQueries.d.ts.map +1 -1
  135. package/dist/TableConfig/getTableConfigSchemaQueries.js +8 -10
  136. package/dist/TableConfig/getTableConfigSchemaQueries.js.map +1 -1
  137. package/dist/TableConfig/indexes/getIndexesQueries.d.ts +1 -1
  138. package/dist/TableConfig/indexes/getIndexesQueries.d.ts.map +1 -1
  139. package/dist/TableConfig/initTableConfig.d.ts +1 -1
  140. package/dist/TableConfig/initTableConfig.d.ts.map +1 -1
  141. package/dist/TableConfig/initTableConfig.js +6 -3
  142. package/dist/TableConfig/initTableConfig.js.map +1 -1
  143. package/dist/WebsocketAPI/getClientSchema.d.ts.map +1 -1
  144. package/dist/WebsocketAPI/getClientSchema.js +6 -1
  145. package/dist/WebsocketAPI/getClientSchema.js.map +1 -1
  146. package/dist/index.d.ts +3 -2
  147. package/dist/index.d.ts.map +1 -1
  148. package/dist/index.js +1 -0
  149. package/dist/index.js.map +1 -1
  150. package/dist/initProstgles.d.ts.map +1 -1
  151. package/dist/initProstgles.js +1 -2
  152. package/dist/initProstgles.js.map +1 -1
  153. package/dist/runClientRequest.js +1 -1
  154. package/dist/runClientRequest.js.map +1 -1
  155. package/dist/updateConfiguration.d.ts.map +1 -1
  156. package/dist/updateConfiguration.js +0 -3
  157. package/dist/updateConfiguration.js.map +1 -1
  158. package/eslint.config.mjs +0 -3
  159. package/lib/Auth/AuthTypes.ts +6 -7
  160. package/lib/Auth/endpoints/setCatchAllRequestHandler.ts +6 -2
  161. package/lib/DBSchemaBuilder/getColumnTypescriptDefinition.ts +1 -1
  162. package/lib/DBSchemaBuilder/getDBGeneratedSchema.ts +1 -1
  163. package/lib/DboBuilder/DboBuilder.ts +4 -4
  164. package/lib/DboBuilder/DboBuilderTypes.ts +7 -20
  165. package/lib/DboBuilder/TableHandler/TableHandler.ts +7 -4
  166. package/lib/DboBuilder/TableHandler/delete.ts +23 -17
  167. package/lib/DboBuilder/TableHandler/insert/insert.ts +3 -12
  168. package/lib/DboBuilder/TableHandler/insert/insertNestedRecords.ts +13 -17
  169. package/lib/DboBuilder/TableHandler/insert/insertRowWithNestedRecords.ts +1 -1
  170. package/lib/DboBuilder/TableHandler/onDeleteFromFileTable.ts +41 -54
  171. package/lib/DboBuilder/TableHandler/update.ts +8 -19
  172. package/lib/DboBuilder/TableHandler/updateFile.ts +20 -42
  173. package/lib/DboBuilder/ViewHandler/ViewHandler.ts +1 -1
  174. package/lib/DboBuilder/ViewHandler/getInfo.ts +19 -2
  175. package/lib/DboBuilder/getColumns.ts +40 -4
  176. package/lib/DboBuilder/uploadFile.ts +34 -50
  177. package/lib/FileManager/FileManager.ts +23 -249
  178. package/lib/FileManager/getFileTableConfig.ts +140 -0
  179. package/lib/FileManager/getLocalStorageClient.ts +118 -0
  180. package/lib/FileManager/getValidatedFileType.ts +14 -22
  181. package/lib/FileManager/setupFileServeHandler.ts +102 -0
  182. package/lib/Logging.ts +0 -3
  183. package/lib/Prostgles.ts +8 -44
  184. package/lib/ProstglesTypes.ts +30 -24
  185. package/lib/PubSubManager/notifListener.ts +0 -2
  186. package/lib/PublishParser/getDBSchemaTable.ts +6 -3
  187. package/lib/PublishParser/getSchemaFromPublish.ts +2 -1
  188. package/lib/PublishParser/publishTypesAndUtils.ts +1 -0
  189. package/lib/RestApi.ts +12 -12
  190. package/lib/TableConfig/{TableConfig.ts → TableConfigTypes.ts} +18 -217
  191. package/lib/TableConfig/TableConfigurator.ts +191 -0
  192. package/lib/TableConfig/applyTableConfig.ts +2 -3
  193. package/lib/TableConfig/getColumnConfig.ts +2 -2
  194. package/lib/TableConfig/getColumnSQLDefinitionQuery.ts +2 -2
  195. package/lib/TableConfig/getConstraintDefinitionQueries.ts +1 -1
  196. package/lib/TableConfig/getCreateSchemaQueries.ts +1 -1
  197. package/lib/TableConfig/getSchemaDiffQueries.ts +14 -11
  198. package/lib/TableConfig/getTableColumnQueries.ts +22 -20
  199. package/lib/TableConfig/getTableConfigSchemaQueries.ts +20 -22
  200. package/lib/TableConfig/indexes/getIndexesQueries.ts +1 -1
  201. package/lib/TableConfig/initTableConfig.ts +7 -6
  202. package/lib/WebsocketAPI/getClientSchema.ts +7 -1
  203. package/lib/index.ts +3 -2
  204. package/lib/initProstgles.ts +1 -2
  205. package/lib/runClientRequest.ts +1 -1
  206. package/lib/updateConfiguration.ts +0 -3
  207. package/package.json +2 -3
  208. package/dist/FileManager/initFileManager.d.ts +0 -18
  209. package/dist/FileManager/initFileManager.d.ts.map +0 -1
  210. package/dist/FileManager/initFileManager.js +0 -257
  211. package/dist/FileManager/initFileManager.js.map +0 -1
  212. package/dist/FileManager/upload.d.ts +0 -4
  213. package/dist/FileManager/upload.d.ts.map +0 -1
  214. package/dist/FileManager/upload.js +0 -90
  215. package/dist/FileManager/upload.js.map +0 -1
  216. package/dist/FileManager/uploadStream.d.ts +0 -4
  217. package/dist/FileManager/uploadStream.d.ts.map +0 -1
  218. package/dist/FileManager/uploadStream.js +0 -100
  219. package/dist/FileManager/uploadStream.js.map +0 -1
  220. package/dist/TableConfig/TableConfig.d.ts.map +0 -1
  221. package/dist/TableConfig/TableConfig.js.map +0 -1
  222. package/lib/FileManager/initFileManager.ts +0 -254
  223. package/lib/FileManager/upload.ts +0 -59
  224. 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/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);
@@ -1,23 +1,28 @@
1
- import type { FileColumnConfig } from "prostgles-types";
2
- import type { AuthConfig, AuthRequestParams, SessionUser } from "./Auth/AuthTypes";
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 { CloudClient, ImageOptions, LocalConfig } from "./FileManager/FileManager";
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 { ExpressApp, RestApiConfig } from "./RestApi";
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/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?: string;
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 freuquently the files will be checked for deletion delay
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
- cloudClient?: CloudClient;
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
- * - `infered` - uses the foreign keys to infer the joins
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
- * Usefull for logging or debugging
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.fileManager?.tableName;
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: ExpressApp;
51
+ expressApp: e.Express;
54
52
  path = "/api";
55
- constructor({ expressApp, path, prostgles }: RestApiConfig & { prostgles: Prostgles }) {
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
- this.expressApp = expressApp as ExpressApp;
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,