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
|
@@ -3,7 +3,7 @@ import { CREATE_VALIDATE_SCHEMA_FUNCTION_SQL } from "../JSONBSchemaValidation/va
|
|
|
3
3
|
import type { DB, DBHandlerServer } from "../Prostgles";
|
|
4
4
|
import { getColumnSQLDefinitionQuery, getTableColumns } from "./getColumnSQLDefinitionQuery";
|
|
5
5
|
import { getFutureTableSchema } from "./getFutureTableSchema";
|
|
6
|
-
import type { TableConfig } from "./
|
|
6
|
+
import type { TableConfig } from "./TableConfigTypes";
|
|
7
7
|
|
|
8
8
|
type Args = {
|
|
9
9
|
db: DB;
|
|
@@ -30,7 +30,7 @@ export const getTableColumnQueries = async ({
|
|
|
30
30
|
isCreate: boolean;
|
|
31
31
|
}
|
|
32
32
|
> => {
|
|
33
|
-
|
|
33
|
+
const newColumnDefinitions: string[] = [];
|
|
34
34
|
const droppedColNames: string[] = [];
|
|
35
35
|
const alteredColQueries: string[] = [];
|
|
36
36
|
let fullQuery = "";
|
|
@@ -62,7 +62,7 @@ export const getTableColumnQueries = async ({
|
|
|
62
62
|
return typeof colDef === "string" || !("joinDef" in colDef);
|
|
63
63
|
});
|
|
64
64
|
|
|
65
|
-
const
|
|
65
|
+
const columnDefinitions: { name: string; def: string }[] = [];
|
|
66
66
|
|
|
67
67
|
for (const [colName, colConf] of columns) {
|
|
68
68
|
/* Get column definition */
|
|
@@ -73,25 +73,25 @@ export const getTableColumnQueries = async ({
|
|
|
73
73
|
table: tableName,
|
|
74
74
|
});
|
|
75
75
|
if (colDef) {
|
|
76
|
-
|
|
76
|
+
columnDefinitions.push({ name: colName.toString(), def: colDef });
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
|
-
const columnDefs =
|
|
79
|
+
const columnDefs = columnDefinitions.map((c) => c.def);
|
|
80
80
|
|
|
81
|
-
if (!
|
|
81
|
+
if (!columnDefinitions.length) {
|
|
82
82
|
return undefined;
|
|
83
83
|
}
|
|
84
84
|
|
|
85
|
-
const
|
|
85
|
+
const alterTableQuery = `ALTER TABLE ${asName(tableName)}`;
|
|
86
86
|
if (!tableHandler) {
|
|
87
|
-
|
|
87
|
+
columnDefinitions.map((c) => newColumnDefinitions.push(c.def));
|
|
88
88
|
} else {
|
|
89
89
|
const currCols = await getTableColumns({ db, table: tableName });
|
|
90
90
|
|
|
91
91
|
/** Add new columns */
|
|
92
|
-
|
|
92
|
+
columnDefinitions
|
|
93
93
|
.filter((nc) => !tableHandler.columns.some((c) => nc.name === c.name))
|
|
94
|
-
.
|
|
94
|
+
.forEach((c) => newColumnDefinitions.push(c.def));
|
|
95
95
|
|
|
96
96
|
/** Altered/Dropped columns */
|
|
97
97
|
const { cols: futureCols } = await getFutureTableSchema({
|
|
@@ -106,14 +106,14 @@ export const getTableColumnQueries = async ({
|
|
|
106
106
|
droppedColNames.push(c.column_name);
|
|
107
107
|
} else if (newCol.nullable !== c.nullable) {
|
|
108
108
|
alteredColQueries.push(
|
|
109
|
-
`${
|
|
109
|
+
`${alterTableQuery} ALTER COLUMN ${asName(c.column_name)} ${newCol.nullable ? "DROP" : "SET"} NOT NULL;`,
|
|
110
110
|
);
|
|
111
111
|
} else if (newCol.udt_name !== c.udt_name) {
|
|
112
112
|
alteredColQueries.push(
|
|
113
|
-
`${
|
|
113
|
+
`${alterTableQuery} ALTER COLUMN ${asName(c.column_name)} TYPE ${newCol.udt_name} USING ${asName(c.column_name)}::${newCol.udt_name};`,
|
|
114
114
|
);
|
|
115
115
|
} else if (newCol.column_default !== c.column_default) {
|
|
116
|
-
const colConfig =
|
|
116
|
+
const colConfig = columnDefinitions.find((cd) => cd.name === c.column_name);
|
|
117
117
|
if (
|
|
118
118
|
["serial", "bigserial"].some((t) => colConfig?.def.toLowerCase().includes(` ${t}`)) &&
|
|
119
119
|
c.column_default?.toLowerCase().includes("nextval")
|
|
@@ -121,7 +121,7 @@ export const getTableColumnQueries = async ({
|
|
|
121
121
|
/** Ignore SERIAL/BIGSERIAL <> nextval mismatch */
|
|
122
122
|
} else {
|
|
123
123
|
alteredColQueries.push(
|
|
124
|
-
`${
|
|
124
|
+
`${alterTableQuery} ALTER COLUMN ${asName(c.column_name)} ${newCol.column_default === null ? "DROP DEFAULT" : `SET DEFAULT ${newCol.column_default}`};`,
|
|
125
125
|
);
|
|
126
126
|
}
|
|
127
127
|
}
|
|
@@ -130,10 +130,10 @@ export const getTableColumnQueries = async ({
|
|
|
130
130
|
|
|
131
131
|
if (!tableHandler || tableConf.dropIfExists || tableConf.dropIfExistsCascade) {
|
|
132
132
|
isCreate = true;
|
|
133
|
-
const
|
|
133
|
+
const dropTableQuery = `DROP TABLE IF EXISTS ${asName(tableName)}`;
|
|
134
134
|
fullQuery = [
|
|
135
|
-
...(tableConf.dropIfExists ? [`${
|
|
136
|
-
: tableConf.dropIfExistsCascade ? [`${
|
|
135
|
+
...(tableConf.dropIfExists ? [`${dropTableQuery};`]
|
|
136
|
+
: tableConf.dropIfExistsCascade ? [`${dropTableQuery} CASCADE;`]
|
|
137
137
|
: []),
|
|
138
138
|
`CREATE TABLE ${asName(tableName)} (`,
|
|
139
139
|
columnDefs.join(", \n"),
|
|
@@ -141,8 +141,10 @@ export const getTableColumnQueries = async ({
|
|
|
141
141
|
].join("\n");
|
|
142
142
|
} else {
|
|
143
143
|
fullQuery = [
|
|
144
|
-
...droppedColNames.map((c) => `${
|
|
145
|
-
...
|
|
144
|
+
// ...droppedColNames.map((c) => `${alterTableQuery} DROP COLUMN ${asName(c)};`),
|
|
145
|
+
...newColumnDefinitions.map(
|
|
146
|
+
(columnDefinition) => `${alterTableQuery} ADD COLUMN ${columnDefinition};`,
|
|
147
|
+
),
|
|
146
148
|
...alteredColQueries,
|
|
147
149
|
].join("\n");
|
|
148
150
|
}
|
|
@@ -151,6 +153,6 @@ export const getTableColumnQueries = async ({
|
|
|
151
153
|
fullQuery,
|
|
152
154
|
columnDefs,
|
|
153
155
|
isCreate,
|
|
154
|
-
newColumnDefs,
|
|
156
|
+
newColumnDefs: newColumnDefinitions,
|
|
155
157
|
};
|
|
156
158
|
};
|
|
@@ -1,32 +1,31 @@
|
|
|
1
1
|
import { as } from "pg-promise";
|
|
2
2
|
import { isDefined } from "prostgles-types";
|
|
3
|
-
import { getFileManagerSchema } from "../FileManager/initFileManager";
|
|
4
3
|
import type { DB } from "../initProstgles";
|
|
5
4
|
import { getColumnSQLDefinitionQuery } from "./getColumnSQLDefinitionQuery";
|
|
6
5
|
import { getConstraintDefinitionQueries } from "./getConstraintDefinitionQueries";
|
|
7
6
|
import { tableConfigWithMigrations, type SchemaRelatedOptions } from "./getCreateSchemaQueries";
|
|
8
|
-
import type { TableConfig } from "./
|
|
7
|
+
import type { TableConfig } from "./TableConfigTypes";
|
|
9
8
|
import type { getSchemaUtils } from "./tableConfigSchemaUtils";
|
|
10
9
|
|
|
11
10
|
export const getTableConfigSchemaQueries = async (
|
|
12
11
|
opts: SchemaRelatedOptions,
|
|
13
|
-
{ asName, db }: Pick<Awaited<ReturnType<typeof getSchemaUtils>>, "asName" | "db"
|
|
12
|
+
{ asName, db }: Pick<Awaited<ReturnType<typeof getSchemaUtils>>, "asName" | "db">,
|
|
14
13
|
) => {
|
|
15
|
-
const fileTableSchema =
|
|
16
|
-
const fileTableSchemaQuery = fileTableSchema?.queries.join("\n") ?? "";
|
|
17
|
-
const migrations = await tableConfigWithMigrations(db, opts,
|
|
14
|
+
// const fileTableSchema = getFileTableConfig(opts);
|
|
15
|
+
// const fileTableSchemaQuery = fileTableSchema?.queries.join("\n") ?? "";
|
|
16
|
+
const migrations = await tableConfigWithMigrations(db, opts, "");
|
|
18
17
|
|
|
19
18
|
const config: TableConfig = migrations.config ?? {};
|
|
20
19
|
|
|
21
20
|
const uniqueColumnAndTableNames = Array.from(
|
|
22
21
|
new Set(
|
|
23
|
-
Object.entries(config).flatMap(([
|
|
22
|
+
Object.entries(config).flatMap(([tableName, tableConf]) => {
|
|
24
23
|
if ("columns" in tableConf && tableConf.columns) {
|
|
25
|
-
return [
|
|
24
|
+
return [tableName, ...Object.keys(tableConf.columns)];
|
|
26
25
|
}
|
|
27
|
-
return [
|
|
28
|
-
})
|
|
29
|
-
)
|
|
26
|
+
return [tableName];
|
|
27
|
+
}),
|
|
28
|
+
),
|
|
30
29
|
);
|
|
31
30
|
|
|
32
31
|
/** Avoid using double quotes when not required to ensure the jsonb validation checks do not include unnecessary quotes */
|
|
@@ -34,10 +33,10 @@ export const getTableConfigSchemaQueries = async (
|
|
|
34
33
|
escapedTableNameMapObj: Record<string, string>;
|
|
35
34
|
}>(
|
|
36
35
|
`
|
|
37
|
-
SELECT jsonb_object_agg(
|
|
38
|
-
FROM unnest(ARRAY[\${keys:csv}]) as
|
|
36
|
+
SELECT jsonb_object_agg(table_name, quote_ident(table_name)) as "escapedTableNameMapObj"
|
|
37
|
+
FROM unnest(ARRAY[\${keys:csv}]) as table_name
|
|
39
38
|
`,
|
|
40
|
-
{ keys: uniqueColumnAndTableNames.concat("prevent_empty_array_error") }
|
|
39
|
+
{ keys: uniqueColumnAndTableNames.concat("prevent_empty_array_error") },
|
|
41
40
|
);
|
|
42
41
|
|
|
43
42
|
let triggerQueries: string[] = [];
|
|
@@ -55,7 +54,7 @@ export const getTableConfigSchemaQueries = async (
|
|
|
55
54
|
tableConf,
|
|
56
55
|
asName,
|
|
57
56
|
escapedTableNameMapObj,
|
|
58
|
-
db
|
|
57
|
+
db,
|
|
59
58
|
);
|
|
60
59
|
if (_tableQueries) {
|
|
61
60
|
tableQueries = [...tableQueries, ..._tableQueries.queries];
|
|
@@ -77,7 +76,6 @@ export const getTableConfigSchemaQueries = async (
|
|
|
77
76
|
|
|
78
77
|
return {
|
|
79
78
|
dropTableQueries,
|
|
80
|
-
fileTableSchemaQuery,
|
|
81
79
|
tableQueries,
|
|
82
80
|
constraintQueries,
|
|
83
81
|
indexQueries,
|
|
@@ -91,7 +89,7 @@ const getTableQueries = async (
|
|
|
91
89
|
tableConf: TableConfig[string],
|
|
92
90
|
asName: (v: string) => string,
|
|
93
91
|
escapedTableNameMapObj: Record<string, string>,
|
|
94
|
-
db: DB
|
|
92
|
+
db: DB,
|
|
95
93
|
) => {
|
|
96
94
|
if ("isLookupTable" in tableConf && Object.keys(tableConf.isLookupTable.values).length) {
|
|
97
95
|
const { isLookupTable } = tableConf;
|
|
@@ -100,7 +98,7 @@ const getTableQueries = async (
|
|
|
100
98
|
([id, otherColumns]) => ({
|
|
101
99
|
id,
|
|
102
100
|
...otherColumns,
|
|
103
|
-
})
|
|
101
|
+
}),
|
|
104
102
|
);
|
|
105
103
|
|
|
106
104
|
const allColumns = Object.keys(rows[0]!);
|
|
@@ -122,7 +120,7 @@ const getTableQueries = async (
|
|
|
122
120
|
return as.format(
|
|
123
121
|
`INSERT INTO ${tableName} (${allColumns.map((t) => asName(t)).join(", ")}) ` +
|
|
124
122
|
" VALUES (${values:csv}) ON CONFLICT DO NOTHING;",
|
|
125
|
-
{ values }
|
|
123
|
+
{ values },
|
|
126
124
|
);
|
|
127
125
|
});
|
|
128
126
|
const queries = [createQuery, ...dataQuerys];
|
|
@@ -169,7 +167,7 @@ const getConstraintQueries = (tableName: string, tableConf: TableConfig[string])
|
|
|
169
167
|
const getIndexQueries = (
|
|
170
168
|
tableName: string,
|
|
171
169
|
tableConf: TableConfig[string],
|
|
172
|
-
asName: (v: string) => string
|
|
170
|
+
asName: (v: string) => string,
|
|
173
171
|
) => {
|
|
174
172
|
if ("indexes" in tableConf && tableConf.indexes) {
|
|
175
173
|
/*
|
|
@@ -199,7 +197,7 @@ const getIndexQueries = (
|
|
|
199
197
|
return [`DROP INDEX IF EXISTS ${asName(indexName)};`, query];
|
|
200
198
|
}
|
|
201
199
|
return [query];
|
|
202
|
-
}
|
|
200
|
+
},
|
|
203
201
|
);
|
|
204
202
|
}
|
|
205
203
|
return [];
|
|
@@ -207,7 +205,7 @@ const getIndexQueries = (
|
|
|
207
205
|
const getTriggerQueries = (
|
|
208
206
|
tableName: string,
|
|
209
207
|
tableConfig: TableConfig[string],
|
|
210
|
-
asName: (v: string) => string
|
|
208
|
+
asName: (v: string) => string,
|
|
211
209
|
) => {
|
|
212
210
|
const { triggers } = tableConfig;
|
|
213
211
|
if (!triggers) return [];
|
|
@@ -4,7 +4,7 @@ import type { DB } from "../../initProstgles";
|
|
|
4
4
|
import { asValue } from "../../PubSubManager/PubSubManagerUtils";
|
|
5
5
|
import { executeSqlWithRollback } from "../getFutureTableSchema";
|
|
6
6
|
import { getPGIndexes } from "../getPGIndexes";
|
|
7
|
-
import type { TableConfig } from "../
|
|
7
|
+
import type { TableConfig } from "../TableConfigTypes";
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Keep Postgres indexes in sync with table configuration
|
|
@@ -5,15 +5,13 @@ import {
|
|
|
5
5
|
log,
|
|
6
6
|
} from "../PubSubManager/PubSubManagerUtils";
|
|
7
7
|
import type { OnReadyCallbackBasic } from "../initProstgles";
|
|
8
|
-
import type TableConfigurator from "./TableConfig";
|
|
9
|
-
import { getConstraintDefinitionQueries } from "./getConstraintDefinitionQueries";
|
|
10
8
|
import { fetchTableConstraints } from "./fetchTableConstraints";
|
|
9
|
+
import { getConstraintDefinitionQueries } from "./getConstraintDefinitionQueries";
|
|
11
10
|
import { getFutureTableSchema } from "./getFutureTableSchema";
|
|
12
|
-
import { getPGIndexes } from "./getPGIndexes";
|
|
13
11
|
import { getTableColumnQueries } from "./getTableColumnQueries";
|
|
14
|
-
import { runMigrations } from "./runMigrations";
|
|
15
|
-
import { md5 } from "prostgles-types/dist/md5";
|
|
16
12
|
import { getIndexesQueries } from "./indexes/getIndexesQueries";
|
|
13
|
+
import { runMigrations } from "./runMigrations";
|
|
14
|
+
import type { TableConfigurator } from "./TableConfigurator";
|
|
17
15
|
|
|
18
16
|
export const initTableConfig = async function (this: TableConfigurator) {
|
|
19
17
|
this.initialising = true;
|
|
@@ -86,8 +84,9 @@ export const initTableConfig = async function (this: TableConfigurator) {
|
|
|
86
84
|
const MAX_IDENTIFIER_LENGTH = +(
|
|
87
85
|
await this.db.one<{ max_identifier_length: number }>("SHOW max_identifier_length;")
|
|
88
86
|
).max_identifier_length;
|
|
89
|
-
if (!Number.isFinite(MAX_IDENTIFIER_LENGTH))
|
|
87
|
+
if (!Number.isFinite(MAX_IDENTIFIER_LENGTH)) {
|
|
90
88
|
throw `Could not obtain a valid max_identifier_length`;
|
|
89
|
+
}
|
|
91
90
|
const asName = (v: string) => {
|
|
92
91
|
if (v.length > MAX_IDENTIFIER_LENGTH) {
|
|
93
92
|
throw `The identifier name provided (${v}) is longer than the allowed limit (max_identifier_length = ${MAX_IDENTIFIER_LENGTH} characters )\n Longest allowed: ${_asName(v.slice(0, MAX_IDENTIFIER_LENGTH))} `;
|
|
@@ -351,4 +350,6 @@ export const initTableConfig = async function (this: TableConfigurator) {
|
|
|
351
350
|
|
|
352
351
|
await this.prostgles.refreshDBO();
|
|
353
352
|
await this.setTableOnMounts();
|
|
353
|
+
/** Needed in case some onMounts change schema */
|
|
354
|
+
await this.prostgles.refreshDBO();
|
|
354
355
|
};
|
|
@@ -42,7 +42,13 @@ export async function getClientSchema(
|
|
|
42
42
|
const tablesWithSelectRules = new Set(
|
|
43
43
|
fullSchema?.tables.filter((t) => t.publishInfo.select).map((t) => t.name) ?? [],
|
|
44
44
|
);
|
|
45
|
-
const { tables = []
|
|
45
|
+
const { tables: rawTables = [] } = fullSchema ?? {};
|
|
46
|
+
const { tableSchemaErrors = {} } = fullSchema ?? {};
|
|
47
|
+
const { modifyClientSchema } = this.opts;
|
|
48
|
+
const tables =
|
|
49
|
+
modifyClientSchema ?
|
|
50
|
+
await Promise.all(rawTables.map(async (t) => modifyClientSchema(t, userData)))
|
|
51
|
+
: rawTables;
|
|
46
52
|
const joinTables2: string[][] = [];
|
|
47
53
|
if (this.opts.joins) {
|
|
48
54
|
const _joinTables2 = this.dboBuilder
|
package/lib/index.ts
CHANGED
|
@@ -16,9 +16,10 @@ export * from "./Auth/AuthTypes";
|
|
|
16
16
|
export type { PublishParams } from "./PublishParser/publishTypesAndUtils";
|
|
17
17
|
export type { DBOFullyTyped } from "./DBSchemaBuilder/DBSchemaBuilder";
|
|
18
18
|
export type { DBHandlerServer } from "./Prostgles";
|
|
19
|
-
export type { CloudClient, LocalConfig } from "./FileManager/FileManager";
|
|
19
|
+
export type { StorageClient as CloudClient, LocalConfig } from "./FileManager/FileManager";
|
|
20
|
+
export * from "./FileManager/getLocalStorageClient";
|
|
20
21
|
export type { DB } from "./initProstgles";
|
|
21
|
-
export type * from "./TableConfig/
|
|
22
|
+
export type * from "./TableConfig/TableConfigTypes";
|
|
22
23
|
export * from "./Auth/utils/upsertNamedExpressMiddleware";
|
|
23
24
|
export type { RequestWithUser } from "./Auth/middleware/userContextMiddleware";
|
|
24
25
|
export default prostgles;
|
package/lib/initProstgles.ts
CHANGED
|
@@ -193,7 +193,7 @@ export const initProstgles = async function (
|
|
|
193
193
|
await runSQLFile(this);
|
|
194
194
|
await this.refreshDBO();
|
|
195
195
|
await this.initTableConfig(reason);
|
|
196
|
-
await this.
|
|
196
|
+
await this.refreshDBO();
|
|
197
197
|
this.initRestApi();
|
|
198
198
|
|
|
199
199
|
this.schemaWatch = await SchemaWatch.create(this.dboBuilder);
|
|
@@ -274,7 +274,6 @@ export const initProstgles = async function (
|
|
|
274
274
|
this.opts.io.engine.close();
|
|
275
275
|
}
|
|
276
276
|
}
|
|
277
|
-
this.fileManager?.destroy();
|
|
278
277
|
await this.dboBuilder.destroy();
|
|
279
278
|
this.authHandler.destroy();
|
|
280
279
|
await this.tableConfigurator?.destroy();
|
package/lib/runClientRequest.ts
CHANGED
|
@@ -24,9 +24,6 @@ export const updateConfiguration = async <DBSchema, UserSchema extends SessionUs
|
|
|
24
24
|
return;
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
if (includes(optionsThatChanged, "fileTable")) {
|
|
28
|
-
await prgl.initFileTable();
|
|
29
|
-
}
|
|
30
27
|
if (includes(optionsThatChanged, "restApi")) {
|
|
31
28
|
prgl.initRestApi();
|
|
32
29
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prostgles-server",
|
|
3
|
-
"version": "4.2.
|
|
3
|
+
"version": "4.2.570",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"pg": "^8.21.0",
|
|
58
58
|
"pg-cursor": "^2.21.0",
|
|
59
59
|
"pg-promise": "^12.7.0",
|
|
60
|
-
"prostgles-types": "^4.0.
|
|
60
|
+
"prostgles-types": "^4.0.273"
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
63
|
"@eslint/js": "^9.22.0",
|
|
@@ -69,7 +69,6 @@
|
|
|
69
69
|
"@types/pg-cursor": "^2.7.2",
|
|
70
70
|
"@types/sharp": "^0.30.5",
|
|
71
71
|
"eslint": "^9.39.5",
|
|
72
|
-
"eslint-plugin-security": "^3.0.1",
|
|
73
72
|
"prettier": "^3.9.5",
|
|
74
73
|
"socket.io": "^4.8.3",
|
|
75
74
|
"typescript": "^5.9.3",
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { Prostgles } from "../Prostgles";
|
|
2
|
-
import type { SchemaRelatedOptions } from "../TableConfig/getCreateSchemaQueries";
|
|
3
|
-
import type { FileManager } from "./FileManager";
|
|
4
|
-
export declare const getFileManagerSchema: ({ fileTable, tableConfig, }: Pick<SchemaRelatedOptions, "fileTable" | "tableConfig">) => {
|
|
5
|
-
fileTable: import("../ProstglesTypes").FileTableConfig;
|
|
6
|
-
fileTableName: string;
|
|
7
|
-
fileTableQuery: string;
|
|
8
|
-
referencedTables: {
|
|
9
|
-
[tableName: string]: {
|
|
10
|
-
type: "column";
|
|
11
|
-
referenceColumns: Record<string, import("prostgles-types").FileColumnConfig>;
|
|
12
|
-
};
|
|
13
|
-
};
|
|
14
|
-
referencedTablesQueries: string[];
|
|
15
|
-
queries: string[];
|
|
16
|
-
} | undefined;
|
|
17
|
-
export declare function initFileManager(this: FileManager, prg: Prostgles): Promise<void>;
|
|
18
|
-
//# sourceMappingURL=initFileManager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"initFileManager.d.ts","sourceRoot":"","sources":["../../lib/FileManager/initFileManager.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAElF,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,eAAe,CAAC;AAI9D,eAAO,MAAM,oBAAoB,GAAI,6BAGlC,IAAI,CAAC,oBAAoB,EAAE,WAAW,GAAG,aAAa,CAAC;;;;;;;;;;;;aAsDzD,CAAC;AAEF,wBAAsB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,SAAS,iBAqLtE"}
|
|
@@ -1,257 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.getFileManagerSchema = void 0;
|
|
37
|
-
exports.initFileManager = initFileManager;
|
|
38
|
-
const fs = __importStar(require("fs"));
|
|
39
|
-
const prostgles_types_1 = require("prostgles-types");
|
|
40
|
-
const AuthHandler_1 = require("../Auth/AuthHandler");
|
|
41
|
-
const runSQL_1 = require("../DboBuilder/runSql/runSQL");
|
|
42
|
-
const runClientRequest_1 = require("../runClientRequest");
|
|
43
|
-
const FileManager_1 = require("./FileManager");
|
|
44
|
-
const path_1 = require("path");
|
|
45
|
-
const getFileManagerSchema = ({ fileTable, tableConfig, }) => {
|
|
46
|
-
if (!fileTable) {
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
const { tableName: fileTableName = "files", referencedTables = {} } = fileTable;
|
|
50
|
-
if (tableConfig?.[fileTableName]) {
|
|
51
|
-
throw new Error(`FileManager table name (${fileTableName}) is reserved. Please use a different name in tableConfig`);
|
|
52
|
-
}
|
|
53
|
-
const fileTableQuery = `
|
|
54
|
-
CREATE EXTENSION IF NOT EXISTS pgcrypto;
|
|
55
|
-
CREATE TABLE IF NOT EXISTS ${(0, prostgles_types_1.asName)(fileTableName)} (
|
|
56
|
-
name TEXT NOT NULL,
|
|
57
|
-
extension TEXT NOT NULL,
|
|
58
|
-
content_type TEXT NOT NULL,
|
|
59
|
-
content_length BIGINT NOT NULL DEFAULT 0,
|
|
60
|
-
added TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
61
|
-
url TEXT NOT NULL,
|
|
62
|
-
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
63
|
-
original_name TEXT NOT NULL,
|
|
64
|
-
description TEXT,
|
|
65
|
-
cloud_url TEXT,
|
|
66
|
-
signed_url TEXT,
|
|
67
|
-
signed_url_expires BIGINT,
|
|
68
|
-
etag TEXT,
|
|
69
|
-
deleted BIGINT,
|
|
70
|
-
deleted_from_storage BIGINT,
|
|
71
|
-
UNIQUE(id),
|
|
72
|
-
UNIQUE(name)
|
|
73
|
-
);`;
|
|
74
|
-
const referencedTablesQueries = Object.entries(referencedTables)
|
|
75
|
-
.flatMap(([refTable, refTableConfig]) => {
|
|
76
|
-
return Object.entries(refTableConfig.referenceColumns).map(([colName]) => {
|
|
77
|
-
const tConf = tableConfig?.[refTable];
|
|
78
|
-
const columnConfig = tConf && "columns" in tConf && tConf.columns?.[colName];
|
|
79
|
-
/** This is a bit hacky. TODO: setup file columns only in tableConfig */
|
|
80
|
-
if (columnConfig) {
|
|
81
|
-
return `ALTER TABLE ${(0, prostgles_types_1.asName)(refTable)} ADD FOREIGN KEY (${(0, prostgles_types_1.asName)(colName)}) REFERENCES ${(0, prostgles_types_1.asName)(fileTableName)} (id) ;`;
|
|
82
|
-
}
|
|
83
|
-
return `ALTER TABLE ${(0, prostgles_types_1.asName)(refTable)} ADD COLUMN ${(0, prostgles_types_1.asName)(colName)} UUID REFERENCES ${(0, prostgles_types_1.asName)(fileTableName)} (id);`;
|
|
84
|
-
});
|
|
85
|
-
})
|
|
86
|
-
.sort();
|
|
87
|
-
return {
|
|
88
|
-
fileTable,
|
|
89
|
-
fileTableName,
|
|
90
|
-
fileTableQuery,
|
|
91
|
-
referencedTables,
|
|
92
|
-
referencedTablesQueries,
|
|
93
|
-
queries: [fileTableQuery, ...referencedTablesQueries],
|
|
94
|
-
};
|
|
95
|
-
};
|
|
96
|
-
exports.getFileManagerSchema = getFileManagerSchema;
|
|
97
|
-
async function initFileManager(prg) {
|
|
98
|
-
this.prostgles = prg;
|
|
99
|
-
const schema = (0, exports.getFileManagerSchema)({
|
|
100
|
-
fileTable: prg.opts.fileTable,
|
|
101
|
-
tableConfig: prg.opts.tableConfig,
|
|
102
|
-
});
|
|
103
|
-
if (!schema)
|
|
104
|
-
throw "No fileTable config found in prostgles options";
|
|
105
|
-
const { fileTable, fileTableQuery, referencedTables, fileTableName } = schema;
|
|
106
|
-
this.tableName = fileTableName;
|
|
107
|
-
const maxBfSizeMB = (prg.opts.io?.engine.opts.maxHttpBufferSize || 1e6) / 1e6;
|
|
108
|
-
console.log(`Prostgles: Initiated file manager. Max allowed file size: ${maxBfSizeMB}MB (maxHttpBufferSize = 1e6). To increase this set maxHttpBufferSize in socket.io server init options`);
|
|
109
|
-
const canCreate = await (0, runSQL_1.canCreateTables)(this.db);
|
|
110
|
-
const runQuery = async (q, debugInfo) => {
|
|
111
|
-
const res = await (0, prostgles_types_1.tryCatchV2)(async () => {
|
|
112
|
-
if (!canCreate)
|
|
113
|
-
throw "File table creation failed. Your postgres user does not have CREATE table privileges";
|
|
114
|
-
await this.db.any(q);
|
|
115
|
-
});
|
|
116
|
-
await this.prostgles?.opts.onLog?.({
|
|
117
|
-
type: "debug",
|
|
118
|
-
command: "initFileManager.runQuery",
|
|
119
|
-
...res,
|
|
120
|
-
data: { debugInfo },
|
|
121
|
-
});
|
|
122
|
-
if (res.hasError) {
|
|
123
|
-
throw res.error;
|
|
124
|
-
}
|
|
125
|
-
};
|
|
126
|
-
/**
|
|
127
|
-
* 1. Create media table
|
|
128
|
-
*/
|
|
129
|
-
if (!this.dbo[fileTableName]) {
|
|
130
|
-
await runQuery(fileTableQuery, `Create fileTable ${(0, prostgles_types_1.asName)(fileTableName)}`);
|
|
131
|
-
await prg.refreshDBO();
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* 2. Create media lookup tables
|
|
135
|
-
*/
|
|
136
|
-
for (const [refTable, tableConfig] of Object.entries(referencedTables)) {
|
|
137
|
-
if (!this.dbo[refTable]) {
|
|
138
|
-
throw `Referenced table (${refTable}) from fileTable.referencedTables prostgles init config does not exist`;
|
|
139
|
-
}
|
|
140
|
-
const cols = await (this.dbo[refTable]).getColumns();
|
|
141
|
-
for (const [colName] of Object.entries(tableConfig.referenceColumns)) {
|
|
142
|
-
const existingCol = cols.find((c) => c.name === colName);
|
|
143
|
-
if (existingCol) {
|
|
144
|
-
if (existingCol.references?.some(({ ftable }) => ftable === fileTableName)) {
|
|
145
|
-
// All ok
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
if (existingCol.udt_name === "uuid") {
|
|
149
|
-
try {
|
|
150
|
-
const query = `ALTER TABLE ${(0, prostgles_types_1.asName)(refTable)} ADD FOREIGN KEY (${(0, prostgles_types_1.asName)(colName)}) REFERENCES ${(0, prostgles_types_1.asName)(fileTableName)} (id) ;`;
|
|
151
|
-
const msg = `Referenced file column ${refTable} (${colName}) exists but is not referencing file table. Add REFERENCE constraint...\n${query}`;
|
|
152
|
-
await runQuery(query, msg);
|
|
153
|
-
}
|
|
154
|
-
catch (e) {
|
|
155
|
-
console.error(`Could not add constraing. Err: ${e instanceof Error ? e.message : JSON.stringify(e)}`);
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
console.error(`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)`);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
else {
|
|
164
|
-
const query = `ALTER TABLE ${(0, prostgles_types_1.asName)(refTable)} ADD COLUMN ${(0, prostgles_types_1.asName)(colName)} UUID REFERENCES ${(0, prostgles_types_1.asName)(fileTableName)} (id);`;
|
|
165
|
-
// const createColumn = async () => {
|
|
166
|
-
// try {
|
|
167
|
-
// const msg = `Create referenced file column ${refTable} (${colName})...\n${query}`;
|
|
168
|
-
// await runQuery(query, msg);
|
|
169
|
-
// } catch(e){
|
|
170
|
-
// console.error(`FAILED. Err: ${e instanceof Error? e.message : JSON.stringify(e)}`)
|
|
171
|
-
// }
|
|
172
|
-
// }
|
|
173
|
-
// await createColumn();
|
|
174
|
-
console.error(`Referenced file column ${refTable} (${colName}) does not exist. Create it using this query:\n${query}`);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
await prg.refreshDBO();
|
|
178
|
-
}
|
|
179
|
-
/**
|
|
180
|
-
* 4. Serve media through express
|
|
181
|
-
*/
|
|
182
|
-
const { fileServePath: fileServeRoute = `/${fileTableName}`, expressApp: app } = fileTable;
|
|
183
|
-
if (fileServeRoute.endsWith("/")) {
|
|
184
|
-
throw `fileServeRoute must not end with a '/'`;
|
|
185
|
-
}
|
|
186
|
-
this.path = fileServeRoute;
|
|
187
|
-
app.get(this.fileRouteExpress, async (req, res) => {
|
|
188
|
-
const mediaTableHandler = this.dbo[fileTableName];
|
|
189
|
-
if (!mediaTableHandler) {
|
|
190
|
-
res
|
|
191
|
-
.status(AuthHandler_1.HTTP_FAIL_CODES.INTERNAL_SERVER_ERROR)
|
|
192
|
-
.json(`Internal error: media table (${fileTableName}) not valid or not allowed`);
|
|
193
|
-
return false;
|
|
194
|
-
}
|
|
195
|
-
try {
|
|
196
|
-
const { name } = req.params;
|
|
197
|
-
if (typeof name !== "string" || !name) {
|
|
198
|
-
throw "Invalid media name";
|
|
199
|
-
}
|
|
200
|
-
if (!this.prostgles) {
|
|
201
|
-
throw "Prostgles instance missing";
|
|
202
|
-
}
|
|
203
|
-
const id = name.slice(0, 36);
|
|
204
|
-
const selectParams = {
|
|
205
|
-
select: {
|
|
206
|
-
id: 1,
|
|
207
|
-
name: 1,
|
|
208
|
-
signed_url: 1,
|
|
209
|
-
signed_url_expires: 1,
|
|
210
|
-
content_type: 1,
|
|
211
|
-
},
|
|
212
|
-
};
|
|
213
|
-
const media = (await runClientRequest_1.runClientRequest.bind(this.prostgles)({
|
|
214
|
-
command: "findOne",
|
|
215
|
-
tableName: fileTableName,
|
|
216
|
-
param1: { id },
|
|
217
|
-
param2: selectParams,
|
|
218
|
-
param3: undefined,
|
|
219
|
-
}, {
|
|
220
|
-
res,
|
|
221
|
-
httpReq: req,
|
|
222
|
-
}, undefined));
|
|
223
|
-
if (!media) {
|
|
224
|
-
res.status(AuthHandler_1.HTTP_FAIL_CODES.NOT_FOUND).send("File not found or not allowed");
|
|
225
|
-
return;
|
|
226
|
-
}
|
|
227
|
-
if (this.cloudClient) {
|
|
228
|
-
let url = media.signed_url;
|
|
229
|
-
const expires = +(media.signed_url_expires || 0);
|
|
230
|
-
const EXPIRES = Date.now() + FileManager_1.HOUR;
|
|
231
|
-
if (!url || expires < EXPIRES) {
|
|
232
|
-
url = await this.getFileCloudDownloadURL(media.name, 60 * 60);
|
|
233
|
-
await this.db.any("UPDATE ${fileTableName:name} SET signed_url = ${signed_url}, signed_url_expires = ${signed_url_expires} WHERE id = ${id}", {
|
|
234
|
-
fileTableName,
|
|
235
|
-
id: media.id,
|
|
236
|
-
signed_url: url,
|
|
237
|
-
signed_url_expires: EXPIRES,
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
|
-
res.redirect(url);
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
const localFilePath = (0, path_1.join)(this.config.localFolderPath, media.name);
|
|
244
|
-
if (!fs.existsSync(localFilePath)) {
|
|
245
|
-
throw new Error("File not found");
|
|
246
|
-
}
|
|
247
|
-
res.contentType(media.content_type);
|
|
248
|
-
res.sendFile(localFilePath);
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
catch (e) {
|
|
252
|
-
console.log(e);
|
|
253
|
-
res.status(AuthHandler_1.HTTP_FAIL_CODES.BAD_REQUEST).send("Invalid/disallowed file");
|
|
254
|
-
}
|
|
255
|
-
});
|
|
256
|
-
}
|
|
257
|
-
//# sourceMappingURL=initFileManager.js.map
|