prostgles-server 4.2.567 → 4.2.569

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 (223) 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/DBSchemaBuilder/getColumnTypescriptDefinition.d.ts +1 -1
  8. package/dist/DBSchemaBuilder/getColumnTypescriptDefinition.d.ts.map +1 -1
  9. package/dist/DBSchemaBuilder/getDBGeneratedSchema.d.ts +1 -1
  10. package/dist/DBSchemaBuilder/getDBGeneratedSchema.d.ts.map +1 -1
  11. package/dist/DboBuilder/DboBuilder.js +4 -4
  12. package/dist/DboBuilder/DboBuilder.js.map +1 -1
  13. package/dist/DboBuilder/DboBuilderTypes.d.ts +2 -18
  14. package/dist/DboBuilder/DboBuilderTypes.d.ts.map +1 -1
  15. package/dist/DboBuilder/DboBuilderTypes.js.map +1 -1
  16. package/dist/DboBuilder/TableHandler/TableHandler.d.ts +15 -5
  17. package/dist/DboBuilder/TableHandler/TableHandler.d.ts.map +1 -1
  18. package/dist/DboBuilder/TableHandler/TableHandler.js +4 -3
  19. package/dist/DboBuilder/TableHandler/TableHandler.js.map +1 -1
  20. package/dist/DboBuilder/TableHandler/delete.d.ts.map +1 -1
  21. package/dist/DboBuilder/TableHandler/delete.js +17 -14
  22. package/dist/DboBuilder/TableHandler/delete.js.map +1 -1
  23. package/dist/DboBuilder/TableHandler/insert/insert.d.ts.map +1 -1
  24. package/dist/DboBuilder/TableHandler/insert/insert.js +3 -12
  25. package/dist/DboBuilder/TableHandler/insert/insert.js.map +1 -1
  26. package/dist/DboBuilder/TableHandler/insert/insertNestedRecords.d.ts.map +1 -1
  27. package/dist/DboBuilder/TableHandler/insert/insertNestedRecords.js +10 -15
  28. package/dist/DboBuilder/TableHandler/insert/insertNestedRecords.js.map +1 -1
  29. package/dist/DboBuilder/TableHandler/insert/insertRowWithNestedRecords.js +1 -1
  30. package/dist/DboBuilder/TableHandler/insert/insertRowWithNestedRecords.js.map +1 -1
  31. package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.d.ts +8 -6
  32. package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.d.ts.map +1 -1
  33. package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.js +30 -48
  34. package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.js.map +1 -1
  35. package/dist/DboBuilder/TableHandler/update.d.ts +1 -1
  36. package/dist/DboBuilder/TableHandler/update.d.ts.map +1 -1
  37. package/dist/DboBuilder/TableHandler/update.js +8 -18
  38. package/dist/DboBuilder/TableHandler/update.js.map +1 -1
  39. package/dist/DboBuilder/TableHandler/updateFile.d.ts +2 -3
  40. package/dist/DboBuilder/TableHandler/updateFile.d.ts.map +1 -1
  41. package/dist/DboBuilder/TableHandler/updateFile.js +8 -28
  42. package/dist/DboBuilder/TableHandler/updateFile.js.map +1 -1
  43. package/dist/DboBuilder/ViewHandler/ViewHandler.d.ts +2 -2
  44. package/dist/DboBuilder/ViewHandler/ViewHandler.d.ts.map +1 -1
  45. package/dist/DboBuilder/ViewHandler/getInfo.d.ts +1 -1
  46. package/dist/DboBuilder/ViewHandler/getInfo.d.ts.map +1 -1
  47. package/dist/DboBuilder/ViewHandler/getInfo.js +12 -1
  48. package/dist/DboBuilder/ViewHandler/getInfo.js.map +1 -1
  49. package/dist/DboBuilder/getColumns.d.ts.map +1 -1
  50. package/dist/DboBuilder/getColumns.js +29 -4
  51. package/dist/DboBuilder/getColumns.js.map +1 -1
  52. package/dist/DboBuilder/schema/getTablesForSchemaPostgresSQL.d.ts +2 -2
  53. package/dist/DboBuilder/uploadFile.d.ts +5 -6
  54. package/dist/DboBuilder/uploadFile.d.ts.map +1 -1
  55. package/dist/DboBuilder/uploadFile.js +28 -42
  56. package/dist/DboBuilder/uploadFile.js.map +1 -1
  57. package/dist/FileManager/FileManager.d.ts +22 -78
  58. package/dist/FileManager/FileManager.d.ts.map +1 -1
  59. package/dist/FileManager/FileManager.js +1 -219
  60. package/dist/FileManager/FileManager.js.map +1 -1
  61. package/dist/FileManager/getFileTableConfig.d.ts +26 -0
  62. package/dist/FileManager/getFileTableConfig.d.ts.map +1 -0
  63. package/dist/FileManager/getFileTableConfig.js +115 -0
  64. package/dist/FileManager/getFileTableConfig.js.map +1 -0
  65. package/dist/FileManager/getLocalStorageClient.d.ts +3 -0
  66. package/dist/FileManager/getLocalStorageClient.d.ts.map +1 -0
  67. package/dist/FileManager/getLocalStorageClient.js +105 -0
  68. package/dist/FileManager/getLocalStorageClient.js.map +1 -0
  69. package/dist/FileManager/getValidatedFileType.d.ts +2 -2
  70. package/dist/FileManager/getValidatedFileType.d.ts.map +1 -1
  71. package/dist/FileManager/getValidatedFileType.js +7 -9
  72. package/dist/FileManager/getValidatedFileType.js.map +1 -1
  73. package/dist/FileManager/setupFileServeHandler.d.ts +9 -0
  74. package/dist/FileManager/setupFileServeHandler.d.ts.map +1 -0
  75. package/dist/FileManager/setupFileServeHandler.js +114 -0
  76. package/dist/FileManager/setupFileServeHandler.js.map +1 -0
  77. package/dist/Filtering/Filtering.d.ts +1 -1
  78. package/dist/Logging.d.ts +1 -1
  79. package/dist/Logging.d.ts.map +1 -1
  80. package/dist/Prostgles.d.ts +52 -6
  81. package/dist/Prostgles.d.ts.map +1 -1
  82. package/dist/Prostgles.js +8 -47
  83. package/dist/Prostgles.js.map +1 -1
  84. package/dist/ProstglesTypes.d.ts +23 -21
  85. package/dist/ProstglesTypes.d.ts.map +1 -1
  86. package/dist/ProstglesTypes.js.map +1 -1
  87. package/dist/PubSubManager/notifListener.d.ts.map +1 -1
  88. package/dist/PubSubManager/notifListener.js +0 -1
  89. package/dist/PubSubManager/notifListener.js.map +1 -1
  90. package/dist/PublishParser/getDBSchemaTable.d.ts +2 -2
  91. package/dist/PublishParser/getDBSchemaTable.d.ts.map +1 -1
  92. package/dist/PublishParser/getDBSchemaTable.js +5 -3
  93. package/dist/PublishParser/getDBSchemaTable.js.map +1 -1
  94. package/dist/PublishParser/getSchemaFromPublish.d.ts.map +1 -1
  95. package/dist/PublishParser/getSchemaFromPublish.js +2 -2
  96. package/dist/PublishParser/getSchemaFromPublish.js.map +1 -1
  97. package/dist/PublishParser/publishTypesAndUtils.d.ts +1 -0
  98. package/dist/PublishParser/publishTypesAndUtils.d.ts.map +1 -1
  99. package/dist/PublishParser/publishTypesAndUtils.js.map +1 -1
  100. package/dist/RestApi.d.ts +1 -5
  101. package/dist/RestApi.d.ts.map +1 -1
  102. package/dist/RestApi.js +10 -5
  103. package/dist/RestApi.js.map +1 -1
  104. package/dist/TableConfig/{TableConfig.d.ts → TableConfigTypes.d.ts} +19 -64
  105. package/dist/TableConfig/TableConfigTypes.d.ts.map +1 -0
  106. package/dist/TableConfig/TableConfigTypes.js +3 -0
  107. package/dist/TableConfig/TableConfigTypes.js.map +1 -0
  108. package/dist/TableConfig/TableConfigurator.d.ts +104 -0
  109. package/dist/TableConfig/TableConfigurator.d.ts.map +1 -0
  110. package/dist/TableConfig/{TableConfig.js → TableConfigurator.js} +31 -44
  111. package/dist/TableConfig/TableConfigurator.js.map +1 -0
  112. package/dist/TableConfig/applyTableConfig.d.ts.map +1 -1
  113. package/dist/TableConfig/applyTableConfig.js +0 -1
  114. package/dist/TableConfig/applyTableConfig.js.map +1 -1
  115. package/dist/TableConfig/getColumnConfig.d.ts +1 -1
  116. package/dist/TableConfig/getColumnConfig.d.ts.map +1 -1
  117. package/dist/TableConfig/getColumnSQLDefinitionQuery.d.ts +1 -1
  118. package/dist/TableConfig/getColumnSQLDefinitionQuery.d.ts.map +1 -1
  119. package/dist/TableConfig/getColumnSQLDefinitionQuery.js +1 -1
  120. package/dist/TableConfig/getColumnSQLDefinitionQuery.js.map +1 -1
  121. package/dist/TableConfig/getConstraintDefinitionQueries.d.ts +1 -1
  122. package/dist/TableConfig/getConstraintDefinitionQueries.d.ts.map +1 -1
  123. package/dist/TableConfig/getCreateSchemaQueries.d.ts +26 -8
  124. package/dist/TableConfig/getCreateSchemaQueries.d.ts.map +1 -1
  125. package/dist/TableConfig/getSchemaDiffQueries.d.ts.map +1 -1
  126. package/dist/TableConfig/getSchemaDiffQueries.js +12 -8
  127. package/dist/TableConfig/getSchemaDiffQueries.js.map +1 -1
  128. package/dist/TableConfig/getTableColumnQueries.d.ts +1 -1
  129. package/dist/TableConfig/getTableColumnQueries.d.ts.map +1 -1
  130. package/dist/TableConfig/getTableColumnQueries.js +19 -19
  131. package/dist/TableConfig/getTableColumnQueries.js.map +1 -1
  132. package/dist/TableConfig/getTableConfigSchemaQueries.d.ts +26 -10
  133. package/dist/TableConfig/getTableConfigSchemaQueries.d.ts.map +1 -1
  134. package/dist/TableConfig/getTableConfigSchemaQueries.js +8 -10
  135. package/dist/TableConfig/getTableConfigSchemaQueries.js.map +1 -1
  136. package/dist/TableConfig/indexes/getIndexesQueries.d.ts +1 -1
  137. package/dist/TableConfig/indexes/getIndexesQueries.d.ts.map +1 -1
  138. package/dist/TableConfig/initTableConfig.d.ts +1 -1
  139. package/dist/TableConfig/initTableConfig.d.ts.map +1 -1
  140. package/dist/TableConfig/initTableConfig.js +6 -3
  141. package/dist/TableConfig/initTableConfig.js.map +1 -1
  142. package/dist/WebsocketAPI/getClientSchema.d.ts.map +1 -1
  143. package/dist/WebsocketAPI/getClientSchema.js +6 -1
  144. package/dist/WebsocketAPI/getClientSchema.js.map +1 -1
  145. package/dist/index.d.ts +3 -2
  146. package/dist/index.d.ts.map +1 -1
  147. package/dist/index.js +1 -0
  148. package/dist/index.js.map +1 -1
  149. package/dist/initProstgles.d.ts.map +1 -1
  150. package/dist/initProstgles.js +2 -5
  151. package/dist/initProstgles.js.map +1 -1
  152. package/dist/runClientRequest.js +1 -1
  153. package/dist/runClientRequest.js.map +1 -1
  154. package/dist/updateConfiguration.d.ts.map +1 -1
  155. package/dist/updateConfiguration.js +0 -3
  156. package/dist/updateConfiguration.js.map +1 -1
  157. package/eslint.config.mjs +0 -3
  158. package/lib/Auth/AuthTypes.ts +6 -7
  159. package/lib/Auth/endpoints/setCatchAllRequestHandler.ts +6 -2
  160. package/lib/DBSchemaBuilder/getColumnTypescriptDefinition.ts +1 -1
  161. package/lib/DBSchemaBuilder/getDBGeneratedSchema.ts +1 -1
  162. package/lib/DboBuilder/DboBuilder.ts +4 -4
  163. package/lib/DboBuilder/DboBuilderTypes.ts +7 -20
  164. package/lib/DboBuilder/TableHandler/TableHandler.ts +7 -4
  165. package/lib/DboBuilder/TableHandler/delete.ts +23 -17
  166. package/lib/DboBuilder/TableHandler/insert/insert.ts +3 -12
  167. package/lib/DboBuilder/TableHandler/insert/insertNestedRecords.ts +13 -17
  168. package/lib/DboBuilder/TableHandler/insert/insertRowWithNestedRecords.ts +1 -1
  169. package/lib/DboBuilder/TableHandler/onDeleteFromFileTable.ts +41 -54
  170. package/lib/DboBuilder/TableHandler/update.ts +8 -19
  171. package/lib/DboBuilder/TableHandler/updateFile.ts +20 -42
  172. package/lib/DboBuilder/ViewHandler/ViewHandler.ts +1 -1
  173. package/lib/DboBuilder/ViewHandler/getInfo.ts +19 -2
  174. package/lib/DboBuilder/getColumns.ts +40 -4
  175. package/lib/DboBuilder/uploadFile.ts +34 -50
  176. package/lib/FileManager/FileManager.ts +23 -249
  177. package/lib/FileManager/getFileTableConfig.ts +142 -0
  178. package/lib/FileManager/getLocalStorageClient.ts +118 -0
  179. package/lib/FileManager/getValidatedFileType.ts +14 -22
  180. package/lib/FileManager/setupFileServeHandler.ts +102 -0
  181. package/lib/Logging.ts +0 -3
  182. package/lib/Prostgles.ts +9 -44
  183. package/lib/ProstglesTypes.ts +34 -23
  184. package/lib/PubSubManager/notifListener.ts +0 -2
  185. package/lib/PublishParser/getDBSchemaTable.ts +6 -3
  186. package/lib/PublishParser/getSchemaFromPublish.ts +2 -1
  187. package/lib/PublishParser/publishTypesAndUtils.ts +1 -0
  188. package/lib/RestApi.ts +12 -12
  189. package/lib/TableConfig/{TableConfig.ts → TableConfigTypes.ts} +18 -217
  190. package/lib/TableConfig/TableConfigurator.ts +191 -0
  191. package/lib/TableConfig/applyTableConfig.ts +2 -3
  192. package/lib/TableConfig/getColumnConfig.ts +2 -2
  193. package/lib/TableConfig/getColumnSQLDefinitionQuery.ts +2 -2
  194. package/lib/TableConfig/getConstraintDefinitionQueries.ts +1 -1
  195. package/lib/TableConfig/getCreateSchemaQueries.ts +1 -1
  196. package/lib/TableConfig/getSchemaDiffQueries.ts +14 -11
  197. package/lib/TableConfig/getTableColumnQueries.ts +22 -20
  198. package/lib/TableConfig/getTableConfigSchemaQueries.ts +20 -22
  199. package/lib/TableConfig/indexes/getIndexesQueries.ts +1 -1
  200. package/lib/TableConfig/initTableConfig.ts +7 -6
  201. package/lib/WebsocketAPI/getClientSchema.ts +7 -1
  202. package/lib/index.ts +3 -2
  203. package/lib/initProstgles.ts +2 -6
  204. package/lib/runClientRequest.ts +1 -1
  205. package/lib/updateConfiguration.ts +0 -3
  206. package/package.json +2 -3
  207. package/dist/FileManager/initFileManager.d.ts +0 -18
  208. package/dist/FileManager/initFileManager.d.ts.map +0 -1
  209. package/dist/FileManager/initFileManager.js +0 -257
  210. package/dist/FileManager/initFileManager.js.map +0 -1
  211. package/dist/FileManager/upload.d.ts +0 -4
  212. package/dist/FileManager/upload.d.ts.map +0 -1
  213. package/dist/FileManager/upload.js +0 -90
  214. package/dist/FileManager/upload.js.map +0 -1
  215. package/dist/FileManager/uploadStream.d.ts +0 -4
  216. package/dist/FileManager/uploadStream.d.ts.map +0 -1
  217. package/dist/FileManager/uploadStream.js +0 -100
  218. package/dist/FileManager/uploadStream.js.map +0 -1
  219. package/dist/TableConfig/TableConfig.d.ts.map +0 -1
  220. package/dist/TableConfig/TableConfig.js.map +0 -1
  221. package/lib/FileManager/initFileManager.ts +0 -254
  222. package/lib/FileManager/upload.ts +0 -59
  223. package/lib/FileManager/uploadStream.ts +0 -76
@@ -1,254 +0,0 @@
1
- import * as fs from "fs";
2
- import { asName, tryCatchV2 } from "prostgles-types";
3
- import { HTTP_FAIL_CODES } from "../Auth/AuthHandler";
4
- import type { Media } from "../DboBuilder/DboBuilderTypes";
5
- import type { TableHandler } from "../DboBuilder/TableHandler/TableHandler";
6
- import { canCreateTables } from "../DboBuilder/runSql/runSQL";
7
- import type { Prostgles } from "../Prostgles";
8
- import type { SchemaRelatedOptions } from "../TableConfig/getCreateSchemaQueries";
9
- import { runClientRequest } from "../runClientRequest";
10
- import type { FileManager, LocalConfig } from "./FileManager";
11
- import { HOUR } from "./FileManager";
12
- import { join } from "path";
13
-
14
- export const getFileManagerSchema = ({
15
- fileTable,
16
- tableConfig,
17
- }: Pick<SchemaRelatedOptions, "fileTable" | "tableConfig">) => {
18
- if (!fileTable) {
19
- return;
20
- }
21
- const { tableName: fileTableName = "files", referencedTables = {} } = fileTable;
22
- if (tableConfig?.[fileTableName]) {
23
- throw new Error(
24
- `FileManager table name (${fileTableName}) is reserved. Please use a different name in tableConfig`,
25
- );
26
- }
27
- const fileTableQuery = `
28
- CREATE EXTENSION IF NOT EXISTS pgcrypto;
29
- CREATE TABLE IF NOT EXISTS ${asName(fileTableName)} (
30
- name TEXT NOT NULL,
31
- extension TEXT NOT NULL,
32
- content_type TEXT NOT NULL,
33
- content_length BIGINT NOT NULL DEFAULT 0,
34
- added TIMESTAMP NOT NULL DEFAULT NOW(),
35
- url TEXT NOT NULL,
36
- id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
37
- original_name TEXT NOT NULL,
38
- description TEXT,
39
- cloud_url TEXT,
40
- signed_url TEXT,
41
- signed_url_expires BIGINT,
42
- etag TEXT,
43
- deleted BIGINT,
44
- deleted_from_storage BIGINT,
45
- UNIQUE(id),
46
- UNIQUE(name)
47
- );`;
48
-
49
- const referencedTablesQueries = Object.entries(referencedTables)
50
- .flatMap(([refTable, refTableConfig]) => {
51
- return Object.entries(refTableConfig.referenceColumns).map(([colName]) => {
52
- const tConf = tableConfig?.[refTable];
53
- const columnConfig = tConf && "columns" in tConf && tConf.columns?.[colName];
54
- /** This is a bit hacky. TODO: setup file columns only in tableConfig */
55
- if (columnConfig) {
56
- return `ALTER TABLE ${asName(refTable)} ADD FOREIGN KEY (${asName(colName)}) REFERENCES ${asName(fileTableName)} (id) ;`;
57
- }
58
- return `ALTER TABLE ${asName(refTable)} ADD COLUMN ${asName(colName)} UUID REFERENCES ${asName(fileTableName)} (id);`;
59
- });
60
- })
61
- .sort();
62
-
63
- return {
64
- fileTable,
65
- fileTableName,
66
- fileTableQuery,
67
- referencedTables,
68
- referencedTablesQueries,
69
- queries: [fileTableQuery, ...referencedTablesQueries],
70
- };
71
- };
72
-
73
- export async function initFileManager(this: FileManager, prg: Prostgles) {
74
- this.prostgles = prg;
75
- const schema = getFileManagerSchema({
76
- fileTable: prg.opts.fileTable,
77
- tableConfig: prg.opts.tableConfig,
78
- });
79
- if (!schema) throw "No fileTable config found in prostgles options";
80
- const { fileTable, fileTableQuery, referencedTables, fileTableName } = schema;
81
- this.tableName = fileTableName;
82
-
83
- const maxBfSizeMB = (prg.opts.io?.engine.opts.maxHttpBufferSize || 1e6) / 1e6;
84
- console.log(
85
- `Prostgles: Initiated file manager. Max allowed file size: ${maxBfSizeMB}MB (maxHttpBufferSize = 1e6). To increase this set maxHttpBufferSize in socket.io server init options`,
86
- );
87
-
88
- const canCreate = await canCreateTables(this.db);
89
- const runQuery = async (q: string, debugInfo: string): Promise<void> => {
90
- const res = await tryCatchV2(async () => {
91
- if (!canCreate)
92
- throw "File table creation failed. Your postgres user does not have CREATE table privileges";
93
- await this.db.any(q);
94
- });
95
- await this.prostgles?.opts.onLog?.({
96
- type: "debug",
97
- command: "initFileManager.runQuery",
98
- ...res,
99
- data: { debugInfo },
100
- });
101
- if (res.hasError) {
102
- throw res.error;
103
- }
104
- };
105
- /**
106
- * 1. Create media table
107
- */
108
- if (!this.dbo[fileTableName]) {
109
- await runQuery(fileTableQuery, `Create fileTable ${asName(fileTableName)}`);
110
- await prg.refreshDBO();
111
- }
112
-
113
- /**
114
- * 2. Create media lookup tables
115
- */
116
- for (const [refTable, tableConfig] of Object.entries(referencedTables)) {
117
- if (!this.dbo[refTable]) {
118
- throw `Referenced table (${refTable}) from fileTable.referencedTables prostgles init config does not exist`;
119
- }
120
- const cols = await (this.dbo[refTable]).getColumns();
121
-
122
- for (const [colName] of Object.entries(tableConfig.referenceColumns)) {
123
- const existingCol = cols.find((c) => c.name === colName);
124
- if (existingCol) {
125
- if (existingCol.references?.some(({ ftable }) => ftable === fileTableName)) {
126
- // All ok
127
- } else {
128
- if (existingCol.udt_name === "uuid") {
129
- try {
130
- const query = `ALTER TABLE ${asName(refTable)} ADD FOREIGN KEY (${asName(colName)}) REFERENCES ${asName(fileTableName)} (id) ;`;
131
- const msg = `Referenced file column ${refTable} (${colName}) exists but is not referencing file table. Add REFERENCE constraint...\n${query}`;
132
- await runQuery(query, msg);
133
- } catch (e) {
134
- console.error(
135
- `Could not add constraing. Err: ${e instanceof Error ? e.message : JSON.stringify(e)}`,
136
- );
137
- }
138
- } else {
139
- console.error(
140
- `Referenced file column ${refTable} (${colName}) exists but is not of required type (UUID). Choose a different column name or ALTER the existing column to match the type and the data found in file table ${fileTableName}(id)`,
141
- );
142
- }
143
- }
144
- } else {
145
- const query = `ALTER TABLE ${asName(refTable)} ADD COLUMN ${asName(colName)} UUID REFERENCES ${asName(fileTableName)} (id);`;
146
- // const createColumn = async () => {
147
- // try {
148
- // const msg = `Create referenced file column ${refTable} (${colName})...\n${query}`;
149
- // await runQuery(query, msg);
150
- // } catch(e){
151
- // console.error(`FAILED. Err: ${e instanceof Error? e.message : JSON.stringify(e)}`)
152
- // }
153
- // }
154
- // await createColumn();
155
- console.error(
156
- `Referenced file column ${refTable} (${colName}) does not exist. Create it using this query:\n${query}`,
157
- );
158
- }
159
- }
160
-
161
- await prg.refreshDBO();
162
- }
163
-
164
- /**
165
- * 4. Serve media through express
166
- */
167
- const { fileServePath: fileServeRoute = `/${fileTableName}`, expressApp: app } = fileTable;
168
-
169
- if (fileServeRoute.endsWith("/")) {
170
- throw `fileServeRoute must not end with a '/'`;
171
- }
172
- this.path = fileServeRoute;
173
-
174
- app.get(this.fileRouteExpress, async (req, res) => {
175
- const mediaTableHandler = this.dbo[fileTableName];
176
- if (!mediaTableHandler) {
177
- res
178
- .status(HTTP_FAIL_CODES.INTERNAL_SERVER_ERROR)
179
- .json(`Internal error: media table (${fileTableName}) not valid or not allowed`);
180
- return false;
181
- }
182
-
183
- try {
184
- const { name } = req.params;
185
- if (typeof name !== "string" || !name) {
186
- throw "Invalid media name";
187
- }
188
- if (!this.prostgles) {
189
- throw "Prostgles instance missing";
190
- }
191
- const id = name.slice(0, 36);
192
- const selectParams = {
193
- select: {
194
- id: 1,
195
- name: 1,
196
- signed_url: 1,
197
- signed_url_expires: 1,
198
- content_type: 1,
199
- },
200
- };
201
- const media = (await runClientRequest.bind(this.prostgles)(
202
- {
203
- command: "findOne",
204
- tableName: fileTableName,
205
- param1: { id },
206
- param2: selectParams,
207
- param3: undefined,
208
- },
209
- {
210
- res,
211
- httpReq: req,
212
- },
213
- undefined,
214
- )) as Required<Media> | undefined;
215
-
216
- if (!media) {
217
- res.status(HTTP_FAIL_CODES.NOT_FOUND).send("File not found or not allowed");
218
- return;
219
- }
220
-
221
- if (this.cloudClient) {
222
- let url = media.signed_url;
223
- const expires = +(media.signed_url_expires || 0);
224
-
225
- const EXPIRES = Date.now() + HOUR;
226
- if (!url || expires < EXPIRES) {
227
- url = await this.getFileCloudDownloadURL(media.name, 60 * 60);
228
-
229
- await this.db.any(
230
- "UPDATE ${fileTableName:name} SET signed_url = ${signed_url}, signed_url_expires = ${signed_url_expires} WHERE id = ${id}",
231
- {
232
- fileTableName,
233
- id: media.id,
234
- signed_url: url,
235
- signed_url_expires: EXPIRES,
236
- },
237
- );
238
- }
239
-
240
- res.redirect(url);
241
- } else {
242
- const localFilePath = join((this.config as LocalConfig).localFolderPath, media.name);
243
- if (!fs.existsSync(localFilePath)) {
244
- throw new Error("File not found");
245
- }
246
- res.contentType(media.content_type);
247
- res.sendFile(localFilePath);
248
- }
249
- } catch (e) {
250
- console.log(e);
251
- res.status(HTTP_FAIL_CODES.BAD_REQUEST).send("Invalid/disallowed file");
252
- }
253
- });
254
- }
@@ -1,59 +0,0 @@
1
- import type { FileManager, LocalConfig, OnProgress, UploadedItem } from "./FileManager";
2
- import * as stream from "stream";
3
- import * as fs from "fs";
4
-
5
- export async function upload(
6
- this: FileManager,
7
- file: Buffer | string | stream.PassThrough,
8
- name: string,
9
- mime: string,
10
- onProgress?: OnProgress
11
- ): Promise<UploadedItem> {
12
- return new Promise(async (resolve, reject) => {
13
- if (!file) {
14
- throw "No file. Expecting: Buffer | String | stream.PassThrough";
15
- }
16
- if (!name) {
17
- throw "No file name. Expecting: String";
18
- }
19
-
20
- const url = this.getLocalFileUrl(name);
21
- if (!this.cloudClient) {
22
- if (file instanceof stream.PassThrough) {
23
- throw new Error("S3 config missing. Can only upload streams to S3");
24
- }
25
- const config = this.config as LocalConfig;
26
- try {
27
- await fs.promises.mkdir(config.localFolderPath, { recursive: true });
28
- const filePath = `${config.localFolderPath}/${name}`;
29
- fs.writeFileSync(filePath, file);
30
- resolve({
31
- url,
32
- etag: `none`,
33
- content_length: fs.statSync(filePath).size,
34
- });
35
- } catch (err) {
36
- console.error("Error saving file locally", err);
37
- reject("Internal error");
38
- }
39
- } else {
40
- let content_length = 0;
41
- void this.cloudClient.upload({
42
- fileName: name,
43
- contentType: mime,
44
- file,
45
- onFinish: (err, uploaded) => {
46
- if (err) {
47
- reject(err.toString());
48
- } else {
49
- resolve({ ...uploaded, url });
50
- }
51
- },
52
- onProgress: (loaded) => {
53
- content_length = loaded;
54
- onProgress?.({ loaded, total: content_length });
55
- },
56
- });
57
- }
58
- });
59
- }
@@ -1,76 +0,0 @@
1
- import type { FileManager, OnProgress, UploadedItem } from "./FileManager";
2
- import * as fs from "fs";
3
- import * as stream from "stream";
4
- import * as path from "path";
5
-
6
- export function uploadStream(
7
- this: FileManager,
8
- name: string,
9
- mime: string,
10
- onProgress?: OnProgress,
11
- onError?: (error: any) => void,
12
- onEnd?: (item: UploadedItem) => void,
13
- expectedSizeBytes?: number
14
- ) {
15
- const passThrough = new stream.PassThrough();
16
-
17
- if (!this.cloudClient && "localFolderPath" in this.config) {
18
- try {
19
- this.checkFreeSpace(this.config.localFolderPath, expectedSizeBytes).catch((err) => {
20
- onError?.(err);
21
- passThrough.end();
22
- });
23
- const url = this.getLocalFileUrl(name);
24
- fs.mkdirSync(this.config.localFolderPath, { recursive: true });
25
- const filePath = path.resolve(`${this.config.localFolderPath}/${name}`);
26
- const writeStream = fs.createWriteStream(filePath);
27
-
28
- let errored = false;
29
- let loaded = 0;
30
- writeStream.on("error", (err) => {
31
- errored = true;
32
- onError?.(err);
33
- });
34
-
35
- let lastProgress = Date.now();
36
- const throttle = 1000;
37
- if (onProgress) {
38
- passThrough.on("data", function (chunk) {
39
- loaded += chunk.length;
40
- const now = Date.now();
41
- if (now - lastProgress > throttle) {
42
- lastProgress = now;
43
- onProgress({ loaded, total: expectedSizeBytes ?? 0 });
44
- }
45
- });
46
- }
47
-
48
- if (onEnd) {
49
- writeStream.on("finish", () => {
50
- if (errored) return;
51
- let content_length = 0;
52
- try {
53
- content_length = fs.statSync(filePath).size;
54
-
55
- onEnd({
56
- url,
57
- filePath,
58
- etag: `none`,
59
- content_length,
60
- });
61
- } catch (err) {
62
- onError?.(err);
63
- }
64
- });
65
- }
66
-
67
- passThrough.pipe(writeStream);
68
- } catch (err) {
69
- onError?.(err);
70
- }
71
- } else {
72
- void this.upload(passThrough, name, mime, onProgress).then(onEnd).catch(onError);
73
- }
74
-
75
- return passThrough;
76
- }