prostgles-server 4.2.183 → 4.2.185
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/.github/workflows/main.yml +15 -15
- package/.prettierignore +2 -0
- package/README.md +1 -1
- package/dist/Auth/AuthHandler.d.ts +1 -1
- package/dist/Auth/AuthHandler.d.ts.map +1 -1
- package/dist/Auth/AuthHandler.js +64 -32
- package/dist/Auth/AuthHandler.js.map +1 -1
- package/dist/Auth/AuthTypes.d.ts +15 -1
- package/dist/Auth/AuthTypes.d.ts.map +1 -1
- package/dist/Auth/getSafeReturnURL.d.ts.map +1 -1
- package/dist/Auth/getSafeReturnURL.js.map +1 -1
- package/dist/Auth/sendEmail.d.ts.map +1 -1
- package/dist/Auth/sendEmail.js +6 -6
- package/dist/Auth/sendEmail.js.map +1 -1
- package/dist/Auth/setAuthProviders.d.ts +1 -1
- package/dist/Auth/setAuthProviders.d.ts.map +1 -1
- package/dist/Auth/setAuthProviders.js +15 -8
- package/dist/Auth/setAuthProviders.js.map +1 -1
- package/dist/Auth/setEmailProvider.d.ts.map +1 -1
- package/dist/Auth/setEmailProvider.js +23 -4
- package/dist/Auth/setEmailProvider.js.map +1 -1
- package/dist/Auth/setupAuthRoutes.d.ts.map +1 -1
- package/dist/Auth/setupAuthRoutes.js +27 -9
- package/dist/Auth/setupAuthRoutes.js.map +1 -1
- package/dist/DBEventsManager.d.ts.map +1 -1
- package/dist/DBEventsManager.js +24 -19
- package/dist/DBEventsManager.js.map +1 -1
- package/dist/DBSchemaBuilder.d.ts.map +1 -1
- package/dist/DBSchemaBuilder.js +18 -5
- package/dist/DBSchemaBuilder.js.map +1 -1
- package/dist/DboBuilder/DboBuilder.d.ts.map +1 -1
- package/dist/DboBuilder/DboBuilder.js +7 -2
- package/dist/DboBuilder/DboBuilder.js.map +1 -1
- package/dist/DboBuilder/DboBuilderTypes.d.ts +4 -4
- package/dist/DboBuilder/DboBuilderTypes.d.ts.map +1 -1
- package/dist/DboBuilder/DboBuilderTypes.js.map +1 -1
- package/dist/DboBuilder/QueryBuilder/Functions.d.ts +2 -2
- package/dist/DboBuilder/QueryBuilder/Functions.d.ts.map +1 -1
- package/dist/DboBuilder/QueryBuilder/Functions.js +293 -173
- package/dist/DboBuilder/QueryBuilder/Functions.js.map +1 -1
- package/dist/DboBuilder/QueryBuilder/QueryBuilder.d.ts +2 -2
- package/dist/DboBuilder/QueryBuilder/QueryBuilder.d.ts.map +1 -1
- package/dist/DboBuilder/QueryBuilder/QueryBuilder.js +52 -29
- package/dist/DboBuilder/QueryBuilder/QueryBuilder.js.map +1 -1
- package/dist/DboBuilder/QueryBuilder/getJoinQuery.d.ts.map +1 -1
- package/dist/DboBuilder/QueryBuilder/getJoinQuery.js +51 -32
- package/dist/DboBuilder/QueryBuilder/getJoinQuery.js.map +1 -1
- package/dist/DboBuilder/QueryBuilder/getNewQuery.d.ts.map +1 -1
- package/dist/DboBuilder/QueryBuilder/getNewQuery.js +48 -25
- package/dist/DboBuilder/QueryBuilder/getNewQuery.js.map +1 -1
- package/dist/DboBuilder/QueryBuilder/getSelectQuery.d.ts +1 -1
- package/dist/DboBuilder/QueryBuilder/getSelectQuery.d.ts.map +1 -1
- package/dist/DboBuilder/QueryBuilder/getSelectQuery.js +32 -23
- package/dist/DboBuilder/QueryBuilder/getSelectQuery.js.map +1 -1
- package/dist/DboBuilder/QueryStreamer.d.ts +2 -2
- package/dist/DboBuilder/QueryStreamer.d.ts.map +1 -1
- package/dist/DboBuilder/QueryStreamer.js +68 -23
- package/dist/DboBuilder/QueryStreamer.js.map +1 -1
- package/dist/DboBuilder/TableHandler/DataValidator.d.ts +1 -1
- package/dist/DboBuilder/TableHandler/DataValidator.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/DataValidator.js +79 -43
- package/dist/DboBuilder/TableHandler/DataValidator.js.map +1 -1
- package/dist/DboBuilder/TableHandler/TableHandler.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/TableHandler.js +39 -15
- 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 +44 -13
- package/dist/DboBuilder/TableHandler/delete.js.map +1 -1
- package/dist/DboBuilder/TableHandler/insert.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/insert.js +81 -22
- package/dist/DboBuilder/TableHandler/insert.js.map +1 -1
- package/dist/DboBuilder/TableHandler/insertTest.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/insertTest.js.map +1 -1
- package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.d.ts +1 -1
- package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.js +7 -4
- package/dist/DboBuilder/TableHandler/onDeleteFromFileTable.js.map +1 -1
- package/dist/DboBuilder/TableHandler/runInsertUpdateQuery.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/runInsertUpdateQuery.js +24 -5
- package/dist/DboBuilder/TableHandler/runInsertUpdateQuery.js.map +1 -1
- package/dist/DboBuilder/TableHandler/update.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/update.js +16 -4
- package/dist/DboBuilder/TableHandler/update.js.map +1 -1
- package/dist/DboBuilder/TableHandler/updateBatch.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/updateBatch.js +33 -10
- package/dist/DboBuilder/TableHandler/updateBatch.js.map +1 -1
- package/dist/DboBuilder/TableHandler/updateFile.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/updateFile.js +24 -6
- package/dist/DboBuilder/TableHandler/updateFile.js.map +1 -1
- package/dist/DboBuilder/TableHandler/upsert.d.ts.map +1 -1
- package/dist/DboBuilder/TableHandler/upsert.js +22 -6
- package/dist/DboBuilder/TableHandler/upsert.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/ViewHandler.d.ts +5 -5
- package/dist/DboBuilder/ViewHandler/ViewHandler.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/ViewHandler.js +64 -36
- package/dist/DboBuilder/ViewHandler/ViewHandler.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/count.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/count.js +21 -7
- package/dist/DboBuilder/ViewHandler/count.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/find.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/find.js +76 -22
- package/dist/DboBuilder/ViewHandler/find.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/getExistsCondition.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/getExistsCondition.js +19 -10
- package/dist/DboBuilder/ViewHandler/getExistsCondition.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/getExistsFilters.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/getExistsFilters.js +12 -5
- package/dist/DboBuilder/ViewHandler/getExistsFilters.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/getInfo.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/getInfo.js +27 -9
- package/dist/DboBuilder/ViewHandler/getInfo.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/getTableJoinQuery.d.ts +2 -2
- package/dist/DboBuilder/ViewHandler/getTableJoinQuery.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/getTableJoinQuery.js +42 -23
- package/dist/DboBuilder/ViewHandler/getTableJoinQuery.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/parseComplexFilter.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/parseComplexFilter.js +22 -9
- package/dist/DboBuilder/ViewHandler/parseComplexFilter.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/parseFieldFilter.d.ts +4 -4
- package/dist/DboBuilder/ViewHandler/parseFieldFilter.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/parseFieldFilter.js +13 -11
- package/dist/DboBuilder/ViewHandler/parseFieldFilter.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/parseJoinPath.d.ts +1 -1
- package/dist/DboBuilder/ViewHandler/parseJoinPath.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/parseJoinPath.js +44 -29
- package/dist/DboBuilder/ViewHandler/parseJoinPath.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/prepareSortItems.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/prepareSortItems.js +36 -27
- package/dist/DboBuilder/ViewHandler/prepareSortItems.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/prepareWhere.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/prepareWhere.js +16 -12
- package/dist/DboBuilder/ViewHandler/prepareWhere.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/size.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/size.js +24 -7
- package/dist/DboBuilder/ViewHandler/size.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/subscribe.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/subscribe.js +40 -12
- package/dist/DboBuilder/ViewHandler/subscribe.js.map +1 -1
- package/dist/DboBuilder/ViewHandler/validateViewRules.d.ts.map +1 -1
- package/dist/DboBuilder/ViewHandler/validateViewRules.js +20 -5
- package/dist/DboBuilder/ViewHandler/validateViewRules.js.map +1 -1
- package/dist/DboBuilder/dboBuilderUtils.d.ts.map +1 -1
- package/dist/DboBuilder/dboBuilderUtils.js +18 -7
- package/dist/DboBuilder/dboBuilderUtils.js.map +1 -1
- package/dist/DboBuilder/getColumns.d.ts.map +1 -1
- package/dist/DboBuilder/getColumns.js +22 -7
- package/dist/DboBuilder/getColumns.js.map +1 -1
- package/dist/DboBuilder/getCondition.d.ts.map +1 -1
- package/dist/DboBuilder/getCondition.js +43 -30
- package/dist/DboBuilder/getCondition.js.map +1 -1
- package/dist/DboBuilder/getSubscribeRelatedTables.d.ts.map +1 -1
- package/dist/DboBuilder/getSubscribeRelatedTables.js +38 -27
- package/dist/DboBuilder/getSubscribeRelatedTables.js.map +1 -1
- package/dist/DboBuilder/getTablesForSchemaPostgresSQL.d.ts.map +1 -1
- package/dist/DboBuilder/getTablesForSchemaPostgresSQL.js +9 -9
- package/dist/DboBuilder/getTablesForSchemaPostgresSQL.js.map +1 -1
- package/dist/DboBuilder/insertNestedRecords.d.ts +3 -3
- package/dist/DboBuilder/insertNestedRecords.d.ts.map +1 -1
- package/dist/DboBuilder/insertNestedRecords.js +79 -44
- package/dist/DboBuilder/insertNestedRecords.js.map +1 -1
- package/dist/DboBuilder/parseUpdateRules.d.ts.map +1 -1
- package/dist/DboBuilder/parseUpdateRules.js +38 -14
- package/dist/DboBuilder/parseUpdateRules.js.map +1 -1
- package/dist/DboBuilder/prepareShortestJoinPaths.d.ts.map +1 -1
- package/dist/DboBuilder/prepareShortestJoinPaths.js +56 -31
- package/dist/DboBuilder/prepareShortestJoinPaths.js.map +1 -1
- package/dist/DboBuilder/runSQL.d.ts.map +1 -1
- package/dist/DboBuilder/runSQL.js +41 -21
- package/dist/DboBuilder/runSQL.js.map +1 -1
- package/dist/DboBuilder/runTransaction.d.ts +1 -1
- package/dist/DboBuilder/runTransaction.d.ts.map +1 -1
- package/dist/DboBuilder/runTransaction.js +2 -2
- package/dist/DboBuilder/runTransaction.js.map +1 -1
- package/dist/DboBuilder/sqlErrCodeToMsg.d.ts.map +1 -1
- package/dist/DboBuilder/sqlErrCodeToMsg.js +297 -38
- package/dist/DboBuilder/sqlErrCodeToMsg.js.map +1 -1
- package/dist/DboBuilder/uploadFile.d.ts.map +1 -1
- package/dist/DboBuilder/uploadFile.js +33 -9
- package/dist/DboBuilder/uploadFile.js.map +1 -1
- package/dist/Event_Trigger_Tags.d.ts +1 -1
- package/dist/Event_Trigger_Tags.d.ts.map +1 -1
- package/dist/Event_Trigger_Tags.js +1 -1
- package/dist/Event_Trigger_Tags.js.map +1 -1
- package/dist/FileManager/FileManager.d.ts.map +1 -1
- package/dist/FileManager/FileManager.js +6 -3
- package/dist/FileManager/FileManager.js.map +1 -1
- package/dist/FileManager/getValidatedFileType.d.ts.map +1 -1
- package/dist/FileManager/getValidatedFileType.js +18 -16
- package/dist/FileManager/getValidatedFileType.js.map +1 -1
- package/dist/FileManager/initFileManager.d.ts.map +1 -1
- package/dist/FileManager/initFileManager.js +7 -1
- package/dist/FileManager/initFileManager.js.map +1 -1
- package/dist/FileManager/upload.d.ts +1 -1
- package/dist/FileManager/upload.d.ts.map +1 -1
- package/dist/FileManager/upload.js +3 -3
- package/dist/FileManager/upload.js.map +1 -1
- package/dist/FileManager/uploadStream.d.ts +1 -1
- package/dist/FileManager/uploadStream.d.ts.map +1 -1
- package/dist/FileManager/uploadStream.js +6 -7
- package/dist/FileManager/uploadStream.js.map +1 -1
- package/dist/Filtering.d.ts +3 -3
- package/dist/Filtering.d.ts.map +1 -1
- package/dist/Filtering.js +70 -37
- package/dist/Filtering.js.map +1 -1
- package/dist/JSONBValidation/validate_jsonb_schema_sql.d.ts.map +1 -1
- package/dist/JSONBValidation/validate_jsonb_schema_sql.js +1 -4
- package/dist/JSONBValidation/validate_jsonb_schema_sql.js.map +1 -1
- package/dist/JSONBValidation/validation.d.ts.map +1 -1
- package/dist/JSONBValidation/validation.js +46 -24
- package/dist/JSONBValidation/validation.js.map +1 -1
- package/dist/Logging.d.ts +2 -2
- package/dist/Logging.d.ts.map +1 -1
- package/dist/PostgresNotifListenManager.d.ts.map +1 -1
- package/dist/PostgresNotifListenManager.js +20 -22
- package/dist/PostgresNotifListenManager.js.map +1 -1
- package/dist/Prostgles.d.ts +1 -1
- package/dist/Prostgles.d.ts.map +1 -1
- package/dist/Prostgles.js +37 -11
- package/dist/Prostgles.js.map +1 -1
- package/dist/ProstglesTypes.d.ts.map +1 -1
- package/dist/ProstglesTypes.js +6 -1
- package/dist/ProstglesTypes.js.map +1 -1
- package/dist/PubSubManager/PubSubManager.d.ts.map +1 -1
- package/dist/PubSubManager/PubSubManager.js +10 -5
- package/dist/PubSubManager/PubSubManager.js.map +1 -1
- package/dist/PubSubManager/addSub.d.ts.map +1 -1
- package/dist/PubSubManager/addSub.js +4 -6
- package/dist/PubSubManager/addSub.js.map +1 -1
- package/dist/PubSubManager/addSync.d.ts.map +1 -1
- package/dist/PubSubManager/addSync.js +10 -6
- package/dist/PubSubManager/addSync.js.map +1 -1
- package/dist/PubSubManager/getCreatePubSubManagerError.d.ts.map +1 -1
- package/dist/PubSubManager/getCreatePubSubManagerError.js +3 -1
- package/dist/PubSubManager/getCreatePubSubManagerError.js.map +1 -1
- package/dist/PubSubManager/getPubSubManagerInitQuery.d.ts.map +1 -1
- package/dist/PubSubManager/getPubSubManagerInitQuery.js +8 -8
- package/dist/PubSubManager/getPubSubManagerInitQuery.js.map +1 -1
- package/dist/PubSubManager/initPubSubManager.d.ts.map +1 -1
- package/dist/PubSubManager/initPubSubManager.js +7 -9
- package/dist/PubSubManager/initPubSubManager.js.map +1 -1
- package/dist/PubSubManager/notifListener.d.ts.map +1 -1
- package/dist/PubSubManager/notifListener.js +23 -12
- package/dist/PubSubManager/notifListener.js.map +1 -1
- package/dist/PubSubManager/orphanTriggerCheck.d.ts.map +1 -1
- package/dist/PubSubManager/orphanTriggerCheck.js.map +1 -1
- package/dist/PubSubManager/pushSubData.d.ts.map +1 -1
- package/dist/PubSubManager/pushSubData.js +1 -1
- package/dist/PubSubManager/pushSubData.js.map +1 -1
- package/dist/PublishParser/PublishParser.d.ts +1 -1
- package/dist/PublishParser/PublishParser.d.ts.map +1 -1
- package/dist/PublishParser/PublishParser.js +25 -14
- package/dist/PublishParser/PublishParser.js.map +1 -1
- package/dist/PublishParser/getFileTableRules.d.ts.map +1 -1
- package/dist/PublishParser/getFileTableRules.js +23 -16
- package/dist/PublishParser/getFileTableRules.js.map +1 -1
- package/dist/PublishParser/getSchemaFromPublish.d.ts.map +1 -1
- package/dist/PublishParser/getSchemaFromPublish.js +39 -16
- package/dist/PublishParser/getSchemaFromPublish.js.map +1 -1
- package/dist/PublishParser/getTableRulesWithoutFileTable.d.ts.map +1 -1
- package/dist/PublishParser/getTableRulesWithoutFileTable.js +42 -22
- package/dist/PublishParser/getTableRulesWithoutFileTable.js.map +1 -1
- package/dist/PublishParser/publishTypesAndUtils.d.ts.map +1 -1
- package/dist/PublishParser/publishTypesAndUtils.js +5 -1
- package/dist/PublishParser/publishTypesAndUtils.js.map +1 -1
- package/dist/RestApi.d.ts +1 -1
- package/dist/RestApi.d.ts.map +1 -1
- package/dist/RestApi.js +1 -1
- package/dist/RestApi.js.map +1 -1
- package/dist/SchemaWatch/SchemaWatch.d.ts +2 -2
- package/dist/SchemaWatch/SchemaWatch.d.ts.map +1 -1
- package/dist/SchemaWatch/SchemaWatch.js +11 -9
- package/dist/SchemaWatch/SchemaWatch.js.map +1 -1
- package/dist/SchemaWatch/getValidatedWatchSchemaType.d.ts.map +1 -1
- package/dist/SchemaWatch/getValidatedWatchSchemaType.js +3 -3
- package/dist/SchemaWatch/getValidatedWatchSchemaType.js.map +1 -1
- package/dist/SchemaWatch/getWatchSchemaTagList.d.ts.map +1 -1
- package/dist/SchemaWatch/getWatchSchemaTagList.js +12 -6
- package/dist/SchemaWatch/getWatchSchemaTagList.js.map +1 -1
- package/dist/SyncReplication.d.ts.map +1 -1
- package/dist/SyncReplication.js +84 -42
- package/dist/SyncReplication.js.map +1 -1
- package/dist/TableConfig/TableConfig.d.ts +5 -5
- package/dist/TableConfig/TableConfig.d.ts.map +1 -1
- package/dist/TableConfig/TableConfig.js +18 -5
- package/dist/TableConfig/TableConfig.js.map +1 -1
- package/dist/TableConfig/getColumnDefinitionQuery.d.ts +2 -2
- package/dist/TableConfig/getColumnDefinitionQuery.d.ts.map +1 -1
- package/dist/TableConfig/getColumnDefinitionQuery.js +20 -9
- package/dist/TableConfig/getColumnDefinitionQuery.js.map +1 -1
- package/dist/TableConfig/getConstraintDefinitionQueries.d.ts +3 -3
- package/dist/TableConfig/getConstraintDefinitionQueries.d.ts.map +1 -1
- package/dist/TableConfig/getConstraintDefinitionQueries.js +12 -7
- package/dist/TableConfig/getConstraintDefinitionQueries.js.map +1 -1
- package/dist/TableConfig/getFutureTableSchema.d.ts +1 -1
- package/dist/TableConfig/getFutureTableSchema.d.ts.map +1 -1
- package/dist/TableConfig/getFutureTableSchema.js +6 -4
- package/dist/TableConfig/getFutureTableSchema.js.map +1 -1
- package/dist/TableConfig/getPGIndexes.d.ts.map +1 -1
- package/dist/TableConfig/getPGIndexes.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 +38 -19
- package/dist/TableConfig/getTableColumnQueries.js.map +1 -1
- package/dist/TableConfig/initTableConfig.d.ts.map +1 -1
- package/dist/TableConfig/initTableConfig.js +91 -43
- package/dist/TableConfig/initTableConfig.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/initProstgles.d.ts.map +1 -1
- package/dist/initProstgles.js +14 -10
- package/dist/initProstgles.js.map +1 -1
- package/dist/onSocketConnected.d.ts.map +1 -1
- package/dist/onSocketConnected.js +38 -16
- package/dist/onSocketConnected.js.map +1 -1
- package/dist/runClientRequest.d.ts.map +1 -1
- package/dist/runClientRequest.js +33 -14
- package/dist/runClientRequest.js.map +1 -1
- package/dist/shortestPath.d.ts.map +1 -1
- package/dist/shortestPath.js +1 -1
- package/dist/shortestPath.js.map +1 -1
- package/dist/typeTests/dboTypeCheck.js.map +1 -1
- package/examples/full-example-typescript/DBoGenerated.d.ts +112 -54
- package/examples/full-example-typescript/DBoGenerated.js +3 -3
- package/examples/full-example-typescript/home.html +28 -26
- package/examples/full-example-typescript/index.d.ts +1 -1
- package/examples/full-example-typescript/index.js +80 -53
- package/examples/full-example-vanilla/home.html +151 -125
- package/examples/server/javascript/index.js +17 -19
- package/lib/Auth/AuthHandler.ts +234 -155
- package/lib/Auth/AuthTypes.ts +27 -4
- package/lib/Auth/getSafeReturnURL.ts +35 -21
- package/lib/Auth/sendEmail.ts +34 -31
- package/lib/Auth/setAuthProviders.ts +94 -71
- package/lib/Auth/setEmailProvider.ts +45 -27
- package/lib/Auth/setupAuthRoutes.ts +164 -100
- package/lib/DBEventsManager.ts +87 -65
- package/lib/DBSchemaBuilder.ts +62 -28
- package/lib/DboBuilder/DboBuilder.ts +45 -21
- package/lib/DboBuilder/DboBuilderTypes.ts +99 -95
- package/lib/DboBuilder/QueryBuilder/Functions.ts +862 -580
- package/lib/DboBuilder/QueryBuilder/QueryBuilder.ts +202 -141
- package/lib/DboBuilder/QueryBuilder/getJoinQuery.ts +199 -124
- package/lib/DboBuilder/QueryBuilder/getNewQuery.ts +209 -148
- package/lib/DboBuilder/QueryBuilder/getSelectQuery.ts +101 -75
- package/lib/DboBuilder/QueryBuilder/prepareHaving.ts +10 -5
- package/lib/DboBuilder/QueryStreamer.ts +207 -100
- package/lib/DboBuilder/TableHandler/DataValidator.ts +253 -148
- package/lib/DboBuilder/TableHandler/TableHandler.ts +155 -60
- package/lib/DboBuilder/TableHandler/delete.ts +82 -29
- package/lib/DboBuilder/TableHandler/insert.ts +177 -81
- package/lib/DboBuilder/TableHandler/insertTest.ts +13 -7
- package/lib/DboBuilder/TableHandler/onDeleteFromFileTable.ts +35 -21
- package/lib/DboBuilder/TableHandler/runInsertUpdateQuery.ts +95 -45
- package/lib/DboBuilder/TableHandler/update.ts +54 -14
- package/lib/DboBuilder/TableHandler/updateBatch.ts +59 -21
- package/lib/DboBuilder/TableHandler/updateFile.ts +57 -26
- package/lib/DboBuilder/TableHandler/upsert.ts +58 -13
- package/lib/DboBuilder/ViewHandler/ViewHandler.ts +264 -121
- package/lib/DboBuilder/ViewHandler/count.ts +56 -25
- package/lib/DboBuilder/ViewHandler/find.ts +153 -68
- package/lib/DboBuilder/ViewHandler/getExistsCondition.ts +59 -32
- package/lib/DboBuilder/ViewHandler/getExistsFilters.ts +31 -19
- package/lib/DboBuilder/ViewHandler/getInfo.ts +47 -16
- package/lib/DboBuilder/ViewHandler/getTableJoinQuery.ts +91 -57
- package/lib/DboBuilder/ViewHandler/parseComplexFilter.ts +51 -29
- package/lib/DboBuilder/ViewHandler/parseFieldFilter.ts +35 -29
- package/lib/DboBuilder/ViewHandler/parseJoinPath.ts +130 -76
- package/lib/DboBuilder/ViewHandler/prepareSortItems.ts +140 -92
- package/lib/DboBuilder/ViewHandler/prepareWhere.ts +66 -26
- package/lib/DboBuilder/ViewHandler/size.ts +56 -22
- package/lib/DboBuilder/ViewHandler/subscribe.ts +122 -46
- package/lib/DboBuilder/ViewHandler/validateViewRules.ts +39 -14
- package/lib/DboBuilder/dboBuilderUtils.ts +41 -18
- package/lib/DboBuilder/getColumns.ts +44 -12
- package/lib/DboBuilder/getCondition.ts +120 -79
- package/lib/DboBuilder/getSubscribeRelatedTables.ts +144 -83
- package/lib/DboBuilder/getTablesForSchemaPostgresSQL.ts +61 -44
- package/lib/DboBuilder/insertNestedRecords.ts +370 -235
- package/lib/DboBuilder/parseUpdateRules.ts +117 -61
- package/lib/DboBuilder/prepareShortestJoinPaths.ts +115 -56
- package/lib/DboBuilder/runSQL.ts +135 -74
- package/lib/DboBuilder/runTransaction.ts +27 -16
- package/lib/DboBuilder/sqlErrCodeToMsg.ts +502 -244
- package/lib/DboBuilder/uploadFile.ts +67 -31
- package/lib/Event_Trigger_Tags.ts +6 -4
- package/lib/FileManager/FileManager.ts +53 -21
- package/lib/FileManager/getValidatedFileType.ts +79 -35
- package/lib/FileManager/initFileManager.ts +21 -9
- package/lib/FileManager/upload.ts +21 -19
- package/lib/FileManager/uploadStream.ts +33 -34
- package/lib/Filtering.ts +249 -197
- package/lib/JSONBValidation/validate_jsonb_schema_sql.ts +2 -7
- package/lib/JSONBValidation/validation.ts +147 -82
- package/lib/Logging.ts +107 -97
- package/lib/PostgresNotifListenManager.ts +96 -63
- package/lib/Prostgles.ts +106 -35
- package/lib/ProstglesTypes.ts +31 -9
- package/lib/PubSubManager/PubSubManager.ts +62 -27
- package/lib/PubSubManager/addSub.ts +56 -37
- package/lib/PubSubManager/addSync.ts +50 -33
- package/lib/PubSubManager/getCreatePubSubManagerError.ts +29 -21
- package/lib/PubSubManager/getPubSubManagerInitQuery.ts +45 -27
- package/lib/PubSubManager/initPubSubManager.ts +27 -18
- package/lib/PubSubManager/notifListener.ts +77 -59
- package/lib/PubSubManager/orphanTriggerCheck.ts +5 -4
- package/lib/PubSubManager/pushSubData.ts +11 -9
- package/lib/PublishParser/PublishParser.ts +102 -44
- package/lib/PublishParser/getFileTableRules.ts +97 -54
- package/lib/PublishParser/getSchemaFromPublish.ts +146 -74
- package/lib/PublishParser/getTableRulesWithoutFileTable.ts +101 -51
- package/lib/PublishParser/publishTypesAndUtils.ts +74 -23
- package/lib/RestApi.ts +10 -2
- package/lib/SchemaWatch/SchemaWatch.ts +52 -34
- package/lib/SchemaWatch/createSchemaWatchEventTrigger.ts +1 -1
- package/lib/SchemaWatch/getValidatedWatchSchemaType.ts +32 -22
- package/lib/SchemaWatch/getWatchSchemaTagList.ts +24 -16
- package/lib/SyncReplication.ts +376 -190
- package/lib/TableConfig/TableConfig.ts +200 -136
- package/lib/TableConfig/getColumnDefinitionQuery.ts +65 -44
- package/lib/TableConfig/getConstraintDefinitionQueries.ts +41 -25
- package/lib/TableConfig/getFutureTableSchema.ts +31 -21
- package/lib/TableConfig/getPGIndexes.ts +7 -4
- package/lib/TableConfig/getTableColumnQueries.ts +101 -54
- package/lib/TableConfig/initTableConfig.ts +192 -101
- package/lib/index.ts +6 -5
- package/lib/initProstgles.ts +57 -51
- package/lib/onSocketConnected.ts +75 -40
- package/lib/runClientRequest.ts +148 -79
- package/lib/shortestPath.ts +80 -76
- package/lib/typeTests/DBoGenerated.d.ts +5 -1
- package/lib/typeTests/dboTypeCheck.ts +8 -8
- package/package.json +1 -1
|
@@ -4,61 +4,97 @@ import { ValidateRowBasic } from "../PublishParser/PublishParser";
|
|
|
4
4
|
import { TableHandler } from "./TableHandler/TableHandler";
|
|
5
5
|
|
|
6
6
|
export const isFile = (row: AnyObject) => {
|
|
7
|
-
return Boolean(
|
|
8
|
-
|
|
7
|
+
return Boolean(
|
|
8
|
+
row &&
|
|
9
|
+
isObject(row) &&
|
|
10
|
+
getKeys(row).sort().join() === ["name", "data"].sort().join() &&
|
|
11
|
+
row.data &&
|
|
12
|
+
(typeof row.data === "string" || Buffer.isBuffer(row.data)) &&
|
|
13
|
+
typeof row.name === "string",
|
|
14
|
+
);
|
|
15
|
+
};
|
|
9
16
|
|
|
10
17
|
type UploadFileArgs = {
|
|
11
18
|
row: AnyObject;
|
|
12
|
-
validate: ValidateRowBasic | undefined;
|
|
19
|
+
validate: ValidateRowBasic | undefined;
|
|
13
20
|
localParams: LocalParams | undefined;
|
|
14
21
|
/**
|
|
15
22
|
* Used to update an existing file
|
|
16
23
|
*/
|
|
17
24
|
mediaId?: string;
|
|
18
|
-
}
|
|
25
|
+
};
|
|
19
26
|
|
|
20
|
-
export async function uploadFile(
|
|
27
|
+
export async function uploadFile(
|
|
28
|
+
this: TableHandler,
|
|
29
|
+
{ row, localParams, validate, mediaId }: UploadFileArgs,
|
|
30
|
+
): Promise<Media> {
|
|
21
31
|
if (!this.dboBuilder.prostgles?.fileManager) throw "fileManager not set up";
|
|
22
32
|
|
|
23
|
-
if (!isFile(row))
|
|
33
|
+
if (!isFile(row))
|
|
34
|
+
throw (
|
|
35
|
+
"Expecting only two properties for file upload: { name: string; data: File | string | Buffer }; but got: " +
|
|
36
|
+
Object.entries(row)
|
|
37
|
+
.map(([k, v]) => `${k}: ${typeof v}`)
|
|
38
|
+
.join(", ")
|
|
39
|
+
);
|
|
24
40
|
const { data, name } = row;
|
|
25
41
|
|
|
26
|
-
const media_id =
|
|
42
|
+
const media_id =
|
|
43
|
+
mediaId ??
|
|
44
|
+
(await this.db.oneOrNone("SELECT gen_random_uuid() as name")).name;
|
|
27
45
|
const nestedInsert = localParams?.nestedInsert;
|
|
28
|
-
const type = await this.dboBuilder.prostgles.fileManager.getValidatedFileType(
|
|
46
|
+
const type = await this.dboBuilder.prostgles.fileManager.getValidatedFileType(
|
|
47
|
+
{
|
|
48
|
+
file: data,
|
|
49
|
+
fileName: name,
|
|
50
|
+
tableName: nestedInsert?.previousTable,
|
|
51
|
+
colName: nestedInsert?.referencingColumn,
|
|
52
|
+
},
|
|
53
|
+
);
|
|
29
54
|
const media_name = `${media_id}.${type.ext}`;
|
|
30
|
-
const parsedMediaKeys = [
|
|
31
|
-
|
|
55
|
+
const parsedMediaKeys = [
|
|
56
|
+
"id",
|
|
57
|
+
"name",
|
|
58
|
+
"original_name",
|
|
59
|
+
"extension",
|
|
60
|
+
"content_type",
|
|
61
|
+
] as const;
|
|
62
|
+
const media: Required<Pick<Media, (typeof parsedMediaKeys)[number]>> = {
|
|
32
63
|
id: media_id,
|
|
33
64
|
name: media_name,
|
|
34
65
|
original_name: name,
|
|
35
66
|
extension: type.ext,
|
|
36
|
-
content_type: type.mime
|
|
37
|
-
}
|
|
67
|
+
content_type: type.mime,
|
|
68
|
+
};
|
|
38
69
|
|
|
39
70
|
if (validate) {
|
|
40
|
-
if(!localParams) throw "localParams missing";
|
|
41
|
-
const parsedMedia = await validate({
|
|
42
|
-
|
|
43
|
-
|
|
71
|
+
if (!localParams) throw "localParams missing";
|
|
72
|
+
const parsedMedia = await validate({
|
|
73
|
+
row: media,
|
|
74
|
+
dbx: this.getFinalDbo(localParams),
|
|
75
|
+
localParams,
|
|
76
|
+
});
|
|
77
|
+
const missingKeys = parsedMediaKeys.filter((k) => !parsedMedia[k]);
|
|
78
|
+
if (missingKeys.length) {
|
|
44
79
|
throw `Some keys are missing from file insert validation: ${missingKeys}`;
|
|
45
80
|
}
|
|
46
81
|
}
|
|
47
82
|
|
|
48
|
-
const _media: Media =
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
83
|
+
const _media: Media =
|
|
84
|
+
await this.dboBuilder.prostgles.fileManager.uploadAsMedia({
|
|
85
|
+
item: {
|
|
86
|
+
data,
|
|
87
|
+
name: media.name ?? "????",
|
|
88
|
+
content_type: media.content_type as any,
|
|
89
|
+
extension: media.extension,
|
|
90
|
+
},
|
|
91
|
+
// imageCompression: {
|
|
92
|
+
// inside: {
|
|
93
|
+
// width: 1100,
|
|
94
|
+
// height: 630
|
|
95
|
+
// }
|
|
96
|
+
// }
|
|
97
|
+
});
|
|
62
98
|
|
|
63
99
|
const mediaRow = {
|
|
64
100
|
...media,
|
|
@@ -66,4 +102,4 @@ export async function uploadFile(this: TableHandler, { row, localParams, validat
|
|
|
66
102
|
};
|
|
67
103
|
|
|
68
104
|
return mediaRow;
|
|
69
|
-
}
|
|
105
|
+
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
1
|
export const EVENT_TRIGGER_TAGS = [
|
|
3
2
|
"ALTER AGGREGATE",
|
|
4
3
|
"ALTER COLLATION",
|
|
@@ -110,9 +109,12 @@ export const EVENT_TRIGGER_TAGS = [
|
|
|
110
109
|
"REFRESH MATERIALIZED VIEW",
|
|
111
110
|
"REVOKE",
|
|
112
111
|
"SECURITY LABEL",
|
|
113
|
-
"SELECT INTO"
|
|
112
|
+
"SELECT INTO",
|
|
114
113
|
] as const;
|
|
115
114
|
|
|
116
|
-
export type EventTriggerTag = typeof EVENT_TRIGGER_TAGS[number];
|
|
115
|
+
export type EventTriggerTag = (typeof EVENT_TRIGGER_TAGS)[number];
|
|
117
116
|
|
|
118
|
-
export type EventTriggerTagFilter =
|
|
117
|
+
export type EventTriggerTagFilter =
|
|
118
|
+
| Partial<Record<EventTriggerTag, 1>>
|
|
119
|
+
| Partial<Record<EventTriggerTag, 0>>
|
|
120
|
+
| "*";
|
|
@@ -23,7 +23,10 @@ import { ExpressApp } from "../RestApi";
|
|
|
23
23
|
|
|
24
24
|
export const HOUR = 3600 * 1000;
|
|
25
25
|
|
|
26
|
-
export const asSQLIdentifier = async (
|
|
26
|
+
export const asSQLIdentifier = async (
|
|
27
|
+
name: string,
|
|
28
|
+
db: DB,
|
|
29
|
+
): Promise<string> => {
|
|
27
30
|
return (await db.one("select format('%I', $1) as name", [name]))?.name;
|
|
28
31
|
};
|
|
29
32
|
|
|
@@ -51,7 +54,9 @@ export type FileUploadArgs = {
|
|
|
51
54
|
contentType: string;
|
|
52
55
|
file: string | Buffer | stream.PassThrough;
|
|
53
56
|
onFinish: (
|
|
54
|
-
...args:
|
|
57
|
+
...args:
|
|
58
|
+
| [error: Error, result: undefined]
|
|
59
|
+
| [error: undefined, result: UploadedCloudFile]
|
|
55
60
|
) => void;
|
|
56
61
|
onProgress?: (bytesUploaded: number) => void;
|
|
57
62
|
};
|
|
@@ -59,7 +64,10 @@ export type CloudClient = {
|
|
|
59
64
|
upload: (file: FileUploadArgs) => Promise<void>;
|
|
60
65
|
downloadAsStream: (name: string) => Promise<stream.Readable>;
|
|
61
66
|
delete: (fileName: string) => Promise<void>;
|
|
62
|
-
getSignedUrlForDownload: (
|
|
67
|
+
getSignedUrlForDownload: (
|
|
68
|
+
fileName: string,
|
|
69
|
+
expiresInSeconds: number,
|
|
70
|
+
) => Promise<string>;
|
|
63
71
|
};
|
|
64
72
|
|
|
65
73
|
export type LocalConfig = {
|
|
@@ -153,11 +161,14 @@ export class FileManager {
|
|
|
153
161
|
}
|
|
154
162
|
} else {
|
|
155
163
|
console.error(
|
|
156
|
-
"FileManager checkInterval delayedDelete FAIL: Could not access file table tableHandler.delete()"
|
|
164
|
+
"FileManager checkInterval delayedDelete FAIL: Could not access file table tableHandler.delete()",
|
|
157
165
|
);
|
|
158
166
|
}
|
|
159
167
|
},
|
|
160
|
-
Math.max(
|
|
168
|
+
Math.max(
|
|
169
|
+
10000,
|
|
170
|
+
(fullConfig.delayedDelete.checkIntervalHours || 0) * HOUR,
|
|
171
|
+
),
|
|
161
172
|
);
|
|
162
173
|
}
|
|
163
174
|
}
|
|
@@ -191,7 +202,8 @@ export class FileManager {
|
|
|
191
202
|
|
|
192
203
|
getValidatedFileType = getValidatedFileType.bind(this);
|
|
193
204
|
|
|
194
|
-
getLocalFileUrl = (name: string) =>
|
|
205
|
+
getLocalFileUrl = (name: string) =>
|
|
206
|
+
this.fileRoute ? `${this.fileRoute}/${name}` : "";
|
|
195
207
|
|
|
196
208
|
checkFreeSpace = async (folderPath: string, fileSize = 0) => {
|
|
197
209
|
if (!this.cloudClient && "localFolderPath" in this.config) {
|
|
@@ -268,24 +280,32 @@ export class FileManager {
|
|
|
268
280
|
return res;
|
|
269
281
|
};
|
|
270
282
|
|
|
271
|
-
async getFileCloudDownloadURL(
|
|
283
|
+
async getFileCloudDownloadURL(
|
|
284
|
+
fileName: string,
|
|
285
|
+
expiresInSecondsRaw: number = 30 * 60,
|
|
286
|
+
) {
|
|
272
287
|
const expiresInSeconds = Math.max(1, Math.round(expiresInSecondsRaw));
|
|
273
|
-
return await this.cloudClient?.getSignedUrlForDownload(
|
|
288
|
+
return await this.cloudClient?.getSignedUrlForDownload(
|
|
289
|
+
fileName,
|
|
290
|
+
expiresInSeconds,
|
|
291
|
+
);
|
|
274
292
|
}
|
|
275
293
|
|
|
276
|
-
parseSQLIdentifier = async (name: string) =>
|
|
294
|
+
parseSQLIdentifier = async (name: string) =>
|
|
295
|
+
asSQLIdentifier(name, this.prostgles!.db!); // this.prostgles.dbo.sql<"value">("select format('%I', $1)", [name], { returnType: "value" } )
|
|
277
296
|
|
|
278
297
|
getColInfo = (args: {
|
|
279
298
|
tableName: string;
|
|
280
299
|
colName: string;
|
|
281
300
|
}): ValidatedColumnInfo["file"] | undefined => {
|
|
282
301
|
const { colName, tableName } = args;
|
|
283
|
-
const tableConfig =
|
|
302
|
+
const tableConfig =
|
|
303
|
+
this.prostgles?.opts.fileTable?.referencedTables?.[tableName];
|
|
284
304
|
const isReferencingFileTable = this.dbo[tableName]?.columns?.some(
|
|
285
305
|
(c) =>
|
|
286
306
|
c.name === colName &&
|
|
287
307
|
c.references &&
|
|
288
|
-
c.references?.some(({ ftable }) => ftable === this.tableName)
|
|
308
|
+
c.references?.some(({ ftable }) => ftable === this.tableName),
|
|
289
309
|
);
|
|
290
310
|
const allowAllFiles = { acceptedContent: "*" } as const;
|
|
291
311
|
if (isReferencingFileTable) {
|
|
@@ -300,13 +320,15 @@ export class FileManager {
|
|
|
300
320
|
init = initFileManager.bind(this);
|
|
301
321
|
|
|
302
322
|
destroy = () => {
|
|
303
|
-
removeExpressRoute(this.prostgles?.opts.fileTable?.expressApp, [
|
|
323
|
+
removeExpressRoute(this.prostgles?.opts.fileTable?.expressApp, [
|
|
324
|
+
this.fileRouteExpress,
|
|
325
|
+
]);
|
|
304
326
|
};
|
|
305
327
|
}
|
|
306
328
|
|
|
307
329
|
export const removeExpressRoute = (
|
|
308
330
|
app: ExpressApp | undefined,
|
|
309
|
-
routePaths: (string | undefined)[]
|
|
331
|
+
routePaths: (string | undefined)[],
|
|
310
332
|
) => {
|
|
311
333
|
const routes = app?._router?.stack;
|
|
312
334
|
if (routes) {
|
|
@@ -318,7 +340,10 @@ export const removeExpressRoute = (
|
|
|
318
340
|
}
|
|
319
341
|
};
|
|
320
342
|
|
|
321
|
-
export const removeExpressRouteByName = (
|
|
343
|
+
export const removeExpressRouteByName = (
|
|
344
|
+
app: ExpressApp | undefined,
|
|
345
|
+
name: string,
|
|
346
|
+
) => {
|
|
322
347
|
const routes = app?._router?.stack;
|
|
323
348
|
if (routes) {
|
|
324
349
|
routes.forEach((route, i) => {
|
|
@@ -330,15 +355,17 @@ export const removeExpressRouteByName = (app: ExpressApp | undefined, name: stri
|
|
|
330
355
|
};
|
|
331
356
|
|
|
332
357
|
export const getFileTypeFromFilename = (
|
|
333
|
-
fileName: string
|
|
334
|
-
):
|
|
358
|
+
fileName: string,
|
|
359
|
+
):
|
|
360
|
+
| { mime: ALLOWED_CONTENT_TYPE; ext: ALLOWED_EXTENSION | string }
|
|
361
|
+
| undefined => {
|
|
335
362
|
const nameParts = fileName.split(".");
|
|
336
363
|
|
|
337
364
|
if (nameParts.length < 2) return undefined;
|
|
338
365
|
|
|
339
366
|
const nameExt = nameParts.at(-1)!.toLowerCase(),
|
|
340
367
|
mime = getKeys(CONTENT_TYPE_TO_EXT).find((k) =>
|
|
341
|
-
(CONTENT_TYPE_TO_EXT[k] as readonly string[]).includes(nameExt)
|
|
368
|
+
(CONTENT_TYPE_TO_EXT[k] as readonly string[]).includes(nameExt),
|
|
342
369
|
);
|
|
343
370
|
|
|
344
371
|
if (!mime) return undefined;
|
|
@@ -354,7 +381,7 @@ export const getFileTypeFromFilename = (
|
|
|
354
381
|
|
|
355
382
|
export const getFileType = async (
|
|
356
383
|
file: Buffer | string,
|
|
357
|
-
fileName: string
|
|
384
|
+
fileName: string,
|
|
358
385
|
): Promise<{ mime: ALLOWED_CONTENT_TYPE; ext: ALLOWED_EXTENSION }> => {
|
|
359
386
|
const { fileTypeFromBuffer } = await (eval('import("file-type")') as Promise<
|
|
360
387
|
typeof import("file-type")
|
|
@@ -362,12 +389,17 @@ export const getFileType = async (
|
|
|
362
389
|
|
|
363
390
|
const fileNameMime = getFileTypeFromFilename(fileName);
|
|
364
391
|
if (!fileNameMime?.ext) throw new Error("File name must contain extenion");
|
|
365
|
-
const res = await fileTypeFromBuffer(
|
|
392
|
+
const res = await fileTypeFromBuffer(
|
|
393
|
+
typeof file === "string" ? Buffer.from(file, "utf8") : file,
|
|
394
|
+
);
|
|
366
395
|
|
|
367
396
|
if (!res) {
|
|
368
397
|
/* Set correct/missing extension */
|
|
369
398
|
const nameExt = fileNameMime?.ext;
|
|
370
|
-
if (
|
|
399
|
+
if (
|
|
400
|
+
["xml", "txt", "csv", "tsv", "svg", "sql"].includes(nameExt) &&
|
|
401
|
+
fileNameMime.mime
|
|
402
|
+
) {
|
|
371
403
|
return fileNameMime as any;
|
|
372
404
|
}
|
|
373
405
|
|
|
@@ -375,7 +407,7 @@ export const getFileType = async (
|
|
|
375
407
|
} else {
|
|
376
408
|
if (!res.ext || fileNameMime?.ext.toLowerCase() !== res.ext.toLowerCase()) {
|
|
377
409
|
throw new Error(
|
|
378
|
-
`There is a mismatch between file name extension and actual buffer extension: ${fileNameMime?.ext} vs ${res.ext}
|
|
410
|
+
`There is a mismatch between file name extension and actual buffer extension: ${fileNameMime?.ext} vs ${res.ext}`,
|
|
379
411
|
);
|
|
380
412
|
}
|
|
381
413
|
}
|
|
@@ -1,6 +1,16 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
ALLOWED_CONTENT_TYPE,
|
|
3
|
+
ALLOWED_EXTENSION,
|
|
4
|
+
CONTENT_TYPE_TO_EXT,
|
|
5
|
+
getKeys,
|
|
6
|
+
isObject,
|
|
7
|
+
} from "prostgles-types";
|
|
2
8
|
import { parseFieldFilter } from "../DboBuilder/ViewHandler/parseFieldFilter";
|
|
3
|
-
import {
|
|
9
|
+
import {
|
|
10
|
+
FileManager,
|
|
11
|
+
getFileType,
|
|
12
|
+
getFileTypeFromFilename,
|
|
13
|
+
} from "./FileManager";
|
|
4
14
|
|
|
5
15
|
type Args = {
|
|
6
16
|
file: Buffer | string;
|
|
@@ -8,7 +18,10 @@ type Args = {
|
|
|
8
18
|
colName?: string;
|
|
9
19
|
tableName?: string;
|
|
10
20
|
};
|
|
11
|
-
export async function getValidatedFileType(
|
|
21
|
+
export async function getValidatedFileType(
|
|
22
|
+
this: FileManager,
|
|
23
|
+
args: Args,
|
|
24
|
+
): Promise<{
|
|
12
25
|
mime: string | ALLOWED_CONTENT_TYPE;
|
|
13
26
|
ext: string | ALLOWED_EXTENSION;
|
|
14
27
|
|
|
@@ -17,53 +30,84 @@ export async function getValidatedFileType(this: FileManager, args: Args): Promi
|
|
|
17
30
|
}> {
|
|
18
31
|
const { file, fileName, tableName, colName } = args;
|
|
19
32
|
const config = this.prostgles?.opts.fileTable;
|
|
20
|
-
if(!config) throw new Error("File table config missing");
|
|
33
|
+
if (!config) throw new Error("File table config missing");
|
|
21
34
|
|
|
22
|
-
const buffer = typeof file === "string"? Buffer.from(file,
|
|
35
|
+
const buffer = typeof file === "string" ? Buffer.from(file, "utf8") : file;
|
|
23
36
|
|
|
24
37
|
const result = await getFileTypeFromFilename(fileName);
|
|
25
|
-
if(tableName && colName){
|
|
38
|
+
if (tableName && colName) {
|
|
26
39
|
const tableConfig = config.referencedTables?.[tableName];
|
|
27
40
|
|
|
28
|
-
if
|
|
41
|
+
if (
|
|
42
|
+
tableConfig &&
|
|
43
|
+
isObject(tableConfig) &&
|
|
44
|
+
tableConfig.referenceColumns[colName]
|
|
45
|
+
) {
|
|
29
46
|
const colConfig = tableConfig.referenceColumns[colName]!;
|
|
30
|
-
if(colConfig.maxFileSizeMB){
|
|
47
|
+
if (colConfig.maxFileSizeMB) {
|
|
31
48
|
const actualBufferSize = Buffer.byteLength(buffer);
|
|
32
|
-
if(
|
|
33
|
-
throw new Error(
|
|
49
|
+
if (actualBufferSize / 1e6 > colConfig.maxFileSizeMB) {
|
|
50
|
+
throw new Error(
|
|
51
|
+
`Provided file is larger than the ${colConfig.maxFileSizeMB}MB limit`,
|
|
52
|
+
);
|
|
34
53
|
}
|
|
35
54
|
}
|
|
36
|
-
|
|
37
|
-
if(
|
|
55
|
+
|
|
56
|
+
if (
|
|
57
|
+
"acceptedContent" in colConfig &&
|
|
58
|
+
colConfig.acceptedContent &&
|
|
59
|
+
colConfig.acceptedContent !== "*"
|
|
60
|
+
) {
|
|
38
61
|
const mime = await getFileType(buffer, fileName);
|
|
39
|
-
const CONTENTS = [
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
62
|
+
const CONTENTS = ["image", "audio", "video", "text", "application"];
|
|
63
|
+
const allowedContent = parseFieldFilter(
|
|
64
|
+
colConfig.acceptedContent,
|
|
65
|
+
false,
|
|
66
|
+
CONTENTS,
|
|
67
|
+
);
|
|
68
|
+
if (!allowedContent.some((c) => mime.mime.startsWith(c))) {
|
|
69
|
+
throw new Error(
|
|
70
|
+
`Dissallowed content type provided: ${mime.mime.split("/")[0]}. Allowed content types: ${allowedContent} `,
|
|
71
|
+
);
|
|
49
72
|
}
|
|
50
|
-
} else if(
|
|
73
|
+
} else if (
|
|
74
|
+
"acceptedContentType" in colConfig &&
|
|
75
|
+
colConfig.acceptedContentType &&
|
|
76
|
+
colConfig.acceptedContentType !== "*"
|
|
77
|
+
) {
|
|
51
78
|
const mime = await getFileType(buffer, fileName);
|
|
52
|
-
const allowedContentTypes = parseFieldFilter(
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
79
|
+
const allowedContentTypes = parseFieldFilter(
|
|
80
|
+
colConfig.acceptedContentType,
|
|
81
|
+
false,
|
|
82
|
+
getKeys(CONTENT_TYPE_TO_EXT),
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
if (!allowedContentTypes.some((c) => c === mime.mime)) {
|
|
86
|
+
throw new Error(
|
|
87
|
+
`Dissallowed MIME provided: ${mime.mime}. Allowed MIME values: ${allowedContentTypes} `,
|
|
88
|
+
);
|
|
56
89
|
}
|
|
57
|
-
} else if(
|
|
90
|
+
} else if (
|
|
91
|
+
"acceptedFileTypes" in colConfig &&
|
|
92
|
+
colConfig.acceptedFileTypes &&
|
|
93
|
+
colConfig.acceptedFileTypes !== "*"
|
|
94
|
+
) {
|
|
58
95
|
const mime = await getFileType(buffer, fileName);
|
|
59
|
-
const allowedExtensions = parseFieldFilter(
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
96
|
+
const allowedExtensions = parseFieldFilter(
|
|
97
|
+
colConfig.acceptedFileTypes,
|
|
98
|
+
false,
|
|
99
|
+
Object.values(CONTENT_TYPE_TO_EXT).flat(),
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
if (!allowedExtensions.some((c) => c === mime.ext)) {
|
|
103
|
+
throw new Error(
|
|
104
|
+
`Dissallowed extension provided: ${mime.ext}. Allowed extension values: ${allowedExtensions} `,
|
|
105
|
+
);
|
|
63
106
|
}
|
|
64
107
|
}
|
|
65
|
-
}
|
|
108
|
+
}
|
|
66
109
|
}
|
|
67
|
-
if(!result?.mime)
|
|
110
|
+
if (!result?.mime)
|
|
111
|
+
throw `File MIME type not found for the provided extension: ${result?.ext}`;
|
|
68
112
|
return result;
|
|
69
|
-
}
|
|
113
|
+
}
|
|
@@ -17,9 +17,10 @@ export async function initFileManager(this: FileManager, prg: Prostgles) {
|
|
|
17
17
|
const { tableName = "files", referencedTables = {} } = fileTable;
|
|
18
18
|
this.tableName = tableName;
|
|
19
19
|
|
|
20
|
-
const maxBfSizeMB =
|
|
20
|
+
const maxBfSizeMB =
|
|
21
|
+
(prg.opts.io?.engine?.opts?.maxHttpBufferSize || 1e6) / 1e6;
|
|
21
22
|
console.log(
|
|
22
|
-
`Prostgles: Initiated file manager. Max allowed file size: ${maxBfSizeMB}MB (maxHttpBufferSize = 1e6). To increase this set maxHttpBufferSize in socket.io server init options
|
|
23
|
+
`Prostgles: Initiated file manager. Max allowed file size: ${maxBfSizeMB}MB (maxHttpBufferSize = 1e6). To increase this set maxHttpBufferSize in socket.io server init options`,
|
|
23
24
|
);
|
|
24
25
|
|
|
25
26
|
const canCreate = await canCreateTables(this.db);
|
|
@@ -65,7 +66,7 @@ export async function initFileManager(this: FileManager, prg: Prostgles) {
|
|
|
65
66
|
UNIQUE(id),
|
|
66
67
|
UNIQUE(name)
|
|
67
68
|
)`,
|
|
68
|
-
`Create fileTable ${asName(tableName)}
|
|
69
|
+
`Create fileTable ${asName(tableName)}`,
|
|
69
70
|
);
|
|
70
71
|
await prg.refreshDBO();
|
|
71
72
|
}
|
|
@@ -84,7 +85,9 @@ export async function initFileManager(this: FileManager, prg: Prostgles) {
|
|
|
84
85
|
for (const [colName] of Object.entries(tableConfig.referenceColumns)) {
|
|
85
86
|
const existingCol = cols.find((c) => c.name === colName);
|
|
86
87
|
if (existingCol) {
|
|
87
|
-
if (
|
|
88
|
+
if (
|
|
89
|
+
existingCol.references?.some(({ ftable }) => ftable === tableName)
|
|
90
|
+
) {
|
|
88
91
|
// All ok
|
|
89
92
|
} else {
|
|
90
93
|
if (existingCol.udt_name === "uuid") {
|
|
@@ -94,12 +97,12 @@ export async function initFileManager(this: FileManager, prg: Prostgles) {
|
|
|
94
97
|
await runQuery(query, msg);
|
|
95
98
|
} catch (e) {
|
|
96
99
|
console.error(
|
|
97
|
-
`Could not add constraing. Err: ${e instanceof Error ? e.message : JSON.stringify(e)}
|
|
100
|
+
`Could not add constraing. Err: ${e instanceof Error ? e.message : JSON.stringify(e)}`,
|
|
98
101
|
);
|
|
99
102
|
}
|
|
100
103
|
} else {
|
|
101
104
|
console.error(
|
|
102
|
-
`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 ${tableName}(id)
|
|
105
|
+
`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 ${tableName}(id)`,
|
|
103
106
|
);
|
|
104
107
|
}
|
|
105
108
|
}
|
|
@@ -115,7 +118,7 @@ export async function initFileManager(this: FileManager, prg: Prostgles) {
|
|
|
115
118
|
// }
|
|
116
119
|
// await createColumn();
|
|
117
120
|
console.error(
|
|
118
|
-
`Referenced file column ${refTable} (${colName}) does not exist. Create it using this query:\n${query}
|
|
121
|
+
`Referenced file column ${refTable} (${colName}) does not exist. Create it using this query:\n${query}`,
|
|
119
122
|
);
|
|
120
123
|
}
|
|
121
124
|
}
|
|
@@ -154,7 +157,13 @@ export async function initFileManager(this: FileManager, prg: Prostgles) {
|
|
|
154
157
|
}
|
|
155
158
|
const id = name.slice(0, 36);
|
|
156
159
|
const selectParams = {
|
|
157
|
-
select: {
|
|
160
|
+
select: {
|
|
161
|
+
id: 1,
|
|
162
|
+
name: 1,
|
|
163
|
+
signed_url: 1,
|
|
164
|
+
signed_url_expires: 1,
|
|
165
|
+
content_type: 1,
|
|
166
|
+
},
|
|
158
167
|
};
|
|
159
168
|
const media = await runClientRequest.bind(this.prostgles)({
|
|
160
169
|
type: "http",
|
|
@@ -178,7 +187,10 @@ export async function initFileManager(this: FileManager, prg: Prostgles) {
|
|
|
178
187
|
const EXPIRES = Date.now() + HOUR;
|
|
179
188
|
if (!url || expires < EXPIRES) {
|
|
180
189
|
url = await this.getFileCloudDownloadURL(media.name, 60 * 60);
|
|
181
|
-
await mediaTable.update(
|
|
190
|
+
await mediaTable.update(
|
|
191
|
+
{ name },
|
|
192
|
+
{ signed_url: url, signed_url_expires: EXPIRES },
|
|
193
|
+
);
|
|
182
194
|
}
|
|
183
195
|
|
|
184
196
|
res.redirect(url);
|
|
@@ -1,26 +1,30 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import {
|
|
2
|
+
FileManager,
|
|
3
|
+
LocalConfig,
|
|
4
|
+
OnProgress,
|
|
5
|
+
UploadedItem,
|
|
6
|
+
} from "./FileManager";
|
|
7
|
+
import * as stream from "stream";
|
|
8
|
+
import * as fs from "fs";
|
|
4
9
|
|
|
5
10
|
export async function upload(
|
|
6
11
|
this: FileManager,
|
|
7
|
-
file: Buffer | string | stream.PassThrough,
|
|
12
|
+
file: Buffer | string | stream.PassThrough,
|
|
8
13
|
name: string,
|
|
9
14
|
mime: string,
|
|
10
|
-
onProgress?: OnProgress
|
|
15
|
+
onProgress?: OnProgress,
|
|
11
16
|
): Promise<UploadedItem> {
|
|
12
|
-
|
|
13
17
|
return new Promise(async (resolve, reject) => {
|
|
14
|
-
if(!file){
|
|
18
|
+
if (!file) {
|
|
15
19
|
throw "No file. Expecting: Buffer | String | stream.PassThrough";
|
|
16
20
|
}
|
|
17
|
-
if(!name){
|
|
21
|
+
if (!name) {
|
|
18
22
|
throw "No file name. Expecting: String";
|
|
19
23
|
}
|
|
20
24
|
|
|
21
25
|
const url = this.getLocalFileUrl(name);
|
|
22
|
-
if(!this.cloudClient){
|
|
23
|
-
if(file instanceof stream.PassThrough){
|
|
26
|
+
if (!this.cloudClient) {
|
|
27
|
+
if (file instanceof stream.PassThrough) {
|
|
24
28
|
throw new Error("S3 config missing. Can only upload streams to S3");
|
|
25
29
|
}
|
|
26
30
|
const config = this.config as LocalConfig;
|
|
@@ -31,32 +35,30 @@ export async function upload(
|
|
|
31
35
|
resolve({
|
|
32
36
|
url,
|
|
33
37
|
etag: `none`,
|
|
34
|
-
content_length: fs.statSync(filePath).size
|
|
38
|
+
content_length: fs.statSync(filePath).size,
|
|
35
39
|
});
|
|
36
|
-
} catch(err){
|
|
40
|
+
} catch (err) {
|
|
37
41
|
console.error("Error saving file locally", err);
|
|
38
|
-
reject("Internal error")
|
|
42
|
+
reject("Internal error");
|
|
39
43
|
}
|
|
40
44
|
} else {
|
|
41
|
-
|
|
42
45
|
let content_length = 0;
|
|
43
46
|
this.cloudClient.upload({
|
|
44
47
|
fileName: name,
|
|
45
48
|
contentType: mime,
|
|
46
49
|
file,
|
|
47
50
|
onFinish: (err, uploaded) => {
|
|
48
|
-
if(err){
|
|
51
|
+
if (err) {
|
|
49
52
|
reject(err.toString());
|
|
50
53
|
} else {
|
|
51
54
|
resolve({ ...uploaded, url });
|
|
52
55
|
}
|
|
53
56
|
},
|
|
54
|
-
onProgress: loaded => {
|
|
57
|
+
onProgress: (loaded) => {
|
|
55
58
|
content_length = loaded;
|
|
56
59
|
onProgress?.({ loaded, total: content_length });
|
|
57
|
-
}
|
|
60
|
+
},
|
|
58
61
|
});
|
|
59
62
|
}
|
|
60
|
-
|
|
61
63
|
});
|
|
62
|
-
}
|
|
64
|
+
}
|