@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
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
|
|
3
|
-
import providers from '../../../plugins/file/providers/index.js';
|
|
4
|
-
import getMimeType from '../../../plugins/file/providers/mime/index.js';
|
|
5
|
-
|
|
6
|
-
/* const allowedPublicDirs = [
|
|
7
|
-
'upload', 'page', 'site', 'maps', 'tmp', 'uploads', 'site_slider', 'module', 'product', 'image', 'geo_works_file',
|
|
8
|
-
]; */
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Апі використовується для скачування файлів за допомогою fs або s3
|
|
12
|
-
*
|
|
13
|
-
* @method GET
|
|
14
|
-
* @summary Апі для скачування файлів за провайдером
|
|
15
|
-
* @priority 4
|
|
16
|
-
* @alias download
|
|
17
|
-
* @type api
|
|
18
|
-
* @tag file
|
|
19
|
-
* @requires getMimeType
|
|
20
|
-
* @param {Object} params Параметри URL
|
|
21
|
-
* @errors 400,404,403,500
|
|
22
|
-
* @returns {Number} status Номер помилки
|
|
23
|
-
* @returns {String|Object} error Опис помилки
|
|
24
|
-
* @returns {Object} headers Заголовки HTTP
|
|
25
|
-
* @returns {String} pipe Шлях до файла для скачування або відображення
|
|
26
|
-
*/
|
|
27
|
-
|
|
28
|
-
async function download({
|
|
29
|
-
params,
|
|
30
|
-
}, reply) {
|
|
31
|
-
if (!params?.['*']) return { message: 'not enough params', status: 400 };
|
|
32
|
-
|
|
33
|
-
const filename = params['*'].startsWith('/') ? params['*'].slice(1) : params['*'];
|
|
34
|
-
if (!filename) return { message: "required param 'filename'", status: 400 };
|
|
35
|
-
|
|
36
|
-
if (filename?.includes?.('..')) return { message: 'wrong params', status: 400 };
|
|
37
|
-
|
|
38
|
-
/* const { security } = getSettings();
|
|
39
|
-
const { enabled: externalAccess } = await pg.one('select enabled from admin.data_api where account_name = $1 and api_key = $2', { args: [account, key] });
|
|
40
|
-
if ((sid === 35 && !isUser && !externalAccess)
|
|
41
|
-
|| (sid === 1
|
|
42
|
-
&& !allowedPublicDirs.some((dir) => filename?.includes?.(`${dir}/`))
|
|
43
|
-
&& !security?.public_dirs?.split(',')?.some((dir) => filename?.includes?.(`${dir}/`)))
|
|
44
|
-
) {
|
|
45
|
-
return { error: 'Немає доступу', status: 403 };
|
|
46
|
-
} */
|
|
47
|
-
|
|
48
|
-
const filepath = filename.startsWith('files/')
|
|
49
|
-
? filename
|
|
50
|
-
: path.join('files', filename);
|
|
51
|
-
|
|
52
|
-
// download
|
|
53
|
-
const fp = providers({});
|
|
54
|
-
|
|
55
|
-
const fileStream = await fp.downloadFile(filepath);
|
|
56
|
-
if (!fileStream) return { error: `Файл не знайдено - ${filename}`, status: 404 };
|
|
57
|
-
|
|
58
|
-
const headers = {
|
|
59
|
-
'Content-Disposition': `attachment; filename=${path.basename(filename)}`,
|
|
60
|
-
'Content-Type': getMimeType(filepath),
|
|
61
|
-
};
|
|
62
|
-
reply.headers(headers);
|
|
63
|
-
return fileStream;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
export default download;
|
|
@@ -1,290 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-console */
|
|
2
|
-
/* eslint-disable no-param-reassign */
|
|
3
|
-
/* eslint-disable no-plusplus */
|
|
4
|
-
/* eslint-disable no-await-in-loop */
|
|
5
|
-
/* eslint-disable no-nested-ternary */
|
|
6
|
-
import path from 'node:path';
|
|
7
|
-
import { createHash } from 'node:crypto';
|
|
8
|
-
import { existsSync } from 'node:fs';
|
|
9
|
-
import {
|
|
10
|
-
mkdir, readFile, rm, writeFile,
|
|
11
|
-
} from 'node:fs/promises';
|
|
12
|
-
|
|
13
|
-
import config from '../../../../config.js';
|
|
14
|
-
import logger from '../../../plugins/logger/getLogger.js';
|
|
15
|
-
import getTemplate from '../../../plugins/table/funcs/getTemplate.js';
|
|
16
|
-
import getMeta from '../../../plugins/pg/funcs/getMeta.js';
|
|
17
|
-
import pgClients from '../../../plugins/pg/pgClients.js';
|
|
18
|
-
import eventStream from '../../../plugins/util/funcs/eventStream.js';
|
|
19
|
-
import getData from '../../../plugins/table/funcs/getData.js';
|
|
20
|
-
import getFolder from '../../../plugins/crud/funcs/utils/getFolder.js';
|
|
21
|
-
import metaFormat from '../../../plugins/table/funcs/metaFormat/index.js';
|
|
22
|
-
|
|
23
|
-
import jsonToXls from './utils/jsonToXls.js';
|
|
24
|
-
import jsonToCsv from './utils/jsonToCsv.js';
|
|
25
|
-
import formatResult from './utils/formatResult.js';
|
|
26
|
-
|
|
27
|
-
const startStreamWithTotal = 10000;
|
|
28
|
-
const rootDir = getFolder(config, 'local');
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Експорт даних з таблиці
|
|
32
|
-
*
|
|
33
|
-
* @method GET
|
|
34
|
-
* @alias exportTable
|
|
35
|
-
* @type api
|
|
36
|
-
* @tag export
|
|
37
|
-
* @summary Експорт даних у таблицю(xlsx, csv, json, geojson)
|
|
38
|
-
* @priority 1
|
|
39
|
-
* @example
|
|
40
|
-
* /api/export?table=com_property.subjects.table&format=csv&cols=economy_type,name_ua
|
|
41
|
-
* @param {String} format Формат документу на виході
|
|
42
|
-
* @param {Boolean} nocache Чи використовувати кеш
|
|
43
|
-
* @param {String} table Таблиця в БД
|
|
44
|
-
* @param {String|Number} filter Параметр фільтру для застосування до експортованих даних
|
|
45
|
-
* @errors 400, 500
|
|
46
|
-
* @returns {Number} status Номер помилки
|
|
47
|
-
* @returns {String} error Опис помилки
|
|
48
|
-
* @returns {String|Object} message Повертає SQL запит або opt або рядки SQL запиту
|
|
49
|
-
* @returns {String} file Шлях до файла для скачування або відображення
|
|
50
|
-
*/
|
|
51
|
-
|
|
52
|
-
export default async function exportTable({
|
|
53
|
-
pg = pgClients.client, user, unittest, columns: columns1, cls, query = {}, host = '127.0.0.1', tableSql, sourceName,
|
|
54
|
-
}, reply) {
|
|
55
|
-
const {
|
|
56
|
-
id, cols, search, format = 'json',
|
|
57
|
-
table, filter = 'empty', nocache,
|
|
58
|
-
formatAnswer = 'file', sql, stream,
|
|
59
|
-
} = query;
|
|
60
|
-
|
|
61
|
-
if (!table && !tableSql) {
|
|
62
|
-
return reply.status(400).send('not enough params: table');
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
if (!['csv', 'xlsx', 'json', 'geojson'].includes(format)) {
|
|
66
|
-
return reply.status(400).send('param format is invalid');
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const date = new Date();
|
|
70
|
-
const sufixName = `${filter}-${cols || 'all'}-${search}-${query.limit || 'unlimited'}`;
|
|
71
|
-
const sufixDate = [date.getFullYear(), date.getMonth(), date.getDate(), date.getHours()].join('-');
|
|
72
|
-
const objInfo = createHash('md5').update([sufixName, sufixDate].join('-')).digest('hex');
|
|
73
|
-
const fileName = (table || (tableSql ? createHash('md5').update(tableSql).digest('hex') : '')).concat('_').concat(objInfo).concat('.').concat(format);
|
|
74
|
-
|
|
75
|
-
const filePath = path.join(rootDir, '/files/temp', fileName);
|
|
76
|
-
const ext = path.extname(filePath);
|
|
77
|
-
const cacheFile = existsSync(filePath);
|
|
78
|
-
|
|
79
|
-
const filePathJSON = ['csv', 'xlsx', 'geojson'].includes(format) ? filePath.replace(ext, '.json') : filePath;
|
|
80
|
-
const cacheFileJSON = existsSync(filePathJSON);
|
|
81
|
-
|
|
82
|
-
// return from cache
|
|
83
|
-
if (cacheFile && !sql && !nocache && !config.disableCache) {
|
|
84
|
-
return formatResult({
|
|
85
|
-
filePath, formatAnswer, folder: rootDir, reply,
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// delete old file, prevent append
|
|
90
|
-
if (nocache || config.disableCache) {
|
|
91
|
-
if (cacheFile) await rm(filePath);
|
|
92
|
-
if (cacheFileJSON && format !== 'json') await rm(filePathJSON);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
const loadTable = await getTemplate('table', table);
|
|
96
|
-
|
|
97
|
-
const meta = await getMeta({ pg, table: loadTable?.table || table });
|
|
98
|
-
|
|
99
|
-
if (!meta?.pk && !meta?.view && !tableSql) {
|
|
100
|
-
return reply.status(404).send('table not found');
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
if (format === 'geojson' && !meta?.geom) {
|
|
104
|
-
return reply.status(400).send('Ця форма не містить полів геометрії. Виберіть тип, який не потребує геометрії для вивантаження');
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
const options = {
|
|
108
|
-
id,
|
|
109
|
-
table,
|
|
110
|
-
pg,
|
|
111
|
-
filter,
|
|
112
|
-
search,
|
|
113
|
-
user,
|
|
114
|
-
sql,
|
|
115
|
-
sufix: false,
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
// check total count, debug sql etc.
|
|
119
|
-
const result = tableSql
|
|
120
|
-
? await pg.query(`select count(*) as total, json_agg(row_to_json(q)) as rows from (${tableSql})q`).then(el => el.rows?.[0] || {})
|
|
121
|
-
: await getData(options, reply, true);
|
|
122
|
-
|
|
123
|
-
if (sql) return result;
|
|
124
|
-
|
|
125
|
-
if (!result?.rows?.length) {
|
|
126
|
-
return reply.status(200).send('Немає даних, які можна експортувати');
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
const { total, filtered = result.total || 0 } = result;
|
|
130
|
-
|
|
131
|
-
const limit = startStreamWithTotal > filtered
|
|
132
|
-
? filtered
|
|
133
|
-
: (Math.min(query.limit || 1000, startStreamWithTotal) || startStreamWithTotal);
|
|
134
|
-
|
|
135
|
-
Object.assign(options, { limit });
|
|
136
|
-
|
|
137
|
-
const colmodel = (columns1 || loadTable?.columns || meta?.columns || [])?.map((el) => ({
|
|
138
|
-
name: el.name,
|
|
139
|
-
data: el.data || el.option,
|
|
140
|
-
title: el.title || el.ua,
|
|
141
|
-
type: el.type || el.format || 'text',
|
|
142
|
-
html: el.html,
|
|
143
|
-
})); // skip html to avoid errors
|
|
144
|
-
|
|
145
|
-
// get present columns
|
|
146
|
-
const columns = cols === 'all' || !cols ? colmodel : colmodel
|
|
147
|
-
?.filter((el) => (el.type || /\./.test(el.name))
|
|
148
|
-
&& !el?.hidden && (cols?.split(',')?.length ? cols.split(',').includes(el.name) : true))
|
|
149
|
-
?.filter(el => (Object.hasOwn(el, 'export') ? !el.export : true));
|
|
150
|
-
|
|
151
|
-
const htmls = columns.filter(el => el.html).reduce((acc, curr) => ({ ...acc, [curr.name]: curr.html }), {});
|
|
152
|
-
|
|
153
|
-
const columnList = columns?.map((el) => (/\./.test(el.name)
|
|
154
|
-
? `${el.name.split('.')[0]}->>'${el.name.split('.')[1]}' as ${el.name.split('.').pop()}` // check for json data
|
|
155
|
-
: el.name));
|
|
156
|
-
|
|
157
|
-
const send = (+filtered > startStreamWithTotal || stream) && !unittest
|
|
158
|
-
? eventStream(reply)
|
|
159
|
-
: (unittest ? console.log : () => { });
|
|
160
|
-
|
|
161
|
-
// export xlsx / csv / json
|
|
162
|
-
const source = loadTable?.title || loadTable?.ua || table || sourceName;
|
|
163
|
-
|
|
164
|
-
const interval = setInterval(async () => {
|
|
165
|
-
send('process query...');
|
|
166
|
-
}, 5000);
|
|
167
|
-
|
|
168
|
-
// start stream only if total exceed limit, but use while anyway
|
|
169
|
-
const res = {};
|
|
170
|
-
let offset = 0;
|
|
171
|
-
let page = 1;
|
|
172
|
-
let seq = 0;
|
|
173
|
-
|
|
174
|
-
send(`Всього в реєстрі: ${result.total} (${filtered} з урахуванням фільтрів)`);
|
|
175
|
-
|
|
176
|
-
if (!cacheFileJSON || nocache || config.disableCache) {
|
|
177
|
-
while ((+filtered - offset > 0) && !res?.error) {
|
|
178
|
-
try {
|
|
179
|
-
send(`Оброблено: ${offset}/${filtered}`);
|
|
180
|
-
|
|
181
|
-
const { rows = [] } = tableSql
|
|
182
|
-
? await pg.query(`select * from (${tableSql})q limit ${options.limit} offset ${offset}`)
|
|
183
|
-
: await getData({ ...options, page }, reply, true);
|
|
184
|
-
send(`seq: ${++seq}`);
|
|
185
|
-
send(`Обробка ${rows.length} об'єктів...`);
|
|
186
|
-
|
|
187
|
-
if (!rows.length) {
|
|
188
|
-
send('Обробка даних успішно завершена');
|
|
189
|
-
break;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
await metaFormat({
|
|
193
|
-
rows, cls, htmls, sufix: false,
|
|
194
|
-
}, pg);
|
|
195
|
-
// skip non present after metaFormat
|
|
196
|
-
if (!tableSql) {
|
|
197
|
-
rows.forEach((row) => {
|
|
198
|
-
Object.keys(row).filter((el) => !columnList.includes(el)).forEach((key) => delete row[key]);
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
const jsonFileExists = existsSync(filePathJSON);
|
|
203
|
-
|
|
204
|
-
// convert from json to format
|
|
205
|
-
if (!jsonFileExists) { // if json not exists
|
|
206
|
-
await mkdir(path.dirname(filePath), { recursive: true });
|
|
207
|
-
await writeFile(filePathJSON, JSON.stringify(rows));
|
|
208
|
-
}
|
|
209
|
-
else { // if json exists
|
|
210
|
-
const jsonData = JSON.parse(await readFile(filePathJSON) || '{}');
|
|
211
|
-
const moreData = jsonData.concat(rows); // rewrite to appendFile?
|
|
212
|
-
await writeFile(filePathJSON, JSON.stringify(moreData));
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
offset += rows.length;
|
|
216
|
-
page++;
|
|
217
|
-
}
|
|
218
|
-
catch (err) {
|
|
219
|
-
send(`error: ${err.toString()}`);
|
|
220
|
-
logger.file('export/table/error', {
|
|
221
|
-
filePath: filePathJSON,
|
|
222
|
-
total,
|
|
223
|
-
filtered,
|
|
224
|
-
offset,
|
|
225
|
-
result: res,
|
|
226
|
-
error: err.toString(),
|
|
227
|
-
stack: err.stack,
|
|
228
|
-
});
|
|
229
|
-
Object.assign(res, { error: err.toString() });
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
clearInterval(interval);
|
|
235
|
-
|
|
236
|
-
if (res.error) {
|
|
237
|
-
send(res.error, 1);
|
|
238
|
-
return reply.status(500).send(res.error);
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
logger.file('export/table', {
|
|
242
|
-
table, format, total, filtered, time: Date.now() - date.getTime(),
|
|
243
|
-
});
|
|
244
|
-
|
|
245
|
-
if (format !== 'json') {
|
|
246
|
-
const txt = nocache || config.disableCache || !cacheFileJSON
|
|
247
|
-
? `Сформовано файл формату json. Початок конвертації в ${format}...`
|
|
248
|
-
: `Знайдено файл формату json. Початок конвертації в ${format}...`;
|
|
249
|
-
send(txt);
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
if (format === 'geojson') {
|
|
253
|
-
const rows = JSON.parse(await readFile(filePathJSON) || '[]');
|
|
254
|
-
|
|
255
|
-
const geojson = {
|
|
256
|
-
type: 'FeatureCollection',
|
|
257
|
-
features: rows.map((row) => ({
|
|
258
|
-
type: 'Feature',
|
|
259
|
-
name: 'export',
|
|
260
|
-
geometry: row.geom,
|
|
261
|
-
properties: Object.fromEntries(Object.entries(row).filter(([key]) => key !== 'geom')),
|
|
262
|
-
})),
|
|
263
|
-
};
|
|
264
|
-
|
|
265
|
-
await mkdir(path.dirname(filePath), { recursive: true });
|
|
266
|
-
await writeFile(filePath, JSON.stringify(geojson));
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
const resp = {};
|
|
270
|
-
|
|
271
|
-
if (format === 'csv') {
|
|
272
|
-
await jsonToCsv({
|
|
273
|
-
filePath: filePathJSON, send, colmodel, domain: host, source, columnList,
|
|
274
|
-
});
|
|
275
|
-
}
|
|
276
|
-
if (format === 'xlsx') {
|
|
277
|
-
await jsonToXls({
|
|
278
|
-
filePath: filePathJSON, send, colmodel, domain: host, source, resp,
|
|
279
|
-
});
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
if (resp.error) {
|
|
283
|
-
return reply.status(resp.status || 500).send(resp.error);
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
send('Файл успішно сформовано. Натистіть кнопку ще раз для завантаження даних', 1);
|
|
287
|
-
return formatResult({
|
|
288
|
-
filePath, formatAnswer, folder: rootDir, reply,
|
|
289
|
-
});
|
|
290
|
-
}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import mime from '../../../plugins/file/providers/mime/index.js';
|
|
3
|
-
|
|
4
|
-
import isFileExists from '../../../plugins/file/isFileExists.js';
|
|
5
|
-
import downloadFile from '../../../plugins/file/downloadFile.js';
|
|
6
|
-
|
|
7
|
-
import { applyHook } from '../../../../utils.js';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Апі використовується для отримання різних файлів і можливістю змінювати їх
|
|
11
|
-
*
|
|
12
|
-
* @method GET
|
|
13
|
-
* @summary Отримання файлів з директорії системи
|
|
14
|
-
* @priority 5
|
|
15
|
-
* @alias files
|
|
16
|
-
* @type api
|
|
17
|
-
* @tag file
|
|
18
|
-
* @requires getFile
|
|
19
|
-
* @requires mime
|
|
20
|
-
* @param {Object} params Параметри URL
|
|
21
|
-
* @errors 500
|
|
22
|
-
* @returns {Number} status Номер помилки
|
|
23
|
-
* @returns {String} error Опис помилки
|
|
24
|
-
* @returns {Object} headers Заголовки HTTP
|
|
25
|
-
* @returns {String} pipe Шлях до файла для скачування або відображення
|
|
26
|
-
*/
|
|
27
|
-
|
|
28
|
-
export default async function getFile({
|
|
29
|
-
params = {},
|
|
30
|
-
}, reply) {
|
|
31
|
-
if (!params?.['*']) {
|
|
32
|
-
return { message: 'not enough params', status: 400 };
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
if (params['*']?.includes('../')) {
|
|
36
|
-
return { message: 'wrong params', status: 403 };
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const relpath = (params['*'].startsWith('/') ? params['*'].slice(1) : params['*']).replace(/files\//g, '') + (params['*'].endsWith('/') ? 'index.html' : '');
|
|
40
|
-
|
|
41
|
-
if (!relpath) {
|
|
42
|
-
return { message: 'No required param \'filename\'', status: 400 };
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
if (relpath.includes('..')) {
|
|
46
|
-
return { message: 'wrong params', status: 400 };
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const hookData = await applyHook('preFile', { relpath, reply });
|
|
50
|
-
if (hookData) return hookData;
|
|
51
|
-
|
|
52
|
-
const filepath = path.join('files', relpath);
|
|
53
|
-
|
|
54
|
-
const exists = await isFileExists(filepath);
|
|
55
|
-
if (!exists) {
|
|
56
|
-
return { message: 'file not found', status: 404 };
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
const fileStream = await downloadFile(filepath);
|
|
60
|
-
|
|
61
|
-
if (!fileStream) {
|
|
62
|
-
return { message: 'file not found', status: 404 };
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const headers = {
|
|
66
|
-
'Content-Disposition': `inline; filename=${path.basename(filepath)}`,
|
|
67
|
-
'Cache-Control': 'max-age=86400',
|
|
68
|
-
'Content-Type': `${mime(filepath)}`, // ; charset=utf-8 --- untested
|
|
69
|
-
};
|
|
70
|
-
reply.headers(headers);
|
|
71
|
-
return fileStream;
|
|
72
|
-
}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-console */
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { imageSize } from 'image-size';
|
|
4
|
-
|
|
5
|
-
import {
|
|
6
|
-
config, downloadFile, uploadFile, grpc, isFileExists,
|
|
7
|
-
} from '../../../../utils.js';
|
|
8
|
-
|
|
9
|
-
import getMimeType from '../../../plugins/file/providers/mime/index.js';
|
|
10
|
-
|
|
11
|
-
const defaultWidth = 400;
|
|
12
|
-
const defaultHeight = 240;
|
|
13
|
-
const maxWidth = 2000;
|
|
14
|
-
|
|
15
|
-
const getHeight = (width, size, ratio = 1) => {
|
|
16
|
-
if (size && size.toLowerCase().split('x')[1]) return size.toLowerCase().split('x')[1];
|
|
17
|
-
if (width) return width / ratio;
|
|
18
|
-
return defaultHeight;
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
const { resizeImage } = grpc();
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Апі використовується для зміни розміру фото за шляхом
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
export default async function resize({ query = {}, unittest }, reply) {
|
|
28
|
-
const {
|
|
29
|
-
filepath, quality, size, w, h, nocache,
|
|
30
|
-
} = query;
|
|
31
|
-
|
|
32
|
-
if (!filepath) {
|
|
33
|
-
return reply.status(400).send('not enough query params: filepath');
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const basename = path.basename(filepath);
|
|
37
|
-
const mimeType = getMimeType(filepath);
|
|
38
|
-
const resizePath1 = size
|
|
39
|
-
? filepath.replace(basename, `${size}_resized_${basename}`)
|
|
40
|
-
: filepath.replace(basename, `${w || defaultWidth}_${h || (w ? '' : defaultHeight)}_resized_${basename}`);
|
|
41
|
-
|
|
42
|
-
// get Resize Data
|
|
43
|
-
const fileExists = await isFileExists(resizePath1);
|
|
44
|
-
const originalFileExists = await isFileExists(resizePath1.replace('files/', 'files/original/')); // resize-all API compatibility
|
|
45
|
-
|
|
46
|
-
const resizePath = originalFileExists ? resizePath1.replace('files/', 'files/original/') : resizePath1;
|
|
47
|
-
|
|
48
|
-
const resizeData = fileExists ? await downloadFile(resizePath, { buffer: true }) : null;
|
|
49
|
-
|
|
50
|
-
if (resizeData && !config.disableCache && !nocache && !unittest) {
|
|
51
|
-
return reply.headers({ 'Content-Type': mimeType, 'Cache-control': 'max-age=604800' }).send(resizeData);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// get File Data
|
|
55
|
-
const fileData = await downloadFile(filepath, { buffer: true });
|
|
56
|
-
|
|
57
|
-
if (!fileData?.length) {
|
|
58
|
-
return reply.status(404).send(`Файл не знайдено - ${filepath}`);
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const resizeQuality = Math.min(quality || 75, 100);
|
|
62
|
-
|
|
63
|
-
const { width = defaultWidth, height = defaultHeight } = imageSize(fileData) || {};
|
|
64
|
-
|
|
65
|
-
const ratio = width / height;
|
|
66
|
-
|
|
67
|
-
const check = (size?.toLowerCase?.()?.split?.('x') || []).concat(w, h).filter(el => el && +el > maxWidth);
|
|
68
|
-
|
|
69
|
-
if (check.length) {
|
|
70
|
-
return reply.status(400).send({ message: 'resize image size too big' });
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const resizeWidth = (h && !w ? h * ratio : null)
|
|
74
|
-
|| (size?.toLowerCase?.()?.split?.('x')?.[1] && !size?.toLowerCase?.()?.split?.('x')?.[0] ? size.toLowerCase().split('x')[1] * ratio : null)
|
|
75
|
-
|| w
|
|
76
|
-
|| size?.toLowerCase?.()?.split?.('x')?.[0]
|
|
77
|
-
|| Math.min(width, maxWidth);
|
|
78
|
-
|
|
79
|
-
const resizeHeight = h || getHeight(resizeWidth, size, ratio);
|
|
80
|
-
|
|
81
|
-
if (config.trace) {
|
|
82
|
-
console.log('original width/height/ratio: ', width, height, ratio);
|
|
83
|
-
console.log('resize width/height/ratio/quality: ', resizeWidth, resizeHeight, resizeWidth / resizeHeight, resizeQuality);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
const { result } = await resizeImage({
|
|
87
|
-
base64: Buffer.from(fileData).toString('base64'),
|
|
88
|
-
width: resizeWidth,
|
|
89
|
-
height: resizeHeight,
|
|
90
|
-
quality: resizeQuality,
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
await uploadFile(resizePath, Buffer.from(result, 'base64'));
|
|
94
|
-
|
|
95
|
-
return reply.headers({ 'Content-Type': mimeType }).send(Buffer.from(result, 'base64'));
|
|
96
|
-
}
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-console */
|
|
2
|
-
import { imageSize } from 'image-size';
|
|
3
|
-
|
|
4
|
-
import {
|
|
5
|
-
pgClients, eventStream, logger, isFileExists, downloadFile, uploadFile, grpc,
|
|
6
|
-
} from '../../../../utils.js';
|
|
7
|
-
|
|
8
|
-
import { images } from '../../../plugins/file/utils/allowedExtensions.js';
|
|
9
|
-
|
|
10
|
-
const { resizeImage } = grpc();
|
|
11
|
-
|
|
12
|
-
async function resizeOne({
|
|
13
|
-
relpath: relpath1, resizeQuality = 80, maxWidth = 2048, errors = [], success = [], notfound = [], equalwidth = [], send = () => { }, unittest,
|
|
14
|
-
}) {
|
|
15
|
-
const exists = await isFileExists(relpath1);
|
|
16
|
-
const existsOriginal = await isFileExists(relpath1.replace('files/', 'files/original/'));
|
|
17
|
-
|
|
18
|
-
const relpath = existsOriginal ? relpath1.replace('files/', 'files/original/') : relpath1;
|
|
19
|
-
|
|
20
|
-
const buffer = (exists || existsOriginal) ? await downloadFile(relpath, { buffer: true }) : null;
|
|
21
|
-
|
|
22
|
-
if (!buffer?.length) {
|
|
23
|
-
notfound.push(relpath1);
|
|
24
|
-
send(`file not found: ${relpath1}`);
|
|
25
|
-
return null;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
if (!existsOriginal) {
|
|
29
|
-
await uploadFile(relpath1.replace('files/', 'files/original/'), buffer);
|
|
30
|
-
send(`original image moved to: ${relpath1.replace('files/', 'files/original/')}`);
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
send(`original image already saved to: ${relpath}`);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const dimensions = {};
|
|
37
|
-
try {
|
|
38
|
-
const { width, height } = imageSize(buffer) || {};
|
|
39
|
-
Object.assign(dimensions, { width, height });
|
|
40
|
-
}
|
|
41
|
-
catch (err) {
|
|
42
|
-
// handle broken image (callback w/ buffer input not supported)
|
|
43
|
-
errors.push(relpath1);
|
|
44
|
-
send(`${err.toString()}: ${relpath1} (${buffer?.length} - ${exists.ContentType})`);
|
|
45
|
-
return null;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
const { width = maxWidth, height = 240 } = dimensions;
|
|
49
|
-
|
|
50
|
-
const ratio = width / height;
|
|
51
|
-
|
|
52
|
-
const resizeWidth = Math.min(width, maxWidth);
|
|
53
|
-
const resizeHeight = resizeWidth / ratio;
|
|
54
|
-
|
|
55
|
-
send(`original ${relpath} width/height/ratio: ${width} / ${height} / ${ratio}`);
|
|
56
|
-
send(`resize ${relpath} width/height/ratio/quality: ${resizeWidth} / ${resizeHeight} / ${resizeWidth / resizeHeight} / ${resizeQuality}`);
|
|
57
|
-
|
|
58
|
-
// skip for resize with small unit test image
|
|
59
|
-
if (resizeWidth === width && !unittest) {
|
|
60
|
-
send(`resize ${relpath} skip: resize width equals to original`);
|
|
61
|
-
equalwidth.push(relpath1);
|
|
62
|
-
return null;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const { result } = await resizeImage({
|
|
66
|
-
base64: buffer.toString('base64'),
|
|
67
|
-
width: resizeWidth,
|
|
68
|
-
height: resizeHeight,
|
|
69
|
-
quality: resizeQuality,
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
await uploadFile(relpath1, Buffer.from(result, 'base64'));
|
|
73
|
-
send(`resize ${relpath1} success`);
|
|
74
|
-
success.push(relpath1);
|
|
75
|
-
return null;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
export default async function resizeAll(req, reply) {
|
|
79
|
-
const { pg = pgClients.client, query = {}, unittest } = req;
|
|
80
|
-
|
|
81
|
-
const {
|
|
82
|
-
nocache, filepath, quality = 80, limit, sql, w = 2048,
|
|
83
|
-
} = query;
|
|
84
|
-
|
|
85
|
-
if (nocache) {
|
|
86
|
-
const clearQ = `update crm.files set resized=null
|
|
87
|
-
where ext=any($1)
|
|
88
|
-
and ${filepath ? 'file_path=$2' : '1=1'}
|
|
89
|
-
and resized is not null`;
|
|
90
|
-
|
|
91
|
-
if (sql) return clearQ;
|
|
92
|
-
|
|
93
|
-
const { rowCount = 0 } = await pg.query(clearQ, [images, filepath].filter(Boolean));
|
|
94
|
-
return reply.status(200).send({ msg: 'clear cache success', rowCount });
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
const resizeQuality = Math.min(quality, 100);
|
|
98
|
-
|
|
99
|
-
const q = `select file_id as id, file_path as relpath from crm.files
|
|
100
|
-
where ext=any($1)
|
|
101
|
-
and ${filepath ? 'file_path=$2' : '1=1'}
|
|
102
|
-
and resized is null ${limit ? `limit ${limit}` : ''}`;
|
|
103
|
-
|
|
104
|
-
if (sql) return q;
|
|
105
|
-
|
|
106
|
-
const { rows = [], rowCount = 0 } = await pg.query(q, [images, filepath].filter(Boolean));
|
|
107
|
-
|
|
108
|
-
if (rowCount === 0) {
|
|
109
|
-
return reply.status(200).send('nothing to resize');
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
const success = [];
|
|
113
|
-
const errors = [];
|
|
114
|
-
const notfound = [];
|
|
115
|
-
const equalwidth = [];
|
|
116
|
-
|
|
117
|
-
const send = unittest ? console.log : eventStream(reply);
|
|
118
|
-
|
|
119
|
-
try {
|
|
120
|
-
send(`file max resize width: ${w}`);
|
|
121
|
-
send(`file max resize quality: ${resizeQuality}`);
|
|
122
|
-
|
|
123
|
-
send(`rows found: ${rowCount}`);
|
|
124
|
-
|
|
125
|
-
await rows
|
|
126
|
-
.filter((el, idx, array) => array.findIndex(item => item.relpath === el.relpath) === idx)
|
|
127
|
-
.reduce((promise, { relpath, id }) => promise.then(() => resizeOne({
|
|
128
|
-
relpath, id, resizeQuality, maxWidth: w, errors, success, notfound, equalwidth, send, unittest,
|
|
129
|
-
})), Promise.resolve());
|
|
130
|
-
|
|
131
|
-
if (success.length) {
|
|
132
|
-
await pg.query('update crm.files set resized=true where file_path=any($1::text[])', [success]);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
const skip = errors.concat(notfound).concat(equalwidth);
|
|
136
|
-
|
|
137
|
-
if (skip.length) {
|
|
138
|
-
await pg.query('update crm.files set resized=false where file_path=any($1::text[])', [skip]);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
logger.file('file/resize', {
|
|
142
|
-
success, errors, notfound, equalwidth,
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
send('resize all success');
|
|
146
|
-
}
|
|
147
|
-
catch (err) {
|
|
148
|
-
send(err.toString());
|
|
149
|
-
logger.file('file/resize', { error: err.toString(), stack: err.stack });
|
|
150
|
-
}
|
|
151
|
-
finally {
|
|
152
|
-
send('event stream finish', 1);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
return {
|
|
156
|
-
success,
|
|
157
|
-
errors,
|
|
158
|
-
notfound,
|
|
159
|
-
equalwidth,
|
|
160
|
-
options: {
|
|
161
|
-
maxWidth: w,
|
|
162
|
-
quality: resizeQuality,
|
|
163
|
-
},
|
|
164
|
-
};
|
|
165
|
-
}
|