@opengis/fastify-table 1.4.87 → 1.5.0
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 +125 -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 +24 -17
- 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 -137
- 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
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { S3Client } from "@aws-sdk/client-s3";
|
|
2
|
+
import { createHash } from "crypto";
|
|
3
|
+
function md5(string) {
|
|
4
|
+
return createHash("md5").update(string).digest("hex");
|
|
5
|
+
}
|
|
6
|
+
const CLIENT_CACHE = {};
|
|
7
|
+
const getS3Client = ({ accessKeyId, secretAccessKey, user, password, endpoint, host, region = "us-west-2", }) => {
|
|
8
|
+
// md5 have a hign chance of collisions consider switching on highload
|
|
9
|
+
// if (!accessKeyId || !secretAccessKey || !endpoint) throw new Error('No required params');
|
|
10
|
+
const uniqueKey = md5(`${accessKeyId}${secretAccessKey}${endpoint}`);
|
|
11
|
+
let client = CLIENT_CACHE[uniqueKey];
|
|
12
|
+
if (client)
|
|
13
|
+
return client;
|
|
14
|
+
client = new S3Client({
|
|
15
|
+
credentials: {
|
|
16
|
+
accessKeyId: accessKeyId || user,
|
|
17
|
+
secretAccessKey: secretAccessKey || password,
|
|
18
|
+
},
|
|
19
|
+
endpoint: endpoint || host,
|
|
20
|
+
forcePathStyle: true,
|
|
21
|
+
region,
|
|
22
|
+
});
|
|
23
|
+
CLIENT_CACHE[uniqueKey] = client;
|
|
24
|
+
return client;
|
|
25
|
+
};
|
|
26
|
+
export default { getS3Client };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { GetObjectCommand } from "@aws-sdk/client-s3";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { createReadStream } from "node:fs";
|
|
4
|
+
import client from "../client.js";
|
|
5
|
+
import streamToBuffer from "../../utils/streamToBuffer.js";
|
|
6
|
+
// if not found on s3 => fs
|
|
7
|
+
import fsFuncs from "../../fs.js";
|
|
8
|
+
import getPath from "../../../utils/getPath.js";
|
|
9
|
+
import getS3FilePath from "./utils/getS3FilePath.js";
|
|
10
|
+
const getFileStream = (s3Settings) => async (fp, options = {}) => {
|
|
11
|
+
const filepath = getS3FilePath(fp, s3Settings);
|
|
12
|
+
const s3Client = client.getS3Client(s3Settings);
|
|
13
|
+
const bucketName = s3Settings.containerName;
|
|
14
|
+
const bucketParams = {
|
|
15
|
+
Bucket: bucketName,
|
|
16
|
+
Key: filepath[0] === "/" ? filepath?.slice(1) : filepath,
|
|
17
|
+
};
|
|
18
|
+
try {
|
|
19
|
+
const data = await s3Client.send(new GetObjectCommand(bucketParams));
|
|
20
|
+
if (options.buffer) {
|
|
21
|
+
return streamToBuffer(data.Body);
|
|
22
|
+
}
|
|
23
|
+
return data.Body;
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
const filepath1 = getPath(fp, options);
|
|
27
|
+
if (!filepath1) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const { fileExists } = fsFuncs();
|
|
31
|
+
const exists = await fileExists(filepath1);
|
|
32
|
+
if (!exists) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
if (options.buffer) {
|
|
36
|
+
return readFile(filepath1);
|
|
37
|
+
}
|
|
38
|
+
const fileStream = createReadStream(filepath1);
|
|
39
|
+
return fileStream;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
export default getFileStream;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { HeadObjectCommand, } from '@aws-sdk/client-s3';
|
|
2
|
+
import client from '../client.js';
|
|
3
|
+
import getPath from '../../../utils/getPath.js';
|
|
4
|
+
import getS3FilePath from './utils/getS3FilePath.js';
|
|
5
|
+
// if not found on s3 => fs
|
|
6
|
+
import isFileExists from '../../../utils/isFileExists.js';
|
|
7
|
+
const getFileMetadata = (s3Settings) => async (fp) => {
|
|
8
|
+
const filepath = getS3FilePath(fp, s3Settings);
|
|
9
|
+
const s3Client = client.getS3Client(s3Settings);
|
|
10
|
+
const bucketName = s3Settings.containerName;
|
|
11
|
+
const bucketParams = {
|
|
12
|
+
Bucket: bucketName,
|
|
13
|
+
Key: filepath[0] === '/' ? filepath?.slice(1) : filepath,
|
|
14
|
+
};
|
|
15
|
+
try {
|
|
16
|
+
const data = await s3Client.send(new HeadObjectCommand(bucketParams));
|
|
17
|
+
return data;
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
const filepath1 = getPath(fp);
|
|
21
|
+
return isFileExists(filepath1);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
export default getFileMetadata;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Upload } from "@aws-sdk/lib-storage";
|
|
2
|
+
import client from "../client.js";
|
|
3
|
+
import getValidData from "../../utils/getValidData.js";
|
|
4
|
+
import getDataSize from "../../utils/getDataSize.js";
|
|
5
|
+
import dataTypes from "../../utils/handlers/dataTypes.js";
|
|
6
|
+
import getMimeType from "../../mime/index.js";
|
|
7
|
+
import getS3FilePath from "./utils/getS3FilePath.js";
|
|
8
|
+
const uploadFile = (s3Settings) => async (fp, data) => {
|
|
9
|
+
const filepath = getS3FilePath(fp, s3Settings);
|
|
10
|
+
const validData = await getValidData({ data, types: [dataTypes.stream] });
|
|
11
|
+
const size = await getDataSize({ data });
|
|
12
|
+
const type = getMimeType(filepath);
|
|
13
|
+
try {
|
|
14
|
+
const s3Client = client.getS3Client(s3Settings);
|
|
15
|
+
const bucketName = s3Settings.containerName;
|
|
16
|
+
const bucketParams = {
|
|
17
|
+
Bucket: bucketName,
|
|
18
|
+
Key: filepath,
|
|
19
|
+
ContentLength: size,
|
|
20
|
+
ContentType: type,
|
|
21
|
+
Body: validData,
|
|
22
|
+
};
|
|
23
|
+
const parallelUpload = new Upload({
|
|
24
|
+
client: s3Client,
|
|
25
|
+
params: bucketParams,
|
|
26
|
+
});
|
|
27
|
+
const res = await parallelUpload.done();
|
|
28
|
+
// const res = await s3Client.send(new PutObjectCommand(bucketParams));
|
|
29
|
+
return res; // For unit tests.
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
throw new Error(`Upload error s3: ${err}. Message: ${err.message}. Keys: ${Object.keys(err)}. Filepath: ${filepath}. Data type: ${typeof validData}.`);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
export default uploadFile;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import config from "../../../../../../../config.js";
|
|
3
|
+
function getPath(fp, s3Settings) {
|
|
4
|
+
const filepath = fp.replace(/\\/g, "/");
|
|
5
|
+
if (s3Settings.folder && !filepath.includes(s3Settings.folder)) {
|
|
6
|
+
return path.join(s3Settings.folder, fp.startsWith("files") ? "" : "files", filepath);
|
|
7
|
+
}
|
|
8
|
+
return filepath;
|
|
9
|
+
}
|
|
10
|
+
function getS3FilePath(fp, s3Settings) {
|
|
11
|
+
const filepath = getPath(fp, s3Settings);
|
|
12
|
+
const unixPath = filepath.replace(/\\/g, "/").split("work/").pop();
|
|
13
|
+
const prefix = !filepath.includes(config.folder) ? config.folder : "";
|
|
14
|
+
const sufix = unixPath[0] === "/" ? "" : "/";
|
|
15
|
+
const s3FilePath = prefix + sufix + unixPath;
|
|
16
|
+
return s3FilePath;
|
|
17
|
+
}
|
|
18
|
+
export default getS3FilePath;
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import downloadFile from './funcs/downloadFile.js';
|
|
2
|
-
import fileExists from './funcs/fileExists.js';
|
|
3
|
-
import uploadFile from './funcs/uploadFile.js';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
1
|
+
import downloadFile from './funcs/downloadFile.js';
|
|
2
|
+
import fileExists from './funcs/fileExists.js';
|
|
3
|
+
import uploadFile from './funcs/uploadFile.js';
|
|
4
|
+
export default function s3Storage(opt) {
|
|
5
|
+
return {
|
|
6
|
+
name: 's3',
|
|
7
|
+
downloadFile: downloadFile(opt),
|
|
8
|
+
uploadFile: uploadFile(opt),
|
|
9
|
+
fileExists: fileExists(opt),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import isText from "./typeguards/isText.js";
|
|
2
|
+
import isPath from "./typeguards/isPath.js";
|
|
3
|
+
import isBuffer from "./typeguards/isBuffer.js";
|
|
4
|
+
import isReadableStream from "./typeguards/isReadableStream.js";
|
|
5
|
+
import isArray from "./typeguards/isArray.js";
|
|
6
|
+
import sizeHandlers from "./handlers/sizeHandlers.js";
|
|
7
|
+
const getDataSizeInBytes = async ({ data }) => {
|
|
8
|
+
const validators = [isReadableStream, isBuffer, isPath, isText, isArray];
|
|
9
|
+
const values = await Promise.all(validators.map(async (func) => ({
|
|
10
|
+
name: func.name,
|
|
11
|
+
bool: await func(data),
|
|
12
|
+
})));
|
|
13
|
+
const [value] = values.filter(({ bool }) => bool === true);
|
|
14
|
+
if (!value)
|
|
15
|
+
throw new Error("No support for this data type");
|
|
16
|
+
const handler = sizeHandlers[value.name];
|
|
17
|
+
return handler({ data });
|
|
18
|
+
};
|
|
19
|
+
export default getDataSizeInBytes;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import isText from "./typeguards/isText.js";
|
|
2
|
+
import isPath from "./typeguards/isPath.js";
|
|
3
|
+
import isBuffer from "./typeguards/isBuffer.js";
|
|
4
|
+
import isReadableStream from "./typeguards/isReadableStream.js";
|
|
5
|
+
import isArray from "./typeguards/isArray.js";
|
|
6
|
+
import convertHandlers from "./handlers/index.js";
|
|
7
|
+
const getValidData = async ({ data, types }) => {
|
|
8
|
+
// chain of responsibility
|
|
9
|
+
const validators = [isReadableStream, isBuffer, isPath, isText, isArray];
|
|
10
|
+
const values = await Promise.all(validators.map(async (func) => ({
|
|
11
|
+
name: func.name,
|
|
12
|
+
bool: await func(data),
|
|
13
|
+
})));
|
|
14
|
+
const isValid = !values.reduce((acc, { name, bool }) => {
|
|
15
|
+
let valid = false;
|
|
16
|
+
types.forEach((dataType) => {
|
|
17
|
+
if (name === dataType)
|
|
18
|
+
valid = bool;
|
|
19
|
+
});
|
|
20
|
+
return acc && !valid;
|
|
21
|
+
}, true);
|
|
22
|
+
if (isValid)
|
|
23
|
+
return data;
|
|
24
|
+
const [value] = values.filter(({ bool }) => bool === true);
|
|
25
|
+
if (!value)
|
|
26
|
+
throw new Error("No support for this data type");
|
|
27
|
+
const handler = convertHandlers[value.name];
|
|
28
|
+
return handler({ data, types });
|
|
29
|
+
};
|
|
30
|
+
export default getValidData;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { readFile } from "fs/promises";
|
|
2
|
+
import { createReadStream } from "fs";
|
|
3
|
+
import { Readable } from "stream";
|
|
4
|
+
import dataTypes from "./dataTypes.js";
|
|
5
|
+
const handlers = {
|
|
6
|
+
isReadableStream: () => "Unsupported",
|
|
7
|
+
isBuffer: ({ data, types }) => {
|
|
8
|
+
if (types.includes(dataTypes.stream)) {
|
|
9
|
+
return Readable.from(data);
|
|
10
|
+
}
|
|
11
|
+
return null;
|
|
12
|
+
},
|
|
13
|
+
isArray: ({ data, types }) => {
|
|
14
|
+
if (types.includes(dataTypes.stream)) {
|
|
15
|
+
return Readable.from(Buffer.from(data));
|
|
16
|
+
}
|
|
17
|
+
if (types.includes(dataTypes.buffer)) {
|
|
18
|
+
return Buffer.from(data, "utf-8");
|
|
19
|
+
}
|
|
20
|
+
if (types.includes(dataTypes.path)) {
|
|
21
|
+
return "Unsupported";
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
},
|
|
25
|
+
isPath: async ({ data, types }) => {
|
|
26
|
+
if (types.includes(dataTypes.stream)) {
|
|
27
|
+
return createReadStream(data);
|
|
28
|
+
}
|
|
29
|
+
if (types.includes(dataTypes.buffer)) {
|
|
30
|
+
return readFile(data);
|
|
31
|
+
}
|
|
32
|
+
if (types.includes(dataTypes.text)) {
|
|
33
|
+
return (await readFile(data)).toString();
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
},
|
|
37
|
+
isText: async ({ data, types }) => {
|
|
38
|
+
if (types.includes(dataTypes.stream)) {
|
|
39
|
+
return Readable.from(Buffer.from(data));
|
|
40
|
+
}
|
|
41
|
+
if (types.includes(dataTypes.buffer)) {
|
|
42
|
+
return Buffer.from(data, "utf-8");
|
|
43
|
+
}
|
|
44
|
+
if (types.includes(dataTypes.path)) {
|
|
45
|
+
return "Unsupported";
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
export default handlers;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { stat } from "fs/promises";
|
|
2
|
+
const handlers = {
|
|
3
|
+
isReadableStream: () => "Unsupported",
|
|
4
|
+
isBuffer: ({ data }) => data.length,
|
|
5
|
+
isArray: ({ data }) => Buffer.byteLength(data),
|
|
6
|
+
isPath: async ({ data }) => (await stat(data)).size,
|
|
7
|
+
isText: ({ data }) => Buffer.byteLength(data),
|
|
8
|
+
};
|
|
9
|
+
export default handlers;
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
const isArray = (array) => Array.isArray(array);
|
|
2
|
-
|
|
3
|
-
export default isArray;
|
|
1
|
+
const isArray = (array) => Array.isArray(array);
|
|
2
|
+
export default isArray;
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
const isBuffer = (buffer) => Buffer.isBuffer(buffer);
|
|
2
|
-
|
|
3
|
-
export default isBuffer;
|
|
1
|
+
const isBuffer = (buffer) => Buffer.isBuffer(buffer);
|
|
2
|
+
export default isBuffer;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/* eslint-disable no-underscore-dangle */
|
|
2
|
+
const isReadableStream = (stream) => stream !== null
|
|
3
|
+
&& typeof stream === 'object'
|
|
4
|
+
&& typeof stream.pipe === 'function'
|
|
5
|
+
&& typeof stream._read === 'function'
|
|
6
|
+
&& typeof stream._readableState === 'object';
|
|
7
|
+
export default isReadableStream;
|
|
@@ -1,3 +1,2 @@
|
|
|
1
|
-
const isText = (text) => text !== null && typeof text === 'string';
|
|
2
|
-
|
|
3
|
-
export default isText;
|
|
1
|
+
const isText = (text) => text !== null && typeof text === 'string';
|
|
2
|
+
export default isText;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import providers from "./providers/index.js";
|
|
3
|
+
async function uploadFile(filePath, data, options = {}) {
|
|
4
|
+
const filename = path.basename(filePath);
|
|
5
|
+
// prefix
|
|
6
|
+
const prefix = (options.prefix === "date"
|
|
7
|
+
? new Date().toISOString().split("T")[0]
|
|
8
|
+
: null) || (options.prefix === "3s" ? filename.substring(0, 3) : "");
|
|
9
|
+
const relativePath = path.join(path.dirname(filePath), prefix, filename);
|
|
10
|
+
const fp = providers(options);
|
|
11
|
+
await fp.uploadFile(relativePath, data, options);
|
|
12
|
+
return relativePath;
|
|
13
|
+
}
|
|
14
|
+
export default uploadFile;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
4
|
+
import { randomUUID } from "node:crypto";
|
|
5
|
+
import { imageSize } from "image-size";
|
|
6
|
+
import { existsSync } from "node:fs";
|
|
7
|
+
import config from "../../../config.js";
|
|
8
|
+
import providers from "./providers/index.js";
|
|
9
|
+
import { all, images } from "./utils/allowedExtensions.js";
|
|
10
|
+
import grpc from "../grpc/grpc.js";
|
|
11
|
+
import getFileType from "./utils/getFileType.js";
|
|
12
|
+
const { resizeImage } = grpc();
|
|
13
|
+
const { resizeImageMinSize = 5 } = config; // resize images >= 5 MB by default
|
|
14
|
+
async function writeFileToDisk(file, buffer) {
|
|
15
|
+
if (!file?.filepath || !file.extension || !buffer) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
// resize big images
|
|
19
|
+
if (images.find((el) => el === file.extension) &&
|
|
20
|
+
file.size >= resizeImageMinSize * 1024 * 1024) {
|
|
21
|
+
const { width = 320, height = 240 } = imageSize(buffer) || {};
|
|
22
|
+
const ratio = width / height;
|
|
23
|
+
const resizeWidth = Math.min(width, 2048);
|
|
24
|
+
const resizeHeight = resizeWidth / ratio;
|
|
25
|
+
const { result } = await resizeImage({
|
|
26
|
+
base64: buffer.toString("base64"),
|
|
27
|
+
width: resizeWidth,
|
|
28
|
+
height: resizeHeight,
|
|
29
|
+
quality: 75,
|
|
30
|
+
});
|
|
31
|
+
await writeFile(`${file.filepath.replace(`.${file.extension}`, `_original.${file.extension}`)}`, buffer);
|
|
32
|
+
await writeFile(file.filepath, Buffer.from(result, "base64"));
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
await writeFile(file.filepath, buffer);
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
export default async function uploadMultiPart(req, { extensions, raw, subdir, originalFilename = false } = {}) {
|
|
39
|
+
const allowedExtensions = req.routeOptions?.url === "/file/upload-image/*" ? images : all;
|
|
40
|
+
const parts = req.parts();
|
|
41
|
+
// const part = await parts.next();
|
|
42
|
+
const { value: part, done } = await parts.next();
|
|
43
|
+
if (done) {
|
|
44
|
+
throw new Error("parts already processed");
|
|
45
|
+
}
|
|
46
|
+
const value = part?.fields?.file || part;
|
|
47
|
+
if (!value?.file?.on || !value?.filename) {
|
|
48
|
+
throw new Error("upload error");
|
|
49
|
+
}
|
|
50
|
+
const ext = path.extname(value.filename).toLowerCase();
|
|
51
|
+
if (Array.isArray(extensions) && !extensions.includes(ext)) {
|
|
52
|
+
throw new Error("file extension is not allowed");
|
|
53
|
+
}
|
|
54
|
+
// check extension
|
|
55
|
+
if (!allowedExtensions.includes(ext.substring(1))) {
|
|
56
|
+
throw new Error("file extension is not allowed");
|
|
57
|
+
}
|
|
58
|
+
const fileBuffer = await new Promise((res, rej) => {
|
|
59
|
+
const chunks = [];
|
|
60
|
+
value.file.on("data", (chunk) => chunks.push(chunk));
|
|
61
|
+
value.file.on("end", () => res(Buffer.concat(chunks)));
|
|
62
|
+
value.file.on("error", rej);
|
|
63
|
+
});
|
|
64
|
+
if (!fileBuffer?.length) {
|
|
65
|
+
throw new Error("file buffer is empty");
|
|
66
|
+
}
|
|
67
|
+
if (raw)
|
|
68
|
+
return { buffer: fileBuffer, filename: value.filename, ext }; // return buffer for custom upload
|
|
69
|
+
const dir = subdir != null ? subdir : req.params?.["*"] || "uploads";
|
|
70
|
+
const yearMonthDay = subdir != null ? "" : new Date().toISOString().split("T")[0];
|
|
71
|
+
const dbname = req.pg?.options?.database || req.pg?.database || config.pg?.database; // request / config params / default config params
|
|
72
|
+
const rootDir = config.root || `/data/local/${dbname || ""}`;
|
|
73
|
+
const reldirpath = path.join("/files", dir, yearMonthDay);
|
|
74
|
+
const folder = path.join(rootDir, config.folder || "", reldirpath);
|
|
75
|
+
const newFilename = originalFilename
|
|
76
|
+
? value.filename
|
|
77
|
+
: `${randomUUID()}${ext}`;
|
|
78
|
+
if (existsSync(path.join(folder, newFilename).replace(/\\/g, "/"))) {
|
|
79
|
+
throw new Error("file with specified name already exists in directory");
|
|
80
|
+
}
|
|
81
|
+
const file = {
|
|
82
|
+
originalFilename: value.filename,
|
|
83
|
+
newFilename,
|
|
84
|
+
filepath: path.join(folder, newFilename).replace(/\\/g, "/"),
|
|
85
|
+
filetype: getFileType(newFilename),
|
|
86
|
+
relativeFilepath: path.join(reldirpath, newFilename).replace(/\\/g, "/"),
|
|
87
|
+
size: Buffer.byteLength(fileBuffer),
|
|
88
|
+
mimetype: value.mimetype,
|
|
89
|
+
extension: ext.substring(1),
|
|
90
|
+
};
|
|
91
|
+
await mkdir(folder, { recursive: true });
|
|
92
|
+
await writeFileToDisk(file, fileBuffer);
|
|
93
|
+
// move file to s3
|
|
94
|
+
if (config.s3?.endpoint) {
|
|
95
|
+
const s3 = providers();
|
|
96
|
+
await s3.uploadFile(file.relativeFilepath, fileBuffer);
|
|
97
|
+
if (config.trace)
|
|
98
|
+
console.log("upload to s3", file.relativeFilepath);
|
|
99
|
+
}
|
|
100
|
+
return file;
|
|
101
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
const all = [
|
|
2
|
+
"jpg",
|
|
3
|
+
"jpeg",
|
|
4
|
+
"png",
|
|
5
|
+
"json",
|
|
6
|
+
"geojson",
|
|
7
|
+
"pdf",
|
|
8
|
+
"doc",
|
|
9
|
+
"docx",
|
|
10
|
+
"xks",
|
|
11
|
+
"csv",
|
|
12
|
+
"xls",
|
|
13
|
+
"xlsx",
|
|
14
|
+
"txt",
|
|
15
|
+
"log",
|
|
16
|
+
"mp4",
|
|
17
|
+
"mov",
|
|
18
|
+
"avi",
|
|
19
|
+
"zip",
|
|
20
|
+
"rar",
|
|
21
|
+
"7z",
|
|
22
|
+
"gz",
|
|
23
|
+
"geotiff",
|
|
24
|
+
"tiff",
|
|
25
|
+
"tif",
|
|
26
|
+
"svg",
|
|
27
|
+
"p7s",
|
|
28
|
+
"asice",
|
|
29
|
+
"shp",
|
|
30
|
+
"xml",
|
|
31
|
+
"gpkg",
|
|
32
|
+
"dmf",
|
|
33
|
+
"dwg",
|
|
34
|
+
"ico",
|
|
35
|
+
"ppt",
|
|
36
|
+
"pptx",
|
|
37
|
+
];
|
|
38
|
+
const images = ["jpg", "jpeg", "png", "tiff", "tif", "ico", "svg"];
|
|
39
|
+
const videos = ["mp4", "mov", "avi"];
|
|
40
|
+
const documents = [
|
|
41
|
+
"pdf",
|
|
42
|
+
"doc",
|
|
43
|
+
"docx",
|
|
44
|
+
"xks",
|
|
45
|
+
"csv",
|
|
46
|
+
"xls",
|
|
47
|
+
"xlsx",
|
|
48
|
+
"txt",
|
|
49
|
+
"log",
|
|
50
|
+
"xml",
|
|
51
|
+
"ppt",
|
|
52
|
+
"pptx",
|
|
53
|
+
];
|
|
54
|
+
export { all, images, videos, documents };
|
|
55
|
+
export default {
|
|
56
|
+
all,
|
|
57
|
+
images,
|
|
58
|
+
videos,
|
|
59
|
+
documents,
|
|
60
|
+
};
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import { images, videos, documents } from './allowedExtensions.js';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
if (videos.includes(ext))
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import path from 'node:path';
|
|
2
|
+
import { images, videos, documents } from './allowedExtensions.js';
|
|
3
|
+
export default function getFileType(filename) {
|
|
4
|
+
const ext = path.extname(filename).toLocaleLowerCase().slice(1);
|
|
5
|
+
if (images.includes(ext))
|
|
6
|
+
return 'image';
|
|
7
|
+
if (videos.includes(ext))
|
|
8
|
+
return 'video';
|
|
9
|
+
if (documents.includes(ext))
|
|
10
|
+
return 'document';
|
|
11
|
+
return 'other';
|
|
12
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import config from "../../../../config.js";
|
|
3
|
+
function getPath(filepath, options = {}) {
|
|
4
|
+
// used at getValidData
|
|
5
|
+
if (typeof filepath !== "string" && options?.check) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
if (typeof filepath !== "string") {
|
|
9
|
+
throw new Error("invalid filepath type");
|
|
10
|
+
}
|
|
11
|
+
// full path support + windows drive
|
|
12
|
+
const relpath = filepath.replace(/\\/g, "/");
|
|
13
|
+
const isFull = relpath.substring(0, 14).includes("/data/local/") ||
|
|
14
|
+
Object.values(config.fileStorage || {}).find((el) => relpath.includes(el));
|
|
15
|
+
if (isFull)
|
|
16
|
+
return relpath;
|
|
17
|
+
const rootDir = config.root || `/data/local/${options.database || config.pg?.database}`;
|
|
18
|
+
const sufix = ["files", "/files"].find((el) => relpath.startsWith(el))
|
|
19
|
+
? ""
|
|
20
|
+
: "files";
|
|
21
|
+
const prefix = !relpath.toLowerCase().includes(rootDir.toLowerCase())
|
|
22
|
+
? rootDir
|
|
23
|
+
: "";
|
|
24
|
+
if (config.folder &&
|
|
25
|
+
!relpath.toLowerCase().includes(config.folder.toLowerCase())) {
|
|
26
|
+
return path.join(prefix, config.folder, sufix, relpath);
|
|
27
|
+
}
|
|
28
|
+
return path.join(prefix, relpath);
|
|
29
|
+
}
|
|
30
|
+
export default getPath;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { access } from "node:fs/promises";
|
|
2
|
+
import getPath from "./getPath.js";
|
|
3
|
+
const isFileExists = async (filepath, options = {}) => {
|
|
4
|
+
const fullPath = getPath(filepath, options);
|
|
5
|
+
if (!fullPath)
|
|
6
|
+
return false;
|
|
7
|
+
try {
|
|
8
|
+
await access(fullPath);
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
catch (err) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
export default isFileExists;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import downloadFile from "../file/downloadFile.js";
|
|
3
|
+
import getGRPC from "./grpc.js";
|
|
4
|
+
const grpc = getGRPC();
|
|
5
|
+
const file2json = async ({ buffer: buffer1, ext: ext1, filepath = "", encoding: encoding1 = "UTF-8", debug, }) => {
|
|
6
|
+
if (!filepath && !(buffer1?.length && ext1))
|
|
7
|
+
return null;
|
|
8
|
+
const ext = ext1 || path.extname(filepath || "");
|
|
9
|
+
const encoding = { CP1251: "windows-1251" }[encoding1] || encoding1;
|
|
10
|
+
const buffer = buffer1 ||
|
|
11
|
+
(await downloadFile(filepath, { provider: "fs", buffer: true, debug })) ||
|
|
12
|
+
"{}";
|
|
13
|
+
if (debug)
|
|
14
|
+
return { filepath, buffer };
|
|
15
|
+
if ([".xls", ".xlsx"].includes(ext)) {
|
|
16
|
+
const { result } = await grpc.excelToJson({
|
|
17
|
+
base64: buffer.toString("base64"),
|
|
18
|
+
type: "xls",
|
|
19
|
+
});
|
|
20
|
+
const json = typeof result === "object" ? result : JSON.parse(result || {});
|
|
21
|
+
return json;
|
|
22
|
+
}
|
|
23
|
+
if ([".csv", ".txt"].includes(ext)) {
|
|
24
|
+
const { result } = await grpc.excelToJson({
|
|
25
|
+
base64: buffer.toString("base64"),
|
|
26
|
+
type: "csv",
|
|
27
|
+
encoding,
|
|
28
|
+
});
|
|
29
|
+
const json = typeof result === "object" ? result : JSON.parse(result || {});
|
|
30
|
+
return json;
|
|
31
|
+
}
|
|
32
|
+
if ([".zip"].includes(ext)) {
|
|
33
|
+
const { result } = await grpc.shpToGeojson({
|
|
34
|
+
base64: buffer.toString("base64"),
|
|
35
|
+
encoding,
|
|
36
|
+
});
|
|
37
|
+
const json = typeof result === "object" ? result : JSON.parse(result);
|
|
38
|
+
return json;
|
|
39
|
+
}
|
|
40
|
+
if ([".xml"].includes(ext)) {
|
|
41
|
+
const { result } = await grpc.xmlToJson({ xml: buffer.toString("utf-8") });
|
|
42
|
+
const json = typeof result === "object" ? result : JSON.parse(result);
|
|
43
|
+
return json;
|
|
44
|
+
}
|
|
45
|
+
if ([".geojson", ".json"].includes(ext)) {
|
|
46
|
+
return JSON.parse(buffer.toString("utf-8"));
|
|
47
|
+
}
|
|
48
|
+
return filepath.replace(/"/g, "");
|
|
49
|
+
};
|
|
50
|
+
export default file2json;
|