@opengis/fastify-table 1.4.88 → 1.5.1
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/config.js +33 -0
- package/dist/dblist.js +5 -0
- package/dist/index.js +170 -0
- package/dist/redactionList.js +6 -0
- package/dist/server/helpers/core/badge.js +16 -0
- package/dist/server/helpers/core/buttonFilePreview.js +12 -0
- package/dist/server/helpers/core/buttonHelper.js +20 -0
- package/{server → dist/server}/helpers/core/token.js +16 -18
- package/dist/server/helpers/format/formatAuto.js +14 -0
- package/dist/server/helpers/format/formatDate.js +231 -0
- package/{server → dist/server}/helpers/format/formatDigit.js +21 -21
- package/dist/server/helpers/format/formatNum.js +331 -0
- package/{server → dist/server}/helpers/format/formatNumber.js +50 -55
- package/dist/server/helpers/format/formatRelative.js +180 -0
- package/{server → dist/server}/helpers/format/formatUnit.js +41 -40
- package/{server → dist/server}/helpers/format/num_format.js +40 -44
- package/{server → dist/server}/helpers/format/set.js +26 -27
- package/{server → dist/server}/helpers/funcs/_math.js +49 -50
- package/{server → dist/server}/helpers/funcs/contentList.js +52 -57
- package/{server → dist/server}/helpers/funcs/empty.js +21 -21
- package/dist/server/helpers/funcs/ifCond.js +109 -0
- package/dist/server/helpers/funcs/ifCondAnd.js +109 -0
- package/dist/server/helpers/funcs/ifCondOr.js +110 -0
- package/{server → dist/server}/helpers/funcs/inc.js +19 -20
- package/{server → dist/server}/helpers/funcs/json.js +3 -3
- package/dist/server/helpers/funcs/qrcode.js +65 -0
- package/{server → dist/server}/helpers/funcs/round.js +27 -29
- package/dist/server/helpers/funcs/select.js +39 -0
- package/dist/server/helpers/index.js +126 -0
- package/dist/server/helpers/list/buttonHelper.js +20 -0
- package/{server → dist/server}/helpers/list/descriptionList.js +39 -45
- package/dist/server/helpers/list/tableList.js +104 -0
- package/{server → dist/server}/helpers/list/utils/button.js +3 -3
- package/{server → dist/server}/helpers/list/utils/buttonDel.js +8 -9
- package/{server → dist/server}/helpers/list/utils/buttonEdit.js +8 -9
- package/{server → dist/server}/helpers/string/coalesce.js +33 -39
- package/{server → dist/server}/helpers/string/concat.js +25 -28
- package/{server → dist/server}/helpers/string/split.js +19 -20
- package/{server → dist/server}/helpers/string/str_replace.js +57 -62
- package/{server → dist/server}/helpers/string/substr.js +28 -32
- package/{server → dist/server}/helpers/string/translit.js +20 -23
- package/dist/server/helpers/string/utils/alphabet.js +76 -0
- package/{server → dist/server}/helpers/utils/button.js +3 -3
- package/{server → dist/server}/helpers/utils/buttonAdd.js +4 -4
- package/{server → dist/server}/helpers/utils/buttonDel.js +11 -15
- package/{server → dist/server}/helpers/utils/buttonDownload.js +3 -3
- package/dist/server/helpers/utils/buttonEdit.js +14 -0
- package/{server → dist/server}/helpers/utils/buttonPreview.js +3 -3
- package/{server → dist/server}/helpers/utils/mdToHTML.js +16 -17
- package/{server → dist/server}/helpers/utils/paddingNumber.js +5 -5
- package/dist/server/plugins/access/funcs/getAdminAccess.js +11 -0
- package/dist/server/plugins/cron/cronList.js +2 -0
- package/dist/server/plugins/cron/funcs/addCron.js +41 -0
- package/{server → dist/server}/plugins/cron/funcs/interval2ms.js +36 -40
- package/dist/server/plugins/cron/funcs/runCron.js +20 -0
- package/{server → dist/server}/plugins/cron/funcs/verifyUnique.js +19 -23
- package/dist/server/plugins/cron/index.js +75 -0
- package/dist/server/plugins/crud/funcs/dataDelete.js +87 -0
- package/dist/server/plugins/crud/funcs/dataInsert.js +134 -0
- package/dist/server/plugins/crud/funcs/dataUpdate.js +198 -0
- package/dist/server/plugins/crud/funcs/getAccess.js +82 -0
- package/dist/server/plugins/crud/funcs/getOpt.js +13 -0
- package/dist/server/plugins/crud/funcs/getToken.js +24 -0
- package/dist/server/plugins/crud/funcs/isFileExists.js +11 -0
- package/dist/server/plugins/crud/funcs/setOpt.js +19 -0
- package/dist/server/plugins/crud/funcs/setToken.js +41 -0
- package/dist/server/plugins/crud/funcs/utils/getFolder.js +13 -0
- package/dist/server/plugins/crud/funcs/utils/getInsertQuery.js +54 -0
- package/dist/server/plugins/crud/funcs/utils/logChanges.js +144 -0
- package/{server → dist/server}/plugins/crud/funcs/validateData.js +91 -83
- package/dist/server/plugins/extra/extraData.js +81 -0
- package/dist/server/plugins/extra/extraDataGet.js +52 -0
- package/dist/server/plugins/file/downloadFile.js +15 -0
- package/{server → dist/server}/plugins/file/getExport.js +18 -38
- package/dist/server/plugins/file/isFileExists.js +13 -0
- package/dist/server/plugins/file/providers/fs.js +86 -0
- package/dist/server/plugins/file/providers/index.js +28 -0
- package/dist/server/plugins/file/providers/mime/index.js +7 -0
- package/dist/server/plugins/file/providers/mime/mimes.js +1179 -0
- package/dist/server/plugins/file/providers/s3/client.js +26 -0
- package/dist/server/plugins/file/providers/s3/funcs/downloadFile.js +42 -0
- package/dist/server/plugins/file/providers/s3/funcs/fileExists.js +24 -0
- package/dist/server/plugins/file/providers/s3/funcs/uploadFile.js +35 -0
- package/dist/server/plugins/file/providers/s3/funcs/utils/getS3FilePath.js +18 -0
- package/{server → dist/server}/plugins/file/providers/s3/index.js +11 -12
- package/dist/server/plugins/file/providers/utils/getDataSize.js +19 -0
- package/dist/server/plugins/file/providers/utils/getValidData.js +30 -0
- package/dist/server/plugins/file/providers/utils/handlers/dataTypes.js +7 -0
- package/dist/server/plugins/file/providers/utils/handlers/index.js +50 -0
- package/dist/server/plugins/file/providers/utils/handlers/sizeHandlers.js +9 -0
- package/dist/server/plugins/file/providers/utils/streamToBuffer.js +7 -0
- package/{server → dist/server}/plugins/file/providers/utils/typeguards/isArray.js +2 -3
- package/{server → dist/server}/plugins/file/providers/utils/typeguards/isBuffer.js +2 -3
- package/dist/server/plugins/file/providers/utils/typeguards/isPath.js +3 -0
- package/dist/server/plugins/file/providers/utils/typeguards/isReadableStream.js +7 -0
- package/{server → dist/server}/plugins/file/providers/utils/typeguards/isText.js +2 -3
- package/dist/server/plugins/file/uploadFile.js +14 -0
- package/dist/server/plugins/file/uploadMultiPart.js +101 -0
- package/dist/server/plugins/file/utils/allowedExtensions.js +60 -0
- package/{server → dist/server}/plugins/file/utils/getFileType.js +12 -10
- package/dist/server/plugins/file/utils/getPath.js +30 -0
- package/dist/server/plugins/file/utils/isFileExists.js +15 -0
- package/dist/server/plugins/grpc/file2json.js +50 -0
- package/dist/server/plugins/grpc/grpc.js +103 -0
- package/dist/server/plugins/grpc/office2pdf.js +78 -0
- package/dist/server/plugins/grpc/utils/csv2xls.js +6 -0
- package/dist/server/plugins/grpc/utils/excel2Json.js +10 -0
- package/dist/server/plugins/grpc/utils/html2doc.js +17 -0
- package/dist/server/plugins/grpc/utils/html2img.js +17 -0
- package/dist/server/plugins/grpc/utils/html2pdf.js +19 -0
- package/{server → dist/server}/plugins/grpc/utils/htmlTemplate.js +3 -4
- package/dist/server/plugins/grpc/utils/json2xls.js +11 -0
- package/dist/server/plugins/grpc/utils/mergePdf.js +18 -0
- package/dist/server/plugins/hook/funcs/addHook.js +7 -0
- package/dist/server/plugins/hook/funcs/applyHook.js +25 -0
- package/dist/server/plugins/hook/funcs/applyHookSync.js +7 -0
- package/dist/server/plugins/hook/hookList.js +2 -0
- package/{server → dist/server}/plugins/hook/index.js +7 -8
- package/dist/server/plugins/logger/createFileStream.js +79 -0
- package/dist/server/plugins/logger/errorMessage.js +24 -0
- package/dist/server/plugins/logger/errorStatus.js +17 -0
- package/dist/server/plugins/logger/getHooks.js +17 -0
- package/dist/server/plugins/logger/getLogger.js +52 -0
- package/dist/server/plugins/logger/index.js +37 -0
- package/dist/server/plugins/logger/labels.js +10 -0
- package/dist/server/plugins/logger/serializers.js +22 -0
- package/{server → dist/server}/plugins/logger/timestampWithTimeZone.js +5 -5
- package/dist/server/plugins/md/funcs/formatMdoc.js +45 -0
- package/{server → dist/server}/plugins/md/funcs/mdToHTML.js +16 -17
- package/dist/server/plugins/metric/index.js +6 -0
- package/dist/server/plugins/metric/loggerSystem.js +127 -0
- package/dist/server/plugins/metric/systemMetricsFifthly.js +20 -0
- package/dist/server/plugins/migration/exec.migrations.js +59 -0
- package/dist/server/plugins/migration/exec.sql.js +61 -0
- package/{server → dist/server}/plugins/migration/index.js +5 -7
- package/dist/server/plugins/pg/funcs/autoIndex.js +102 -0
- package/{server → dist/server}/plugins/pg/funcs/getDBParams.js +16 -15
- package/dist/server/plugins/pg/funcs/getMeta.js +48 -0
- package/dist/server/plugins/pg/funcs/getPG.js +39 -0
- package/dist/server/plugins/pg/funcs/getPGAsync.js +45 -0
- package/dist/server/plugins/pg/funcs/init.js +157 -0
- package/dist/server/plugins/pg/index.js +47 -0
- package/dist/server/plugins/pg/pgClients.js +20 -0
- package/dist/server/plugins/policy/funcs/checkPolicy.js +173 -0
- package/dist/server/plugins/policy/funcs/checkXSS.js +44 -0
- package/dist/server/plugins/policy/index.js +11 -0
- package/dist/server/plugins/policy/sqlInjection.js +33 -0
- package/dist/server/plugins/policy/xssInjection.js +72 -0
- package/{server → dist/server}/plugins/redis/client.js +6 -8
- package/dist/server/plugins/redis/funcs/getRedis.js +23 -0
- package/{server → dist/server}/plugins/redis/funcs/redisClients.js +2 -3
- package/dist/server/plugins/redis/index.js +8 -0
- package/dist/server/plugins/sqlite/funcs/getSqlite.js +27 -0
- package/dist/server/plugins/sqlite/funcs/init.js +45 -0
- package/dist/server/plugins/sqlite/index.js +8 -0
- package/dist/server/plugins/sqlite/sqliteClients.js +24 -0
- package/dist/server/plugins/table/funcs/addMenu.js +12 -0
- package/dist/server/plugins/table/funcs/addTemplateDir.js +16 -0
- package/dist/server/plugins/table/funcs/customTokens.js +2 -0
- package/dist/server/plugins/table/funcs/getData.js +25 -0
- package/dist/server/plugins/table/funcs/getFilter.js +18 -0
- package/dist/server/plugins/table/funcs/getFilterSQL/index.js +201 -0
- package/dist/server/plugins/table/funcs/getFilterSQL/util/formatValue.js +131 -0
- package/dist/server/plugins/table/funcs/getFilterSQL/util/getCustomQuery.js +11 -0
- package/dist/server/plugins/table/funcs/getFilterSQL/util/getFilterQuery.js +84 -0
- package/dist/server/plugins/table/funcs/getFilterSQL/util/getOptimizedQuery.js +11 -0
- package/dist/server/plugins/table/funcs/getFilterSQL/util/getRangeQuery.js +161 -0
- package/dist/server/plugins/table/funcs/getFilterSQL/util/getTableSql.js +40 -0
- package/dist/server/plugins/table/funcs/getSelect.js +37 -0
- package/dist/server/plugins/table/funcs/getSelectMeta.js +77 -0
- package/dist/server/plugins/table/funcs/getTemplate.js +86 -0
- package/dist/server/plugins/table/funcs/getTemplatePath.js +60 -0
- package/dist/server/plugins/table/funcs/getTemplateSync.js +84 -0
- package/dist/server/plugins/table/funcs/getTemplates.js +15 -0
- package/dist/server/plugins/table/funcs/gisIRColumn.js +81 -0
- package/dist/server/plugins/table/funcs/loadTemplate.js +2 -0
- package/dist/server/plugins/table/funcs/loadTemplatePath.js +2 -0
- package/dist/server/plugins/table/funcs/menuDirs.js +2 -0
- package/dist/server/plugins/table/funcs/metaFormat/getSelectVal.js +75 -0
- package/dist/server/plugins/table/funcs/metaFormat/index.js +64 -0
- package/dist/server/plugins/table/funcs/userTemplateDir.js +2 -0
- package/dist/server/plugins/table/funcs/userTokens.js +2 -0
- package/dist/server/plugins/util/funcs/eventStream.js +28 -0
- package/{server → dist/server}/plugins/util/funcs/flattenObject.js +14 -12
- package/{server → dist/server}/plugins/util/funcs/unflattenObject.js +48 -46
- package/{server → dist/server}/plugins/yml/funcs/json2yml.js +3 -5
- package/{server → dist/server}/plugins/yml/funcs/yml2json.js +11 -14
- package/{server → dist/server}/routes/access/controllers/access.group.js +17 -23
- package/{server → dist/server}/routes/access/controllers/access.group.post.js +46 -53
- package/dist/server/routes/access/controllers/access.interface.js +36 -0
- package/{server/routes/access/index.mjs → dist/server/routes/access/index.js} +10 -12
- package/{server/routes/access/schema.mjs → dist/server/routes/access/schema.js} +65 -68
- package/dist/server/routes/cron/controllers/cronApi.js +16 -0
- package/dist/server/routes/cron/index.js +15 -0
- package/dist/server/routes/crud/controllers/deleteCrud.js +90 -0
- package/dist/server/routes/crud/controllers/insert.js +110 -0
- package/dist/server/routes/crud/controllers/table.js +144 -0
- package/dist/server/routes/crud/controllers/update.js +113 -0
- package/dist/server/routes/crud/index.js +22 -0
- package/dist/server/routes/dblist/controllers/readItems.js +25 -0
- package/dist/server/routes/dblist/controllers/setItem.js +20 -0
- package/dist/server/routes/dblist/index.js +17 -0
- package/dist/server/routes/dblist/utils/formatData.js +8 -0
- package/dist/server/routes/file/controllers/delete.js +99 -0
- package/dist/server/routes/file/controllers/download.js +56 -0
- package/dist/server/routes/file/controllers/export.js +294 -0
- package/dist/server/routes/file/controllers/files.js +57 -0
- package/dist/server/routes/file/controllers/resize.js +86 -0
- package/dist/server/routes/file/controllers/resizeAll.js +140 -0
- package/dist/server/routes/file/controllers/upload.js +56 -0
- package/dist/server/routes/file/controllers/uploadImage.js +45 -0
- package/dist/server/routes/file/controllers/utils/formatResult.js +13 -0
- package/dist/server/routes/file/controllers/utils/jsonToCsv.js +40 -0
- package/dist/server/routes/file/controllers/utils/jsonToXls.js +37 -0
- package/dist/server/routes/file/index.js +22 -0
- package/dist/server/routes/file/schema.js +14 -0
- package/dist/server/routes/grpc/controllers/file2geojson.js +54 -0
- package/dist/server/routes/grpc/controllers/filePreview.js +87 -0
- package/dist/server/routes/grpc/index.js +9 -0
- package/dist/server/routes/logger/controllers/logger.file.js +81 -0
- package/dist/server/routes/logger/controllers/logger.test.api.js +42 -0
- package/dist/server/routes/logger/controllers/utils/checkUserAccess.js +22 -0
- package/dist/server/routes/logger/controllers/utils/getRootDir.js +25 -0
- package/dist/server/routes/logger/index.js +18 -0
- package/dist/server/routes/menu/controllers/getMenu.js +98 -0
- package/dist/server/routes/menu/controllers/interfaces.js +18 -0
- package/dist/server/routes/menu/index.js +7 -0
- package/dist/server/routes/properties/controllers/properties.get.js +23 -0
- package/dist/server/routes/properties/controllers/properties.post.js +68 -0
- package/dist/server/routes/properties/index.js +21 -0
- package/dist/server/routes/table/controllers/card.js +79 -0
- package/dist/server/routes/table/controllers/cardData.js +161 -0
- package/dist/server/routes/table/controllers/cardTabData.js +49 -0
- package/dist/server/routes/table/controllers/dataInfo.js +57 -0
- package/dist/server/routes/table/controllers/filter.js +181 -0
- package/dist/server/routes/table/controllers/form.js +41 -0
- package/{server → dist/server}/routes/table/controllers/getFormByTable.js +105 -125
- package/dist/server/routes/table/controllers/search.js +80 -0
- package/dist/server/routes/table/controllers/suggest.js +242 -0
- package/dist/server/routes/table/controllers/tableData.js +88 -0
- package/dist/server/routes/table/controllers/tableInfo.js +112 -0
- package/dist/server/routes/table/controllers/tokenInfo.js +10 -0
- package/dist/server/routes/table/controllers/utils/conditions.js +30 -0
- package/dist/server/routes/table/controllers/utils/formatSchema.js +35 -0
- package/dist/server/routes/table/controllers/utils/locales.js +2 -0
- package/dist/server/routes/table/functions/getData.js +584 -0
- package/dist/server/routes/table/index.js +44 -0
- package/dist/server/routes/table/schema.js +117 -0
- package/dist/server/routes/templates/controllers/getTemplate.js +65 -0
- package/dist/server/routes/templates/index.js +7 -0
- package/{server → dist/server}/routes/templates/schema.js +11 -12
- package/dist/server/routes/util/controllers/code.generator.js +75 -0
- package/dist/server/routes/util/controllers/next.id.js +4 -0
- package/dist/server/routes/util/controllers/status.monitor.js +6 -0
- package/dist/server/routes/util/controllers/user.tokens.js +32 -0
- package/dist/server/routes/util/index.js +13 -0
- package/dist/server/routes/widget/controllers/file.edit.js +48 -0
- package/dist/server/routes/widget/controllers/widget.del.js +84 -0
- package/dist/server/routes/widget/controllers/widget.get.js +164 -0
- package/dist/server/routes/widget/controllers/widget.set.js +117 -0
- package/dist/server/routes/widget/hook/onWidgetSet.js +10 -0
- package/dist/server/routes/widget/index.js +42 -0
- package/dist/server/types/core.js +12 -0
- package/dist/utils.js +93 -0
- package/package.json +23 -16
- package/config.js +0 -37
- package/dblist.js +0 -5
- package/index.js +0 -193
- package/redactionList.js +0 -7
- package/server/helpers/core/badge.js +0 -14
- package/server/helpers/core/buttonFilePreview.js +0 -12
- package/server/helpers/core/buttonHelper.js +0 -22
- package/server/helpers/format/formatAuto.js +0 -13
- package/server/helpers/format/formatDate.js +0 -258
- package/server/helpers/format/formatNum.js +0 -365
- package/server/helpers/format/formatRelative.js +0 -106
- package/server/helpers/funcs/ifCond.js +0 -109
- package/server/helpers/funcs/ifCondAnd.js +0 -114
- package/server/helpers/funcs/ifCondOr.js +0 -115
- package/server/helpers/funcs/qrcode.js +0 -68
- package/server/helpers/funcs/select.js +0 -46
- package/server/helpers/index.js +0 -137
- package/server/helpers/list/buttonHelper.js +0 -22
- package/server/helpers/list/tableList.js +0 -87
- package/server/helpers/string/utils/alphabet.js +0 -76
- package/server/helpers/utils/buttonEdit.js +0 -17
- package/server/migrations/0.sql +0 -84
- package/server/migrations/cls.sql +0 -40
- package/server/migrations/context.sql +0 -135
- package/server/migrations/crm.sql +0 -155
- package/server/migrations/log.sql +0 -87
- package/server/migrations/properties.sql +0 -115
- package/server/migrations/roles.sql +0 -191
- package/server/migrations/template.sql +0 -44
- package/server/migrations/users.sql +0 -176
- package/server/plugins/access/funcs/getAdminAccess.js +0 -14
- package/server/plugins/access/index.mjs +0 -6
- package/server/plugins/cron/cronList.js +0 -1
- package/server/plugins/cron/funcs/addCron.js +0 -52
- package/server/plugins/cron/funcs/runCron.js +0 -24
- package/server/plugins/cron/index.js +0 -77
- package/server/plugins/crud/funcs/dataDelete.js +0 -86
- package/server/plugins/crud/funcs/dataInsert.js +0 -131
- package/server/plugins/crud/funcs/dataUpdate.js +0 -179
- package/server/plugins/crud/funcs/getAccess.js +0 -94
- package/server/plugins/crud/funcs/getOpt.js +0 -14
- package/server/plugins/crud/funcs/getToken.js +0 -33
- package/server/plugins/crud/funcs/isFileExists.js +0 -13
- package/server/plugins/crud/funcs/setOpt.js +0 -21
- package/server/plugins/crud/funcs/setToken.js +0 -43
- package/server/plugins/crud/funcs/utils/getFolder.js +0 -11
- package/server/plugins/crud/funcs/utils/getInsertQuery.js +0 -44
- package/server/plugins/crud/funcs/utils/logChanges.js +0 -121
- package/server/plugins/crud/index.js +0 -23
- package/server/plugins/extra/extraData.js +0 -79
- package/server/plugins/extra/extraDataGet.js +0 -56
- package/server/plugins/file/downloadFile.js +0 -18
- package/server/plugins/file/isFileExists.js +0 -17
- package/server/plugins/file/providers/fs.js +0 -100
- package/server/plugins/file/providers/index.d.ts +0 -49
- package/server/plugins/file/providers/index.js +0 -36
- package/server/plugins/file/providers/mime/index.js +0 -12
- package/server/plugins/file/providers/mime/mimes.js +0 -1180
- package/server/plugins/file/providers/s3/client.js +0 -41
- package/server/plugins/file/providers/s3/funcs/downloadFile.js +0 -50
- package/server/plugins/file/providers/s3/funcs/fileExists.js +0 -32
- package/server/plugins/file/providers/s3/funcs/uploadFile.js +0 -46
- package/server/plugins/file/providers/s3/funcs/utils/getS3FilePath.js +0 -23
- package/server/plugins/file/providers/utils/getDataSize.js +0 -20
- package/server/plugins/file/providers/utils/getValidData.js +0 -32
- package/server/plugins/file/providers/utils/handlers/dataTypes.js +0 -8
- package/server/plugins/file/providers/utils/handlers/index.js +0 -53
- package/server/plugins/file/providers/utils/handlers/sizeHandlers.js +0 -11
- package/server/plugins/file/providers/utils/streamToBuffer.js +0 -8
- package/server/plugins/file/providers/utils/typeguards/isPath.js +0 -5
- package/server/plugins/file/providers/utils/typeguards/isReadableStream.js +0 -8
- package/server/plugins/file/uploadFile.js +0 -19
- package/server/plugins/file/uploadMultiPart.js +0 -131
- package/server/plugins/file/utils/allowedExtensions.js +0 -25
- package/server/plugins/file/utils/getPath.js +0 -25
- package/server/plugins/file/utils/isFileExists.js +0 -16
- package/server/plugins/grpc/file2json.js +0 -54
- package/server/plugins/grpc/grpc.js +0 -125
- package/server/plugins/grpc/office2pdf.js +0 -91
- package/server/plugins/grpc/utils/csv2xls.js +0 -8
- package/server/plugins/grpc/utils/excel2Json.js +0 -8
- package/server/plugins/grpc/utils/html2doc.js +0 -19
- package/server/plugins/grpc/utils/html2img.js +0 -18
- package/server/plugins/grpc/utils/html2pdf.js +0 -23
- package/server/plugins/grpc/utils/json2xls.js +0 -13
- package/server/plugins/grpc/utils/mergePdf.js +0 -20
- package/server/plugins/hook/funcs/addHook.js +0 -8
- package/server/plugins/hook/funcs/applyHook.js +0 -25
- package/server/plugins/hook/funcs/applyHookSync.js +0 -9
- package/server/plugins/hook/hookList.js +0 -1
- package/server/plugins/logger/createFileStream.js +0 -88
- package/server/plugins/logger/errorMessage.js +0 -25
- package/server/plugins/logger/errorStatus.js +0 -19
- package/server/plugins/logger/getHooks.js +0 -21
- package/server/plugins/logger/getLogger.js +0 -58
- package/server/plugins/logger/index.js +0 -33
- package/server/plugins/logger/labels.js +0 -11
- package/server/plugins/logger/serializers.js +0 -25
- package/server/plugins/md/funcs/formatMdoc.js +0 -40
- package/server/plugins/metric/index.js +0 -8
- package/server/plugins/metric/loggerSystem.js +0 -131
- package/server/plugins/metric/systemMetricsFifthly.js +0 -24
- package/server/plugins/migration/exec.migrations.js +0 -63
- package/server/plugins/migration/exec.sql.js +0 -67
- package/server/plugins/pg/funcs/autoIndex.js +0 -103
- package/server/plugins/pg/funcs/getMeta.js +0 -49
- package/server/plugins/pg/funcs/getPG.js +0 -42
- package/server/plugins/pg/funcs/getPGAsync.js +0 -62
- package/server/plugins/pg/funcs/init.js +0 -117
- package/server/plugins/pg/index.js +0 -54
- package/server/plugins/pg/pgClients.js +0 -22
- package/server/plugins/policy/funcs/checkPolicy.js +0 -127
- package/server/plugins/policy/funcs/checkXSS.js +0 -37
- package/server/plugins/policy/index.js +0 -11
- package/server/plugins/policy/sqlInjection.js +0 -34
- package/server/plugins/policy/xssInjection.js +0 -73
- package/server/plugins/redis/funcs/getRedis.js +0 -25
- package/server/plugins/redis/index.js +0 -17
- package/server/plugins/sqlite/funcs/getSqlite.js +0 -39
- package/server/plugins/sqlite/funcs/init.js +0 -53
- package/server/plugins/sqlite/index.js +0 -11
- package/server/plugins/sqlite/sqliteClients.js +0 -26
- package/server/plugins/table/funcs/addMenu.js +0 -16
- package/server/plugins/table/funcs/addTemplateDir.js +0 -19
- package/server/plugins/table/funcs/customTokens.js +0 -1
- package/server/plugins/table/funcs/getData.js +0 -14
- package/server/plugins/table/funcs/getFilter.js +0 -14
- package/server/plugins/table/funcs/getFilterSQL/index.js +0 -163
- package/server/plugins/table/funcs/getFilterSQL/util/formatValue.js +0 -136
- package/server/plugins/table/funcs/getFilterSQL/util/getCustomQuery.js +0 -13
- package/server/plugins/table/funcs/getFilterSQL/util/getFilterQuery.js +0 -75
- package/server/plugins/table/funcs/getFilterSQL/util/getOptimizedQuery.js +0 -12
- package/server/plugins/table/funcs/getFilterSQL/util/getRangeQuery.js +0 -156
- package/server/plugins/table/funcs/getFilterSQL/util/getTableSql.js +0 -34
- package/server/plugins/table/funcs/getSelect.js +0 -31
- package/server/plugins/table/funcs/getSelectMeta.js +0 -74
- package/server/plugins/table/funcs/getTemplate.js +0 -88
- package/server/plugins/table/funcs/getTemplatePath.js +0 -60
- package/server/plugins/table/funcs/getTemplateSync.js +0 -87
- package/server/plugins/table/funcs/getTemplates.js +0 -19
- package/server/plugins/table/funcs/gisIRColumn.js +0 -82
- package/server/plugins/table/funcs/loadTemplate.js +0 -1
- package/server/plugins/table/funcs/loadTemplatePath.js +0 -1
- package/server/plugins/table/funcs/menuDirs.js +0 -1
- package/server/plugins/table/funcs/metaFormat/getSelectVal.js +0 -61
- package/server/plugins/table/funcs/metaFormat/index.js +0 -49
- package/server/plugins/table/funcs/userTemplateDir.js +0 -1
- package/server/plugins/table/funcs/userTokens.js +0 -1
- package/server/plugins/table/index.js +0 -13
- package/server/plugins/util/funcs/eventStream.js +0 -29
- package/server/plugins/util/index.js +0 -7
- package/server/routes/access/controllers/access.interface.js +0 -37
- package/server/routes/cron/controllers/cronApi.js +0 -22
- package/server/routes/cron/index.js +0 -19
- package/server/routes/crud/controllers/deleteCrud.js +0 -84
- package/server/routes/crud/controllers/insert.js +0 -103
- package/server/routes/crud/controllers/table.js +0 -116
- package/server/routes/crud/controllers/update.js +0 -108
- package/server/routes/crud/index.js +0 -26
- package/server/routes/dblist/controllers/readItems.js +0 -28
- package/server/routes/dblist/controllers/setItem.js +0 -25
- package/server/routes/dblist/index.mjs +0 -19
- package/server/routes/dblist/utils/formatData.js +0 -7
- package/server/routes/file/controllers/delete.js +0 -108
- package/server/routes/file/controllers/download.js +0 -66
- package/server/routes/file/controllers/export.js +0 -290
- package/server/routes/file/controllers/files.js +0 -72
- package/server/routes/file/controllers/resize.js +0 -96
- package/server/routes/file/controllers/resizeAll.js +0 -165
- package/server/routes/file/controllers/upload.js +0 -55
- package/server/routes/file/controllers/uploadImage.js +0 -47
- package/server/routes/file/controllers/utils/formatResult.js +0 -17
- package/server/routes/file/controllers/utils/jsonToCsv.js +0 -36
- package/server/routes/file/controllers/utils/jsonToXls.js +0 -42
- package/server/routes/file/index.mjs +0 -26
- package/server/routes/file/schema.js +0 -16
- package/server/routes/grpc/controllers/file2geojson.js +0 -60
- package/server/routes/grpc/controllers/filePreview.js +0 -89
- package/server/routes/grpc/index.mjs +0 -12
- package/server/routes/logger/controllers/logger.file.js +0 -97
- package/server/routes/logger/controllers/logger.test.api.js +0 -48
- package/server/routes/logger/controllers/utils/checkUserAccess.js +0 -24
- package/server/routes/logger/controllers/utils/getRootDir.js +0 -27
- package/server/routes/logger/index.js +0 -22
- package/server/routes/menu/controllers/getMenu.js +0 -98
- package/server/routes/menu/controllers/interfaces.js +0 -21
- package/server/routes/menu/index.mjs +0 -8
- package/server/routes/menu/schema.js +0 -0
- package/server/routes/properties/controllers/properties.get.js +0 -33
- package/server/routes/properties/controllers/properties.post.js +0 -76
- package/server/routes/properties/index.js +0 -25
- package/server/routes/table/controllers/card.js +0 -77
- package/server/routes/table/controllers/cardData.js +0 -155
- package/server/routes/table/controllers/cardTabData.js +0 -57
- package/server/routes/table/controllers/dataInfo.js +0 -56
- package/server/routes/table/controllers/filter.js +0 -154
- package/server/routes/table/controllers/form.js +0 -42
- package/server/routes/table/controllers/search.js +0 -74
- package/server/routes/table/controllers/suggest.js +0 -246
- package/server/routes/table/controllers/tableData.js +0 -62
- package/server/routes/table/controllers/tableInfo.js +0 -110
- package/server/routes/table/controllers/tokenInfo.js +0 -12
- package/server/routes/table/controllers/utils/conditions.js +0 -21
- package/server/routes/table/controllers/utils/formatSchema.js +0 -23
- package/server/routes/table/controllers/utils/locales.js +0 -1
- package/server/routes/table/functions/getData.js +0 -436
- package/server/routes/table/index.js +0 -57
- package/server/routes/table/schema.js +0 -127
- package/server/routes/templates/controllers/getTemplate.js +0 -51
- package/server/routes/templates/index.mjs +0 -10
- package/server/routes/util/controllers/code.generator.js +0 -94
- package/server/routes/util/controllers/next.id.js +0 -4
- package/server/routes/util/controllers/status.monitor.js +0 -8
- package/server/routes/util/controllers/user.tokens.js +0 -45
- package/server/routes/util/index.js +0 -14
- package/server/routes/widget/controllers/file.edit.js +0 -55
- package/server/routes/widget/controllers/widget.del.js +0 -99
- package/server/routes/widget/controllers/widget.get.js +0 -156
- package/server/routes/widget/controllers/widget.set.js +0 -108
- package/server/routes/widget/hook/onWidgetSet.js +0 -13
- package/server/routes/widget/index.mjs +0 -38
- package/utils.js +0 -112
- /package/{server → dist/server}/plugins/grpc/utils/convertp.proto +0 -0
- /package/{server → dist/server}/plugins/grpc/utils/office2pdf.proto +0 -0
|
@@ -1,68 +1,65 @@
|
|
|
1
|
-
export default null;
|
|
2
|
-
export { accessGroupSchema, accessGroupPostSchema, accessInterfaceSchema }
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
},
|
|
67
|
-
},
|
|
68
|
-
};
|
|
1
|
+
export default null;
|
|
2
|
+
export { accessGroupSchema, accessGroupPostSchema, accessInterfaceSchema };
|
|
3
|
+
const accessGroupSchema = {
|
|
4
|
+
params: {
|
|
5
|
+
type: 'object',
|
|
6
|
+
properties: {
|
|
7
|
+
id: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
|
|
8
|
+
},
|
|
9
|
+
required: ['id'],
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
const accessInterfaceSchema = {
|
|
13
|
+
params: {
|
|
14
|
+
type: 'object',
|
|
15
|
+
properties: {
|
|
16
|
+
name: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
|
|
17
|
+
},
|
|
18
|
+
required: ['name'],
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
const accessGroupPostSchema = {
|
|
22
|
+
params: {
|
|
23
|
+
type: 'object',
|
|
24
|
+
properties: {
|
|
25
|
+
id: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
|
|
26
|
+
},
|
|
27
|
+
required: ['id'],
|
|
28
|
+
},
|
|
29
|
+
body: {
|
|
30
|
+
type: 'object',
|
|
31
|
+
properties: {
|
|
32
|
+
users: {
|
|
33
|
+
type: 'array',
|
|
34
|
+
items: {
|
|
35
|
+
type: 'object',
|
|
36
|
+
properties: {
|
|
37
|
+
id: {
|
|
38
|
+
type: 'string',
|
|
39
|
+
pattern: '^([\\d\\w._-]+)$',
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
routes: {
|
|
45
|
+
type: 'array',
|
|
46
|
+
/*items: {
|
|
47
|
+
type: 'object',
|
|
48
|
+
properties: {
|
|
49
|
+
path: {
|
|
50
|
+
type: 'string',
|
|
51
|
+
pattern: '^([\\d\\w._-]+)$',
|
|
52
|
+
},
|
|
53
|
+
actions: {
|
|
54
|
+
type: 'array',
|
|
55
|
+
items: {
|
|
56
|
+
type: 'string',
|
|
57
|
+
enum: ['get', 'add', 'edit', 'del'],
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
},*/
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import cronList from "../../../plugins/cron/cronList.js";
|
|
2
|
+
export default async function cronApi(req) {
|
|
3
|
+
const { params = {}, user = {}, hostname } = req;
|
|
4
|
+
if ((!user.uid || !user.user_type?.includes("admin")) &&
|
|
5
|
+
!hostname?.includes("local")) {
|
|
6
|
+
return { message: "access restricted", status: 403 };
|
|
7
|
+
}
|
|
8
|
+
if (params.name === "list") {
|
|
9
|
+
return { data: Object.keys(cronList || {}) };
|
|
10
|
+
}
|
|
11
|
+
if (!cronList[params.name]) {
|
|
12
|
+
return { message: `cron not found: ${params.name}`, status: 404 };
|
|
13
|
+
}
|
|
14
|
+
const result = await cronList[params.name]?.(req);
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import cronApi from "./controllers/cronApi.js";
|
|
2
|
+
const cronSchema = {
|
|
3
|
+
type: "object",
|
|
4
|
+
properties: {
|
|
5
|
+
params: {
|
|
6
|
+
name: { type: "string", pattern: "^([\\d\\w._-]+)$" },
|
|
7
|
+
},
|
|
8
|
+
},
|
|
9
|
+
};
|
|
10
|
+
const policy = ["site", "admin"];
|
|
11
|
+
async function plugin(app, config = { prefix: "/api" }) {
|
|
12
|
+
const { prefix = "/api" } = config;
|
|
13
|
+
app.get(`${prefix}/cron/:name`, { config: { policy }, schema: cronSchema }, cronApi);
|
|
14
|
+
}
|
|
15
|
+
export default plugin;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { dataDelete, getTemplate, getAccess, applyHook, getToken, config, pgClients, getOpt, } from "../../../../utils.js";
|
|
2
|
+
export default async function deleteCrud(req, reply) {
|
|
3
|
+
const { pg = pgClients.client, user = {}, params = {}, headers = {}, } = req || {};
|
|
4
|
+
const hookData = (await applyHook("preDelete", {
|
|
5
|
+
pg,
|
|
6
|
+
table: params?.table,
|
|
7
|
+
id: params?.id,
|
|
8
|
+
user,
|
|
9
|
+
}));
|
|
10
|
+
if (hookData?.message && hookData?.status) {
|
|
11
|
+
return reply.status(hookData.status).send(hookData.message);
|
|
12
|
+
}
|
|
13
|
+
const { referer } = headers;
|
|
14
|
+
const tokenData = (await getToken({
|
|
15
|
+
uid: user.uid,
|
|
16
|
+
token: params.id || params.table,
|
|
17
|
+
json: 1,
|
|
18
|
+
})) ||
|
|
19
|
+
(await getOpt(params.id || params.table, user.uid)) ||
|
|
20
|
+
(await getOpt(params.table, user.uid));
|
|
21
|
+
const { table: del, id = params.id, query, actions: actionsToken, } = hookData ||
|
|
22
|
+
tokenData ||
|
|
23
|
+
(config.security?.disableToken || config.local || config.auth?.disable
|
|
24
|
+
? req.params
|
|
25
|
+
: {});
|
|
26
|
+
if (actionsToken && !actionsToken?.includes("del")) {
|
|
27
|
+
return reply.status(403).send({
|
|
28
|
+
error: "del is not allowed ",
|
|
29
|
+
code: 403,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
const { actions = [] } = (await getAccess({ table: del, id, user }, pg)) || {};
|
|
33
|
+
if (!tokenData &&
|
|
34
|
+
!config?.local &&
|
|
35
|
+
!config.security?.disableToken &&
|
|
36
|
+
!config.auth?.disable) {
|
|
37
|
+
return reply.status(403).send({
|
|
38
|
+
error: "invalid token",
|
|
39
|
+
code: 403,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
if (!actions.includes("del") && !config?.local && !tokenData) {
|
|
43
|
+
return reply.status(403).send({
|
|
44
|
+
error: "access restricted: actions",
|
|
45
|
+
code: 403,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const loadTemplate = await getTemplate("table", del);
|
|
49
|
+
const { table } = loadTemplate || hookData || tokenData || req.params || {};
|
|
50
|
+
if (!table) {
|
|
51
|
+
return reply.status(404).send({
|
|
52
|
+
error: "table is required",
|
|
53
|
+
code: 404,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
if (!id) {
|
|
57
|
+
return reply.status(404).send({
|
|
58
|
+
error: "id is required",
|
|
59
|
+
code: 404,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
const data = await dataDelete({
|
|
63
|
+
pg,
|
|
64
|
+
table,
|
|
65
|
+
id,
|
|
66
|
+
uid: user?.uid,
|
|
67
|
+
tokenData,
|
|
68
|
+
referer,
|
|
69
|
+
query,
|
|
70
|
+
}).catch((err) => {
|
|
71
|
+
if (err.message?.includes?.("foreign key") ||
|
|
72
|
+
err.message?.includes?.("unique")) {
|
|
73
|
+
const constraint = err.message.match(/constraint "([^"]+)"/g);
|
|
74
|
+
return reply.status(400).send({
|
|
75
|
+
error: `Видалення заборонено для збереження цілісності БД: ${constraint}`,
|
|
76
|
+
code: 400,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
if (config.trace)
|
|
80
|
+
console.error(err.toString());
|
|
81
|
+
return {
|
|
82
|
+
error: err.toString(),
|
|
83
|
+
code: 400,
|
|
84
|
+
};
|
|
85
|
+
});
|
|
86
|
+
return reply.status(200).send({
|
|
87
|
+
rowCount: data?.rowCount || 0,
|
|
88
|
+
msg: !data?.rowCount ? data : null,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { applyHook, getAccess, getTemplate, checkXSS, dataInsert, getToken, config, pgClients, logger, validateData, } from "../../../../utils.js";
|
|
2
|
+
export default async function insert(req, reply) {
|
|
3
|
+
const { pg = pgClients.client, user = {}, params = {}, body = {}, headers = {}, } = req || {};
|
|
4
|
+
if (!user) {
|
|
5
|
+
return reply.status(403).send("access restricted");
|
|
6
|
+
}
|
|
7
|
+
const hookData = (await applyHook("preInsert", {
|
|
8
|
+
pg,
|
|
9
|
+
table: params?.table,
|
|
10
|
+
user,
|
|
11
|
+
body,
|
|
12
|
+
}));
|
|
13
|
+
if (hookData?.message && hookData?.status) {
|
|
14
|
+
return { message: hookData?.message, status: hookData?.status };
|
|
15
|
+
}
|
|
16
|
+
const { referer } = headers;
|
|
17
|
+
const tokenData = await getToken({
|
|
18
|
+
uid: user?.uid,
|
|
19
|
+
token: params.table,
|
|
20
|
+
mode: "a",
|
|
21
|
+
json: 1,
|
|
22
|
+
});
|
|
23
|
+
const { form, table: add } = hookData ||
|
|
24
|
+
tokenData ||
|
|
25
|
+
(config.security?.disableToken || config.local || config.auth?.disable
|
|
26
|
+
? req.params
|
|
27
|
+
: {});
|
|
28
|
+
const { actions = [] } = (await getAccess({ table: add, form, user }, pg)) || {};
|
|
29
|
+
if (!tokenData &&
|
|
30
|
+
!config.local &&
|
|
31
|
+
!config.security?.disableToken &&
|
|
32
|
+
!config.auth?.disable) {
|
|
33
|
+
return reply.status(400).send("invalid token");
|
|
34
|
+
}
|
|
35
|
+
if (!actions.includes("add") && !config.local && !tokenData) {
|
|
36
|
+
return reply.status(403).send("access restricted: actions");
|
|
37
|
+
}
|
|
38
|
+
if (!add) {
|
|
39
|
+
return reply.status(400).send("table is required");
|
|
40
|
+
}
|
|
41
|
+
const loadTemplate = await getTemplate("table", add);
|
|
42
|
+
const { table } = loadTemplate || hookData || tokenData || req.params || {};
|
|
43
|
+
if (!table) {
|
|
44
|
+
return reply.status(404).send("table not found");
|
|
45
|
+
}
|
|
46
|
+
const formData = form || loadTemplate?.form
|
|
47
|
+
? (await getTemplate("form", form || loadTemplate?.form)) || {}
|
|
48
|
+
: {};
|
|
49
|
+
const schema = formData?.schema || formData;
|
|
50
|
+
const xssCheck = checkXSS({ body, schema });
|
|
51
|
+
if (xssCheck.error && formData?.xssCheck !== false) {
|
|
52
|
+
logger.file("injection/xss", {
|
|
53
|
+
table,
|
|
54
|
+
form: form || loadTemplate?.form,
|
|
55
|
+
body,
|
|
56
|
+
uid: user?.uid,
|
|
57
|
+
msg: xssCheck.error,
|
|
58
|
+
});
|
|
59
|
+
return reply
|
|
60
|
+
.status(409)
|
|
61
|
+
.send("Дані містять заборонені символи. Приберіть їх та спробуйте ще раз");
|
|
62
|
+
}
|
|
63
|
+
const fieldCheck = validateData({ body, schema });
|
|
64
|
+
if (fieldCheck.error) {
|
|
65
|
+
logger.file("injection/sql", {
|
|
66
|
+
table,
|
|
67
|
+
form: form || loadTemplate?.form,
|
|
68
|
+
uid: user?.uid,
|
|
69
|
+
...fieldCheck,
|
|
70
|
+
});
|
|
71
|
+
return reply
|
|
72
|
+
.status(409)
|
|
73
|
+
.send("Дані не пройшли валідацію. Приберіть некоректні дані та спробуйте ще раз");
|
|
74
|
+
}
|
|
75
|
+
if (![add, table].includes("admin.users")) {
|
|
76
|
+
Object.assign(body, { uid: user?.uid, editor_id: user?.uid });
|
|
77
|
+
}
|
|
78
|
+
if (tokenData?.obj) {
|
|
79
|
+
const objData = tokenData.obj?.split("#").reduce((p, el) => ({
|
|
80
|
+
...p,
|
|
81
|
+
[el.split("=")[0] || ""]: el.split("=")[1],
|
|
82
|
+
}), {}) || {};
|
|
83
|
+
Object.assign(body, objData);
|
|
84
|
+
}
|
|
85
|
+
const res = await dataInsert({
|
|
86
|
+
pg,
|
|
87
|
+
id: params?.id || body.id,
|
|
88
|
+
table: loadTemplate?.table || table,
|
|
89
|
+
data: body,
|
|
90
|
+
uid: user?.uid,
|
|
91
|
+
tokenData,
|
|
92
|
+
referer,
|
|
93
|
+
});
|
|
94
|
+
if (!res) {
|
|
95
|
+
return reply.status(400).send("nothing added");
|
|
96
|
+
}
|
|
97
|
+
// admin.custom_column
|
|
98
|
+
await applyHook("afterInsert", {
|
|
99
|
+
pg,
|
|
100
|
+
table,
|
|
101
|
+
token: params?.table,
|
|
102
|
+
body,
|
|
103
|
+
payload: res,
|
|
104
|
+
user,
|
|
105
|
+
});
|
|
106
|
+
const pk = pg.pk?.[loadTemplate?.table || table];
|
|
107
|
+
return reply
|
|
108
|
+
.status(200)
|
|
109
|
+
.send({ id: res?.rows?.[0]?.[pk], rows: res.rows, extra: res.extra });
|
|
110
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { config, getAccess, getTemplate, getMeta, setToken, applyHook, getToken, pgClients, } from "../../../../utils.js";
|
|
2
|
+
import extraDataGet from "../../../plugins/extra/extraDataGet.js";
|
|
3
|
+
export default async function tableAPI(req, reply, called) {
|
|
4
|
+
const { pg = pgClients.client, params, user = {}, query = {} } = req;
|
|
5
|
+
const tokenData = (await getToken({ token: params?.table, uid: user.uid, json: 1 })) || {};
|
|
6
|
+
const hookData = (await applyHook("preTable", {
|
|
7
|
+
pg,
|
|
8
|
+
table: params?.table,
|
|
9
|
+
id: params?.id,
|
|
10
|
+
...(tokenData || {}),
|
|
11
|
+
user,
|
|
12
|
+
}));
|
|
13
|
+
if (hookData?.message && hookData?.status) {
|
|
14
|
+
return reply.status(hookData?.status).send(hookData?.message);
|
|
15
|
+
}
|
|
16
|
+
const templateName = hookData?.table || tokenData.table || params.table;
|
|
17
|
+
const loadTable = await getTemplate("table", templateName);
|
|
18
|
+
if (!loadTable &&
|
|
19
|
+
!pg.pk?.[tokenData.table] &&
|
|
20
|
+
!(pg.pk?.[templateName] && called)) {
|
|
21
|
+
return reply.status(404).send("not found");
|
|
22
|
+
}
|
|
23
|
+
const { table = params.table, /* columns, */ form } = hookData || loadTable || tokenData;
|
|
24
|
+
const id = hookData?.id || tokenData.id || params.id;
|
|
25
|
+
if (tokenData && !id)
|
|
26
|
+
return { message: {} };
|
|
27
|
+
if (!table && !id) {
|
|
28
|
+
return reply.status(400).send("not enough params");
|
|
29
|
+
}
|
|
30
|
+
const { actions = [], query: accessQuery } = (await getAccess({
|
|
31
|
+
table,
|
|
32
|
+
form,
|
|
33
|
+
id,
|
|
34
|
+
user,
|
|
35
|
+
}, pg)) || {};
|
|
36
|
+
if (!tokenData &&
|
|
37
|
+
!config?.local &&
|
|
38
|
+
!config.security?.disableToken &&
|
|
39
|
+
!called) {
|
|
40
|
+
return reply.status(400).send("invalid token");
|
|
41
|
+
}
|
|
42
|
+
if (!actions.includes("edit") && !config?.local && !tokenData && !called) {
|
|
43
|
+
return reply.status(403).send("access restricted: actions");
|
|
44
|
+
}
|
|
45
|
+
const { pk, columns: dbColumns = [] } = await getMeta({ pg, table });
|
|
46
|
+
if (!pk) {
|
|
47
|
+
return reply.status(404).send(`table not found: ${table}`);
|
|
48
|
+
}
|
|
49
|
+
// const cols = columns.map((el) => el.name || el).join(',');
|
|
50
|
+
const formData = (await getTemplate("form", form)) || {};
|
|
51
|
+
const schema = formData?.schema || formData || {};
|
|
52
|
+
// skip DataTable from another table
|
|
53
|
+
const extraKeys = Object.keys(schema).filter((key) => schema[key]?.table &&
|
|
54
|
+
schema[key]?.parent_id &&
|
|
55
|
+
Object.hasOwn(schema[key], "colModel"));
|
|
56
|
+
// skip non-existing columns
|
|
57
|
+
const columnList = dbColumns.map((el) => el.name || el).join(",");
|
|
58
|
+
const { fields = [] } = !loadTable?.table
|
|
59
|
+
? await pg.query(`select * from ${table} limit 0`)
|
|
60
|
+
: {};
|
|
61
|
+
const cols = loadTable?.table
|
|
62
|
+
? Object.keys(schema || {})
|
|
63
|
+
.filter((col) => columnList.includes(col) && !extraKeys.includes(col))
|
|
64
|
+
?.map((col) => col?.includes("geom") && schema?.[col]?.type === "Geom"
|
|
65
|
+
? `st_asgeojson(${col})::json as "${col}"`
|
|
66
|
+
: `"${col}"`)
|
|
67
|
+
?.join(",")
|
|
68
|
+
: fields
|
|
69
|
+
.map((el) => el?.name?.includes("geom") && pg.pgType[el?.dataTypeID] === "geometry"
|
|
70
|
+
? `st_asgeojson(${el.name})::json as "${el.name}"`
|
|
71
|
+
: `"${el?.name}"`)
|
|
72
|
+
.join(",");
|
|
73
|
+
const where = [`"${pk}" = $1`, loadTable?.query, accessQuery]
|
|
74
|
+
.filter(Boolean)
|
|
75
|
+
.filter((el) => user?.user_type === "superadmin" ? !el.includes("{{uid}}") : true);
|
|
76
|
+
const geom = dbColumns.find((el) => el.name === "geom" && pg.pgType[el.dataTypeID] === "geometry")
|
|
77
|
+
? ",st_asgeojson(geom)::json as geom"
|
|
78
|
+
: "";
|
|
79
|
+
const q = `select "${pk}" as id, ${cols || "*"} ${geom} from ${table} t where ${where.join(" and ") || "true"} limit 1`;
|
|
80
|
+
if (query?.sql === "1") {
|
|
81
|
+
const extraQ = extraKeys
|
|
82
|
+
?.map((key) => {
|
|
83
|
+
const { colModel, table: extraTable, parent_id: parentId, } = schema[key];
|
|
84
|
+
const colModel1 = Array.isArray(colModel)
|
|
85
|
+
? colModel
|
|
86
|
+
: Object.values(colModel || {});
|
|
87
|
+
return colModel1.length
|
|
88
|
+
? `/*${key}*/ select ${parentId} as parent, ${colModel1
|
|
89
|
+
.map((col) => col.name || col.key)
|
|
90
|
+
.join(",")} from ${extraTable} a where ${parentId}::text=$1`
|
|
91
|
+
: null;
|
|
92
|
+
})
|
|
93
|
+
.filter((el) => el)
|
|
94
|
+
.join(";");
|
|
95
|
+
return `${q};${extraQ || ""}`.replace(/\$1/g, `'${id}'`);
|
|
96
|
+
}
|
|
97
|
+
const data = await pg
|
|
98
|
+
.query(q.replace(/{{uid}}/, user?.uid), [id])
|
|
99
|
+
.then((el) => el.rows[0]);
|
|
100
|
+
if (!data) {
|
|
101
|
+
return reply.status(404).send(`object not found: ${id}`);
|
|
102
|
+
}
|
|
103
|
+
Object.keys(schema)
|
|
104
|
+
.filter((key) => schema[key]?.type === "DataTable")
|
|
105
|
+
.forEach((key) => {
|
|
106
|
+
if (data[key] && !Array.isArray(data[key])) {
|
|
107
|
+
data[key] = null;
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
if (extraKeys?.length) {
|
|
111
|
+
await Promise.all(extraKeys?.map(async (key) => {
|
|
112
|
+
const { colModel, table: extraTable, parent_id: parentId, } = schema[key];
|
|
113
|
+
const colModel1 = Array.isArray(colModel)
|
|
114
|
+
? colModel
|
|
115
|
+
: Object.values(colModel || {});
|
|
116
|
+
const q1 = `select ${parentId} as parent, ${colModel1
|
|
117
|
+
.map((col) => col.name || col.key)
|
|
118
|
+
.join(",")} from ${extraTable} a where ${parentId}=$1`;
|
|
119
|
+
// console.log(table, formName, q1);
|
|
120
|
+
const { rows: extraRows } = await pg.query(q1, [id]);
|
|
121
|
+
Object.assign(data, { [key]: extraRows });
|
|
122
|
+
}));
|
|
123
|
+
}
|
|
124
|
+
if (user?.uid &&
|
|
125
|
+
!config.security?.disableToken &&
|
|
126
|
+
actions.includes("edit") &&
|
|
127
|
+
!called) {
|
|
128
|
+
data.token = tokenData?.table
|
|
129
|
+
? params.table
|
|
130
|
+
: setToken({
|
|
131
|
+
ids: [JSON.stringify({ id, table, form })],
|
|
132
|
+
uid: user.uid,
|
|
133
|
+
array: 1,
|
|
134
|
+
})?.[0];
|
|
135
|
+
}
|
|
136
|
+
await extraDataGet({ rows: [data], table, form }, pg);
|
|
137
|
+
const res = await applyHook("afterTable", {
|
|
138
|
+
pg,
|
|
139
|
+
table,
|
|
140
|
+
payload: [data],
|
|
141
|
+
user,
|
|
142
|
+
});
|
|
143
|
+
return res || data || {};
|
|
144
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { pgClients, applyHook, getAccess, getTemplate, checkXSS, dataUpdate, logger, getToken, validateData, } from "../../../../utils.js";
|
|
2
|
+
import config from "../../../../config.js";
|
|
3
|
+
import insert from "./insert.js";
|
|
4
|
+
export default async function update(req, reply) {
|
|
5
|
+
const { pg = pgClients.client, user, params = {}, body = {}, headers = {}, unittest, } = req;
|
|
6
|
+
if (!user) {
|
|
7
|
+
return reply.status(403).send("access restricted");
|
|
8
|
+
}
|
|
9
|
+
const hookData = (await applyHook("preUpdate", {
|
|
10
|
+
pg,
|
|
11
|
+
table: params?.table,
|
|
12
|
+
id: params?.id,
|
|
13
|
+
user,
|
|
14
|
+
}));
|
|
15
|
+
if (hookData?.message && hookData?.status) {
|
|
16
|
+
return { message: hookData?.message, status: hookData?.status };
|
|
17
|
+
}
|
|
18
|
+
const { referer } = headers;
|
|
19
|
+
const tokenData = await getToken({
|
|
20
|
+
uid: user.uid,
|
|
21
|
+
token: body.token || params.id || params.table,
|
|
22
|
+
mode: "w",
|
|
23
|
+
json: 1,
|
|
24
|
+
});
|
|
25
|
+
const { form, table: edit, id, } = hookData ||
|
|
26
|
+
tokenData ||
|
|
27
|
+
(config.security?.disableToken || config.local || config.auth?.disable
|
|
28
|
+
? params
|
|
29
|
+
: {});
|
|
30
|
+
const { actions = [] } = (await getAccess({
|
|
31
|
+
table: edit,
|
|
32
|
+
form,
|
|
33
|
+
id,
|
|
34
|
+
user,
|
|
35
|
+
}, pg)) || {};
|
|
36
|
+
if (!tokenData &&
|
|
37
|
+
!config.local &&
|
|
38
|
+
!config.security?.disableToken &&
|
|
39
|
+
!config.auth?.disable) {
|
|
40
|
+
return reply.status(400).send("invalid token");
|
|
41
|
+
}
|
|
42
|
+
if (!actions.includes("edit") && !config.local && !tokenData) {
|
|
43
|
+
return reply.status(403).send("access restricted: actions");
|
|
44
|
+
}
|
|
45
|
+
if (!edit) {
|
|
46
|
+
return reply.status(400).send("table is required");
|
|
47
|
+
}
|
|
48
|
+
if (!id && tokenData?.table) {
|
|
49
|
+
return insert(req, reply);
|
|
50
|
+
}
|
|
51
|
+
if (!id) {
|
|
52
|
+
return reply.status(400).send("id is required");
|
|
53
|
+
}
|
|
54
|
+
const loadTemplate = await getTemplate("table", edit);
|
|
55
|
+
const { table } = loadTemplate || hookData || tokenData || params || {};
|
|
56
|
+
const uid = user?.uid;
|
|
57
|
+
const formData = form || loadTemplate?.form
|
|
58
|
+
? await getTemplate("form", form || loadTemplate?.form)
|
|
59
|
+
: {};
|
|
60
|
+
const schema = formData?.schema || formData;
|
|
61
|
+
// skip non-present fields in form schema
|
|
62
|
+
if (!unittest &&
|
|
63
|
+
!tokenData?.ignoreCheck &&
|
|
64
|
+
headers["content-type"] === "application/json") {
|
|
65
|
+
Object.keys(body || {})
|
|
66
|
+
.filter((key) => !Object.keys(schema || {}).includes(key))
|
|
67
|
+
.forEach((key) => delete body[key]);
|
|
68
|
+
}
|
|
69
|
+
const xssCheck = checkXSS({ body, schema });
|
|
70
|
+
if (xssCheck.error && formData?.xssCheck !== false) {
|
|
71
|
+
logger.file("injection/xss", { msg: xssCheck.error, table }, req);
|
|
72
|
+
return reply
|
|
73
|
+
.status(409)
|
|
74
|
+
.send("Дані містять заборонені символи. Приберіть їх та спробуйте ще раз");
|
|
75
|
+
}
|
|
76
|
+
const fieldCheck = validateData({ body, schema });
|
|
77
|
+
if (fieldCheck.error) {
|
|
78
|
+
logger.file("injection/sql", {
|
|
79
|
+
table,
|
|
80
|
+
form: form || loadTemplate?.form,
|
|
81
|
+
uid: user?.uid,
|
|
82
|
+
...fieldCheck,
|
|
83
|
+
});
|
|
84
|
+
return reply
|
|
85
|
+
.status(409)
|
|
86
|
+
.send("Дані не пройшли валідацію. Приберіть некоректні дані та спробуйте ще раз");
|
|
87
|
+
}
|
|
88
|
+
if (tokenData?.obj) {
|
|
89
|
+
const objData = tokenData.obj?.split("#").reduce((p, el) => ({
|
|
90
|
+
...p,
|
|
91
|
+
[el.split("=")[0] || ""]: el.split("=")[1],
|
|
92
|
+
}), {}) || {};
|
|
93
|
+
Object.assign(body, objData);
|
|
94
|
+
}
|
|
95
|
+
const res = await dataUpdate({
|
|
96
|
+
pg,
|
|
97
|
+
table: loadTemplate?.table || table,
|
|
98
|
+
id,
|
|
99
|
+
data: body,
|
|
100
|
+
uid,
|
|
101
|
+
tokenData,
|
|
102
|
+
referer,
|
|
103
|
+
});
|
|
104
|
+
// admin.custom_column
|
|
105
|
+
await applyHook("afterUpdate", {
|
|
106
|
+
pg,
|
|
107
|
+
table: params?.table,
|
|
108
|
+
body,
|
|
109
|
+
payload: res,
|
|
110
|
+
user,
|
|
111
|
+
});
|
|
112
|
+
return reply.status(200).send(res);
|
|
113
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import update from "./controllers/update.js";
|
|
2
|
+
import insert from "./controllers/insert.js";
|
|
3
|
+
import deleteCrud from "./controllers/deleteCrud.js";
|
|
4
|
+
import table from "./controllers/table.js";
|
|
5
|
+
const tableSchema = {
|
|
6
|
+
type: "object",
|
|
7
|
+
properties: {
|
|
8
|
+
params: {
|
|
9
|
+
id: { type: "string", pattern: "^([\\w\\d_.]+)$" },
|
|
10
|
+
table: { type: "string", pattern: "^([\\w\\d_.]+)$" },
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
const policy = ["public"];
|
|
15
|
+
async function plugin(app, config = { prefix: "/api" }) {
|
|
16
|
+
const { prefix = "/api" } = config;
|
|
17
|
+
app.put(`${prefix}/table/:table/:id?`, { config: { policy }, schema: tableSchema }, update);
|
|
18
|
+
app.delete(`${prefix}/table/:table/:id?`, { config: { policy }, schema: tableSchema }, deleteCrud);
|
|
19
|
+
app.post(`${prefix}/table/:table/:id?`, { config: { policy }, schema: tableSchema }, insert);
|
|
20
|
+
app.get(`${prefix}/table/:table/:id?`, { config: { policy }, schema: tableSchema }, table);
|
|
21
|
+
}
|
|
22
|
+
export default plugin;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { config, dblist, getRedis } from "../../../../utils.js";
|
|
2
|
+
import formatData from "../utils/formatData.js";
|
|
3
|
+
const rclient = getRedis();
|
|
4
|
+
export default async function readItemList(req) {
|
|
5
|
+
const rows = formatData(dblist);
|
|
6
|
+
const uid = req.session?.passport?.user?.uid || // login db
|
|
7
|
+
req.session?.passport?.user?.username || // login passwd
|
|
8
|
+
"2";
|
|
9
|
+
const key = `current-db:${uid}`;
|
|
10
|
+
const ttl = config.redis ? await rclient.ttl(key) : null;
|
|
11
|
+
const currentId = config.redis ? await rclient.get(key) : null;
|
|
12
|
+
rclient.setex(key, 60 * 60 * 10000, currentId);
|
|
13
|
+
const { originalMaxAge, expires } = req.session?.cookie || {};
|
|
14
|
+
return {
|
|
15
|
+
ttl,
|
|
16
|
+
current: currentId || rows[0]?.id,
|
|
17
|
+
rows,
|
|
18
|
+
user: {
|
|
19
|
+
...req.user,
|
|
20
|
+
originalMaxAge,
|
|
21
|
+
expires,
|
|
22
|
+
uid,
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|