@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.
Files changed (489) hide show
  1. package/dist/config.js +33 -0
  2. package/dist/dblist.js +5 -0
  3. package/dist/index.js +170 -0
  4. package/dist/redactionList.js +6 -0
  5. package/dist/server/helpers/core/badge.js +16 -0
  6. package/dist/server/helpers/core/buttonFilePreview.js +12 -0
  7. package/dist/server/helpers/core/buttonHelper.js +20 -0
  8. package/{server → dist/server}/helpers/core/token.js +16 -18
  9. package/dist/server/helpers/format/formatAuto.js +14 -0
  10. package/dist/server/helpers/format/formatDate.js +231 -0
  11. package/{server → dist/server}/helpers/format/formatDigit.js +21 -21
  12. package/dist/server/helpers/format/formatNum.js +331 -0
  13. package/{server → dist/server}/helpers/format/formatNumber.js +50 -55
  14. package/dist/server/helpers/format/formatRelative.js +180 -0
  15. package/{server → dist/server}/helpers/format/formatUnit.js +41 -40
  16. package/{server → dist/server}/helpers/format/num_format.js +40 -44
  17. package/{server → dist/server}/helpers/format/set.js +26 -27
  18. package/{server → dist/server}/helpers/funcs/_math.js +49 -50
  19. package/{server → dist/server}/helpers/funcs/contentList.js +52 -57
  20. package/{server → dist/server}/helpers/funcs/empty.js +21 -21
  21. package/dist/server/helpers/funcs/ifCond.js +109 -0
  22. package/dist/server/helpers/funcs/ifCondAnd.js +109 -0
  23. package/dist/server/helpers/funcs/ifCondOr.js +110 -0
  24. package/{server → dist/server}/helpers/funcs/inc.js +19 -20
  25. package/{server → dist/server}/helpers/funcs/json.js +3 -3
  26. package/dist/server/helpers/funcs/qrcode.js +65 -0
  27. package/{server → dist/server}/helpers/funcs/round.js +27 -29
  28. package/dist/server/helpers/funcs/select.js +39 -0
  29. package/dist/server/helpers/index.js +125 -0
  30. package/dist/server/helpers/list/buttonHelper.js +20 -0
  31. package/{server → dist/server}/helpers/list/descriptionList.js +39 -45
  32. package/dist/server/helpers/list/tableList.js +104 -0
  33. package/{server → dist/server}/helpers/list/utils/button.js +3 -3
  34. package/{server → dist/server}/helpers/list/utils/buttonDel.js +8 -9
  35. package/{server → dist/server}/helpers/list/utils/buttonEdit.js +8 -9
  36. package/{server → dist/server}/helpers/string/coalesce.js +33 -39
  37. package/{server → dist/server}/helpers/string/concat.js +25 -28
  38. package/{server → dist/server}/helpers/string/split.js +19 -20
  39. package/{server → dist/server}/helpers/string/str_replace.js +57 -62
  40. package/{server → dist/server}/helpers/string/substr.js +28 -32
  41. package/{server → dist/server}/helpers/string/translit.js +20 -23
  42. package/dist/server/helpers/string/utils/alphabet.js +76 -0
  43. package/{server → dist/server}/helpers/utils/button.js +3 -3
  44. package/{server → dist/server}/helpers/utils/buttonAdd.js +4 -4
  45. package/{server → dist/server}/helpers/utils/buttonDel.js +11 -15
  46. package/{server → dist/server}/helpers/utils/buttonDownload.js +3 -3
  47. package/dist/server/helpers/utils/buttonEdit.js +14 -0
  48. package/{server → dist/server}/helpers/utils/buttonPreview.js +3 -3
  49. package/{server → dist/server}/helpers/utils/mdToHTML.js +16 -17
  50. package/{server → dist/server}/helpers/utils/paddingNumber.js +5 -5
  51. package/dist/server/plugins/access/funcs/getAdminAccess.js +11 -0
  52. package/dist/server/plugins/cron/cronList.js +2 -0
  53. package/dist/server/plugins/cron/funcs/addCron.js +41 -0
  54. package/{server → dist/server}/plugins/cron/funcs/interval2ms.js +36 -40
  55. package/dist/server/plugins/cron/funcs/runCron.js +20 -0
  56. package/{server → dist/server}/plugins/cron/funcs/verifyUnique.js +19 -23
  57. package/dist/server/plugins/cron/index.js +75 -0
  58. package/dist/server/plugins/crud/funcs/dataDelete.js +87 -0
  59. package/dist/server/plugins/crud/funcs/dataInsert.js +134 -0
  60. package/dist/server/plugins/crud/funcs/dataUpdate.js +198 -0
  61. package/dist/server/plugins/crud/funcs/getAccess.js +82 -0
  62. package/dist/server/plugins/crud/funcs/getOpt.js +13 -0
  63. package/dist/server/plugins/crud/funcs/getToken.js +24 -0
  64. package/dist/server/plugins/crud/funcs/isFileExists.js +11 -0
  65. package/dist/server/plugins/crud/funcs/setOpt.js +19 -0
  66. package/dist/server/plugins/crud/funcs/setToken.js +41 -0
  67. package/dist/server/plugins/crud/funcs/utils/getFolder.js +13 -0
  68. package/dist/server/plugins/crud/funcs/utils/getInsertQuery.js +54 -0
  69. package/dist/server/plugins/crud/funcs/utils/logChanges.js +144 -0
  70. package/{server → dist/server}/plugins/crud/funcs/validateData.js +91 -83
  71. package/dist/server/plugins/extra/extraData.js +81 -0
  72. package/dist/server/plugins/extra/extraDataGet.js +52 -0
  73. package/dist/server/plugins/file/downloadFile.js +15 -0
  74. package/{server → dist/server}/plugins/file/getExport.js +18 -38
  75. package/dist/server/plugins/file/isFileExists.js +13 -0
  76. package/dist/server/plugins/file/providers/fs.js +86 -0
  77. package/dist/server/plugins/file/providers/index.js +28 -0
  78. package/dist/server/plugins/file/providers/mime/index.js +7 -0
  79. package/dist/server/plugins/file/providers/mime/mimes.js +1179 -0
  80. package/dist/server/plugins/file/providers/s3/client.js +26 -0
  81. package/dist/server/plugins/file/providers/s3/funcs/downloadFile.js +42 -0
  82. package/dist/server/plugins/file/providers/s3/funcs/fileExists.js +24 -0
  83. package/dist/server/plugins/file/providers/s3/funcs/uploadFile.js +35 -0
  84. package/dist/server/plugins/file/providers/s3/funcs/utils/getS3FilePath.js +18 -0
  85. package/{server → dist/server}/plugins/file/providers/s3/index.js +11 -12
  86. package/dist/server/plugins/file/providers/utils/getDataSize.js +19 -0
  87. package/dist/server/plugins/file/providers/utils/getValidData.js +30 -0
  88. package/dist/server/plugins/file/providers/utils/handlers/dataTypes.js +7 -0
  89. package/dist/server/plugins/file/providers/utils/handlers/index.js +50 -0
  90. package/dist/server/plugins/file/providers/utils/handlers/sizeHandlers.js +9 -0
  91. package/dist/server/plugins/file/providers/utils/streamToBuffer.js +7 -0
  92. package/{server → dist/server}/plugins/file/providers/utils/typeguards/isArray.js +2 -3
  93. package/{server → dist/server}/plugins/file/providers/utils/typeguards/isBuffer.js +2 -3
  94. package/dist/server/plugins/file/providers/utils/typeguards/isPath.js +3 -0
  95. package/dist/server/plugins/file/providers/utils/typeguards/isReadableStream.js +7 -0
  96. package/{server → dist/server}/plugins/file/providers/utils/typeguards/isText.js +2 -3
  97. package/dist/server/plugins/file/uploadFile.js +14 -0
  98. package/dist/server/plugins/file/uploadMultiPart.js +101 -0
  99. package/dist/server/plugins/file/utils/allowedExtensions.js +60 -0
  100. package/{server → dist/server}/plugins/file/utils/getFileType.js +12 -10
  101. package/dist/server/plugins/file/utils/getPath.js +30 -0
  102. package/dist/server/plugins/file/utils/isFileExists.js +15 -0
  103. package/dist/server/plugins/grpc/file2json.js +50 -0
  104. package/dist/server/plugins/grpc/grpc.js +103 -0
  105. package/dist/server/plugins/grpc/office2pdf.js +78 -0
  106. package/dist/server/plugins/grpc/utils/csv2xls.js +6 -0
  107. package/dist/server/plugins/grpc/utils/excel2Json.js +10 -0
  108. package/dist/server/plugins/grpc/utils/html2doc.js +17 -0
  109. package/dist/server/plugins/grpc/utils/html2img.js +17 -0
  110. package/dist/server/plugins/grpc/utils/html2pdf.js +19 -0
  111. package/{server → dist/server}/plugins/grpc/utils/htmlTemplate.js +3 -4
  112. package/dist/server/plugins/grpc/utils/json2xls.js +11 -0
  113. package/dist/server/plugins/grpc/utils/mergePdf.js +18 -0
  114. package/dist/server/plugins/hook/funcs/addHook.js +7 -0
  115. package/dist/server/plugins/hook/funcs/applyHook.js +25 -0
  116. package/dist/server/plugins/hook/funcs/applyHookSync.js +7 -0
  117. package/dist/server/plugins/hook/hookList.js +2 -0
  118. package/{server → dist/server}/plugins/hook/index.js +7 -8
  119. package/dist/server/plugins/logger/createFileStream.js +79 -0
  120. package/dist/server/plugins/logger/errorMessage.js +24 -0
  121. package/dist/server/plugins/logger/errorStatus.js +17 -0
  122. package/dist/server/plugins/logger/getHooks.js +17 -0
  123. package/dist/server/plugins/logger/getLogger.js +52 -0
  124. package/dist/server/plugins/logger/index.js +37 -0
  125. package/dist/server/plugins/logger/labels.js +10 -0
  126. package/dist/server/plugins/logger/serializers.js +22 -0
  127. package/{server → dist/server}/plugins/logger/timestampWithTimeZone.js +5 -5
  128. package/dist/server/plugins/md/funcs/formatMdoc.js +45 -0
  129. package/{server → dist/server}/plugins/md/funcs/mdToHTML.js +16 -17
  130. package/dist/server/plugins/metric/index.js +6 -0
  131. package/dist/server/plugins/metric/loggerSystem.js +127 -0
  132. package/dist/server/plugins/metric/systemMetricsFifthly.js +20 -0
  133. package/dist/server/plugins/migration/exec.migrations.js +59 -0
  134. package/dist/server/plugins/migration/exec.sql.js +61 -0
  135. package/{server → dist/server}/plugins/migration/index.js +5 -7
  136. package/dist/server/plugins/pg/funcs/autoIndex.js +102 -0
  137. package/{server → dist/server}/plugins/pg/funcs/getDBParams.js +16 -15
  138. package/dist/server/plugins/pg/funcs/getMeta.js +48 -0
  139. package/dist/server/plugins/pg/funcs/getPG.js +39 -0
  140. package/dist/server/plugins/pg/funcs/getPGAsync.js +45 -0
  141. package/dist/server/plugins/pg/funcs/init.js +157 -0
  142. package/dist/server/plugins/pg/index.js +47 -0
  143. package/dist/server/plugins/pg/pgClients.js +20 -0
  144. package/dist/server/plugins/policy/funcs/checkPolicy.js +173 -0
  145. package/dist/server/plugins/policy/funcs/checkXSS.js +44 -0
  146. package/dist/server/plugins/policy/index.js +11 -0
  147. package/dist/server/plugins/policy/sqlInjection.js +33 -0
  148. package/dist/server/plugins/policy/xssInjection.js +72 -0
  149. package/{server → dist/server}/plugins/redis/client.js +6 -8
  150. package/dist/server/plugins/redis/funcs/getRedis.js +23 -0
  151. package/{server → dist/server}/plugins/redis/funcs/redisClients.js +2 -3
  152. package/dist/server/plugins/redis/index.js +8 -0
  153. package/dist/server/plugins/sqlite/funcs/getSqlite.js +27 -0
  154. package/dist/server/plugins/sqlite/funcs/init.js +45 -0
  155. package/dist/server/plugins/sqlite/index.js +8 -0
  156. package/dist/server/plugins/sqlite/sqliteClients.js +24 -0
  157. package/dist/server/plugins/table/funcs/addMenu.js +12 -0
  158. package/dist/server/plugins/table/funcs/addTemplateDir.js +16 -0
  159. package/dist/server/plugins/table/funcs/customTokens.js +2 -0
  160. package/dist/server/plugins/table/funcs/getData.js +25 -0
  161. package/dist/server/plugins/table/funcs/getFilter.js +18 -0
  162. package/dist/server/plugins/table/funcs/getFilterSQL/index.js +201 -0
  163. package/dist/server/plugins/table/funcs/getFilterSQL/util/formatValue.js +131 -0
  164. package/dist/server/plugins/table/funcs/getFilterSQL/util/getCustomQuery.js +11 -0
  165. package/dist/server/plugins/table/funcs/getFilterSQL/util/getFilterQuery.js +84 -0
  166. package/dist/server/plugins/table/funcs/getFilterSQL/util/getOptimizedQuery.js +11 -0
  167. package/dist/server/plugins/table/funcs/getFilterSQL/util/getRangeQuery.js +161 -0
  168. package/dist/server/plugins/table/funcs/getFilterSQL/util/getTableSql.js +40 -0
  169. package/dist/server/plugins/table/funcs/getSelect.js +37 -0
  170. package/dist/server/plugins/table/funcs/getSelectMeta.js +77 -0
  171. package/dist/server/plugins/table/funcs/getTemplate.js +86 -0
  172. package/dist/server/plugins/table/funcs/getTemplatePath.js +60 -0
  173. package/dist/server/plugins/table/funcs/getTemplateSync.js +84 -0
  174. package/dist/server/plugins/table/funcs/getTemplates.js +15 -0
  175. package/dist/server/plugins/table/funcs/gisIRColumn.js +81 -0
  176. package/dist/server/plugins/table/funcs/loadTemplate.js +2 -0
  177. package/dist/server/plugins/table/funcs/loadTemplatePath.js +2 -0
  178. package/dist/server/plugins/table/funcs/menuDirs.js +2 -0
  179. package/dist/server/plugins/table/funcs/metaFormat/getSelectVal.js +75 -0
  180. package/dist/server/plugins/table/funcs/metaFormat/index.js +64 -0
  181. package/dist/server/plugins/table/funcs/userTemplateDir.js +2 -0
  182. package/dist/server/plugins/table/funcs/userTokens.js +2 -0
  183. package/dist/server/plugins/util/funcs/eventStream.js +28 -0
  184. package/{server → dist/server}/plugins/util/funcs/flattenObject.js +14 -12
  185. package/{server → dist/server}/plugins/util/funcs/unflattenObject.js +48 -46
  186. package/{server → dist/server}/plugins/yml/funcs/json2yml.js +3 -5
  187. package/{server → dist/server}/plugins/yml/funcs/yml2json.js +11 -14
  188. package/{server → dist/server}/routes/access/controllers/access.group.js +17 -23
  189. package/{server → dist/server}/routes/access/controllers/access.group.post.js +46 -53
  190. package/dist/server/routes/access/controllers/access.interface.js +36 -0
  191. package/{server/routes/access/index.mjs → dist/server/routes/access/index.js} +10 -12
  192. package/{server/routes/access/schema.mjs → dist/server/routes/access/schema.js} +65 -68
  193. package/dist/server/routes/cron/controllers/cronApi.js +16 -0
  194. package/dist/server/routes/cron/index.js +15 -0
  195. package/dist/server/routes/crud/controllers/deleteCrud.js +90 -0
  196. package/dist/server/routes/crud/controllers/insert.js +110 -0
  197. package/dist/server/routes/crud/controllers/table.js +144 -0
  198. package/dist/server/routes/crud/controllers/update.js +113 -0
  199. package/dist/server/routes/crud/index.js +22 -0
  200. package/dist/server/routes/dblist/controllers/readItems.js +25 -0
  201. package/dist/server/routes/dblist/controllers/setItem.js +20 -0
  202. package/dist/server/routes/dblist/index.js +17 -0
  203. package/dist/server/routes/dblist/utils/formatData.js +8 -0
  204. package/dist/server/routes/file/controllers/delete.js +99 -0
  205. package/dist/server/routes/file/controllers/download.js +56 -0
  206. package/dist/server/routes/file/controllers/export.js +294 -0
  207. package/dist/server/routes/file/controllers/files.js +57 -0
  208. package/dist/server/routes/file/controllers/resize.js +86 -0
  209. package/dist/server/routes/file/controllers/resizeAll.js +140 -0
  210. package/dist/server/routes/file/controllers/upload.js +56 -0
  211. package/dist/server/routes/file/controllers/uploadImage.js +45 -0
  212. package/dist/server/routes/file/controllers/utils/formatResult.js +13 -0
  213. package/dist/server/routes/file/controllers/utils/jsonToCsv.js +40 -0
  214. package/dist/server/routes/file/controllers/utils/jsonToXls.js +37 -0
  215. package/dist/server/routes/file/index.js +22 -0
  216. package/dist/server/routes/file/schema.js +14 -0
  217. package/dist/server/routes/grpc/controllers/file2geojson.js +54 -0
  218. package/dist/server/routes/grpc/controllers/filePreview.js +87 -0
  219. package/dist/server/routes/grpc/index.js +9 -0
  220. package/dist/server/routes/logger/controllers/logger.file.js +81 -0
  221. package/dist/server/routes/logger/controllers/logger.test.api.js +42 -0
  222. package/dist/server/routes/logger/controllers/utils/checkUserAccess.js +22 -0
  223. package/dist/server/routes/logger/controllers/utils/getRootDir.js +25 -0
  224. package/dist/server/routes/logger/index.js +18 -0
  225. package/dist/server/routes/menu/controllers/getMenu.js +98 -0
  226. package/dist/server/routes/menu/controllers/interfaces.js +18 -0
  227. package/dist/server/routes/menu/index.js +7 -0
  228. package/dist/server/routes/properties/controllers/properties.get.js +23 -0
  229. package/dist/server/routes/properties/controllers/properties.post.js +68 -0
  230. package/dist/server/routes/properties/index.js +21 -0
  231. package/dist/server/routes/table/controllers/card.js +79 -0
  232. package/dist/server/routes/table/controllers/cardData.js +161 -0
  233. package/dist/server/routes/table/controllers/cardTabData.js +49 -0
  234. package/dist/server/routes/table/controllers/dataInfo.js +57 -0
  235. package/dist/server/routes/table/controllers/filter.js +181 -0
  236. package/dist/server/routes/table/controllers/form.js +41 -0
  237. package/{server → dist/server}/routes/table/controllers/getFormByTable.js +105 -125
  238. package/dist/server/routes/table/controllers/search.js +80 -0
  239. package/dist/server/routes/table/controllers/suggest.js +242 -0
  240. package/dist/server/routes/table/controllers/tableData.js +88 -0
  241. package/dist/server/routes/table/controllers/tableInfo.js +112 -0
  242. package/dist/server/routes/table/controllers/tokenInfo.js +10 -0
  243. package/dist/server/routes/table/controllers/utils/conditions.js +30 -0
  244. package/dist/server/routes/table/controllers/utils/formatSchema.js +35 -0
  245. package/dist/server/routes/table/controllers/utils/locales.js +2 -0
  246. package/dist/server/routes/table/functions/getData.js +584 -0
  247. package/dist/server/routes/table/index.js +44 -0
  248. package/dist/server/routes/table/schema.js +117 -0
  249. package/dist/server/routes/templates/controllers/getTemplate.js +65 -0
  250. package/dist/server/routes/templates/index.js +7 -0
  251. package/{server → dist/server}/routes/templates/schema.js +11 -12
  252. package/dist/server/routes/util/controllers/code.generator.js +75 -0
  253. package/dist/server/routes/util/controllers/next.id.js +4 -0
  254. package/dist/server/routes/util/controllers/status.monitor.js +6 -0
  255. package/dist/server/routes/util/controllers/user.tokens.js +32 -0
  256. package/dist/server/routes/util/index.js +13 -0
  257. package/dist/server/routes/widget/controllers/file.edit.js +48 -0
  258. package/dist/server/routes/widget/controllers/widget.del.js +84 -0
  259. package/dist/server/routes/widget/controllers/widget.get.js +164 -0
  260. package/dist/server/routes/widget/controllers/widget.set.js +117 -0
  261. package/dist/server/routes/widget/hook/onWidgetSet.js +10 -0
  262. package/dist/server/routes/widget/index.js +42 -0
  263. package/dist/server/types/core.js +12 -0
  264. package/dist/utils.js +93 -0
  265. package/package.json +24 -17
  266. package/config.js +0 -37
  267. package/dblist.js +0 -5
  268. package/index.js +0 -193
  269. package/redactionList.js +0 -7
  270. package/server/helpers/core/badge.js +0 -14
  271. package/server/helpers/core/buttonFilePreview.js +0 -12
  272. package/server/helpers/core/buttonHelper.js +0 -22
  273. package/server/helpers/format/formatAuto.js +0 -13
  274. package/server/helpers/format/formatDate.js +0 -258
  275. package/server/helpers/format/formatNum.js +0 -365
  276. package/server/helpers/format/formatRelative.js +0 -106
  277. package/server/helpers/funcs/ifCond.js +0 -109
  278. package/server/helpers/funcs/ifCondAnd.js +0 -114
  279. package/server/helpers/funcs/ifCondOr.js +0 -115
  280. package/server/helpers/funcs/qrcode.js +0 -68
  281. package/server/helpers/funcs/select.js +0 -46
  282. package/server/helpers/index.js +0 -137
  283. package/server/helpers/list/buttonHelper.js +0 -22
  284. package/server/helpers/list/tableList.js +0 -87
  285. package/server/helpers/string/utils/alphabet.js +0 -76
  286. package/server/helpers/utils/buttonEdit.js +0 -17
  287. package/server/migrations/0.sql +0 -84
  288. package/server/migrations/cls.sql +0 -40
  289. package/server/migrations/context.sql +0 -135
  290. package/server/migrations/crm.sql +0 -155
  291. package/server/migrations/log.sql +0 -87
  292. package/server/migrations/properties.sql +0 -115
  293. package/server/migrations/roles.sql +0 -191
  294. package/server/migrations/template.sql +0 -44
  295. package/server/migrations/users.sql +0 -176
  296. package/server/plugins/access/funcs/getAdminAccess.js +0 -14
  297. package/server/plugins/access/index.mjs +0 -6
  298. package/server/plugins/cron/cronList.js +0 -1
  299. package/server/plugins/cron/funcs/addCron.js +0 -52
  300. package/server/plugins/cron/funcs/runCron.js +0 -24
  301. package/server/plugins/cron/index.js +0 -77
  302. package/server/plugins/crud/funcs/dataDelete.js +0 -86
  303. package/server/plugins/crud/funcs/dataInsert.js +0 -131
  304. package/server/plugins/crud/funcs/dataUpdate.js +0 -179
  305. package/server/plugins/crud/funcs/getAccess.js +0 -94
  306. package/server/plugins/crud/funcs/getOpt.js +0 -14
  307. package/server/plugins/crud/funcs/getToken.js +0 -33
  308. package/server/plugins/crud/funcs/isFileExists.js +0 -13
  309. package/server/plugins/crud/funcs/setOpt.js +0 -21
  310. package/server/plugins/crud/funcs/setToken.js +0 -43
  311. package/server/plugins/crud/funcs/utils/getFolder.js +0 -11
  312. package/server/plugins/crud/funcs/utils/getInsertQuery.js +0 -44
  313. package/server/plugins/crud/funcs/utils/logChanges.js +0 -121
  314. package/server/plugins/crud/index.js +0 -23
  315. package/server/plugins/extra/extraData.js +0 -79
  316. package/server/plugins/extra/extraDataGet.js +0 -56
  317. package/server/plugins/file/downloadFile.js +0 -18
  318. package/server/plugins/file/isFileExists.js +0 -17
  319. package/server/plugins/file/providers/fs.js +0 -100
  320. package/server/plugins/file/providers/index.d.ts +0 -49
  321. package/server/plugins/file/providers/index.js +0 -36
  322. package/server/plugins/file/providers/mime/index.js +0 -12
  323. package/server/plugins/file/providers/mime/mimes.js +0 -1180
  324. package/server/plugins/file/providers/s3/client.js +0 -41
  325. package/server/plugins/file/providers/s3/funcs/downloadFile.js +0 -50
  326. package/server/plugins/file/providers/s3/funcs/fileExists.js +0 -32
  327. package/server/plugins/file/providers/s3/funcs/uploadFile.js +0 -46
  328. package/server/plugins/file/providers/s3/funcs/utils/getS3FilePath.js +0 -23
  329. package/server/plugins/file/providers/utils/getDataSize.js +0 -20
  330. package/server/plugins/file/providers/utils/getValidData.js +0 -32
  331. package/server/plugins/file/providers/utils/handlers/dataTypes.js +0 -8
  332. package/server/plugins/file/providers/utils/handlers/index.js +0 -53
  333. package/server/plugins/file/providers/utils/handlers/sizeHandlers.js +0 -11
  334. package/server/plugins/file/providers/utils/streamToBuffer.js +0 -8
  335. package/server/plugins/file/providers/utils/typeguards/isPath.js +0 -5
  336. package/server/plugins/file/providers/utils/typeguards/isReadableStream.js +0 -8
  337. package/server/plugins/file/uploadFile.js +0 -19
  338. package/server/plugins/file/uploadMultiPart.js +0 -131
  339. package/server/plugins/file/utils/allowedExtensions.js +0 -25
  340. package/server/plugins/file/utils/getPath.js +0 -25
  341. package/server/plugins/file/utils/isFileExists.js +0 -16
  342. package/server/plugins/grpc/file2json.js +0 -54
  343. package/server/plugins/grpc/grpc.js +0 -125
  344. package/server/plugins/grpc/office2pdf.js +0 -91
  345. package/server/plugins/grpc/utils/csv2xls.js +0 -8
  346. package/server/plugins/grpc/utils/excel2Json.js +0 -8
  347. package/server/plugins/grpc/utils/html2doc.js +0 -19
  348. package/server/plugins/grpc/utils/html2img.js +0 -18
  349. package/server/plugins/grpc/utils/html2pdf.js +0 -23
  350. package/server/plugins/grpc/utils/json2xls.js +0 -13
  351. package/server/plugins/grpc/utils/mergePdf.js +0 -20
  352. package/server/plugins/hook/funcs/addHook.js +0 -8
  353. package/server/plugins/hook/funcs/applyHook.js +0 -25
  354. package/server/plugins/hook/funcs/applyHookSync.js +0 -9
  355. package/server/plugins/hook/hookList.js +0 -1
  356. package/server/plugins/logger/createFileStream.js +0 -88
  357. package/server/plugins/logger/errorMessage.js +0 -25
  358. package/server/plugins/logger/errorStatus.js +0 -19
  359. package/server/plugins/logger/getHooks.js +0 -21
  360. package/server/plugins/logger/getLogger.js +0 -58
  361. package/server/plugins/logger/index.js +0 -33
  362. package/server/plugins/logger/labels.js +0 -11
  363. package/server/plugins/logger/serializers.js +0 -25
  364. package/server/plugins/md/funcs/formatMdoc.js +0 -40
  365. package/server/plugins/metric/index.js +0 -8
  366. package/server/plugins/metric/loggerSystem.js +0 -131
  367. package/server/plugins/metric/systemMetricsFifthly.js +0 -24
  368. package/server/plugins/migration/exec.migrations.js +0 -63
  369. package/server/plugins/migration/exec.sql.js +0 -67
  370. package/server/plugins/pg/funcs/autoIndex.js +0 -103
  371. package/server/plugins/pg/funcs/getMeta.js +0 -49
  372. package/server/plugins/pg/funcs/getPG.js +0 -42
  373. package/server/plugins/pg/funcs/getPGAsync.js +0 -62
  374. package/server/plugins/pg/funcs/init.js +0 -117
  375. package/server/plugins/pg/index.js +0 -54
  376. package/server/plugins/pg/pgClients.js +0 -22
  377. package/server/plugins/policy/funcs/checkPolicy.js +0 -127
  378. package/server/plugins/policy/funcs/checkXSS.js +0 -37
  379. package/server/plugins/policy/index.js +0 -11
  380. package/server/plugins/policy/sqlInjection.js +0 -34
  381. package/server/plugins/policy/xssInjection.js +0 -73
  382. package/server/plugins/redis/funcs/getRedis.js +0 -25
  383. package/server/plugins/redis/index.js +0 -17
  384. package/server/plugins/sqlite/funcs/getSqlite.js +0 -39
  385. package/server/plugins/sqlite/funcs/init.js +0 -53
  386. package/server/plugins/sqlite/index.js +0 -11
  387. package/server/plugins/sqlite/sqliteClients.js +0 -26
  388. package/server/plugins/table/funcs/addMenu.js +0 -16
  389. package/server/plugins/table/funcs/addTemplateDir.js +0 -19
  390. package/server/plugins/table/funcs/customTokens.js +0 -1
  391. package/server/plugins/table/funcs/getData.js +0 -14
  392. package/server/plugins/table/funcs/getFilter.js +0 -14
  393. package/server/plugins/table/funcs/getFilterSQL/index.js +0 -163
  394. package/server/plugins/table/funcs/getFilterSQL/util/formatValue.js +0 -136
  395. package/server/plugins/table/funcs/getFilterSQL/util/getCustomQuery.js +0 -13
  396. package/server/plugins/table/funcs/getFilterSQL/util/getFilterQuery.js +0 -75
  397. package/server/plugins/table/funcs/getFilterSQL/util/getOptimizedQuery.js +0 -12
  398. package/server/plugins/table/funcs/getFilterSQL/util/getRangeQuery.js +0 -156
  399. package/server/plugins/table/funcs/getFilterSQL/util/getTableSql.js +0 -34
  400. package/server/plugins/table/funcs/getSelect.js +0 -31
  401. package/server/plugins/table/funcs/getSelectMeta.js +0 -74
  402. package/server/plugins/table/funcs/getTemplate.js +0 -88
  403. package/server/plugins/table/funcs/getTemplatePath.js +0 -60
  404. package/server/plugins/table/funcs/getTemplateSync.js +0 -87
  405. package/server/plugins/table/funcs/getTemplates.js +0 -19
  406. package/server/plugins/table/funcs/gisIRColumn.js +0 -82
  407. package/server/plugins/table/funcs/loadTemplate.js +0 -1
  408. package/server/plugins/table/funcs/loadTemplatePath.js +0 -1
  409. package/server/plugins/table/funcs/menuDirs.js +0 -1
  410. package/server/plugins/table/funcs/metaFormat/getSelectVal.js +0 -61
  411. package/server/plugins/table/funcs/metaFormat/index.js +0 -49
  412. package/server/plugins/table/funcs/userTemplateDir.js +0 -1
  413. package/server/plugins/table/funcs/userTokens.js +0 -1
  414. package/server/plugins/table/index.js +0 -13
  415. package/server/plugins/util/funcs/eventStream.js +0 -29
  416. package/server/plugins/util/index.js +0 -7
  417. package/server/routes/access/controllers/access.interface.js +0 -37
  418. package/server/routes/cron/controllers/cronApi.js +0 -22
  419. package/server/routes/cron/index.js +0 -19
  420. package/server/routes/crud/controllers/deleteCrud.js +0 -84
  421. package/server/routes/crud/controllers/insert.js +0 -103
  422. package/server/routes/crud/controllers/table.js +0 -116
  423. package/server/routes/crud/controllers/update.js +0 -108
  424. package/server/routes/crud/index.js +0 -26
  425. package/server/routes/dblist/controllers/readItems.js +0 -28
  426. package/server/routes/dblist/controllers/setItem.js +0 -25
  427. package/server/routes/dblist/index.mjs +0 -19
  428. package/server/routes/dblist/utils/formatData.js +0 -7
  429. package/server/routes/file/controllers/delete.js +0 -108
  430. package/server/routes/file/controllers/download.js +0 -66
  431. package/server/routes/file/controllers/export.js +0 -290
  432. package/server/routes/file/controllers/files.js +0 -72
  433. package/server/routes/file/controllers/resize.js +0 -96
  434. package/server/routes/file/controllers/resizeAll.js +0 -165
  435. package/server/routes/file/controllers/upload.js +0 -55
  436. package/server/routes/file/controllers/uploadImage.js +0 -47
  437. package/server/routes/file/controllers/utils/formatResult.js +0 -17
  438. package/server/routes/file/controllers/utils/jsonToCsv.js +0 -36
  439. package/server/routes/file/controllers/utils/jsonToXls.js +0 -42
  440. package/server/routes/file/index.mjs +0 -26
  441. package/server/routes/file/schema.js +0 -16
  442. package/server/routes/grpc/controllers/file2geojson.js +0 -60
  443. package/server/routes/grpc/controllers/filePreview.js +0 -89
  444. package/server/routes/grpc/index.mjs +0 -12
  445. package/server/routes/logger/controllers/logger.file.js +0 -97
  446. package/server/routes/logger/controllers/logger.test.api.js +0 -48
  447. package/server/routes/logger/controllers/utils/checkUserAccess.js +0 -24
  448. package/server/routes/logger/controllers/utils/getRootDir.js +0 -27
  449. package/server/routes/logger/index.js +0 -22
  450. package/server/routes/menu/controllers/getMenu.js +0 -98
  451. package/server/routes/menu/controllers/interfaces.js +0 -21
  452. package/server/routes/menu/index.mjs +0 -8
  453. package/server/routes/menu/schema.js +0 -0
  454. package/server/routes/properties/controllers/properties.get.js +0 -33
  455. package/server/routes/properties/controllers/properties.post.js +0 -76
  456. package/server/routes/properties/index.js +0 -25
  457. package/server/routes/table/controllers/card.js +0 -77
  458. package/server/routes/table/controllers/cardData.js +0 -155
  459. package/server/routes/table/controllers/cardTabData.js +0 -57
  460. package/server/routes/table/controllers/dataInfo.js +0 -56
  461. package/server/routes/table/controllers/filter.js +0 -154
  462. package/server/routes/table/controllers/form.js +0 -42
  463. package/server/routes/table/controllers/search.js +0 -74
  464. package/server/routes/table/controllers/suggest.js +0 -246
  465. package/server/routes/table/controllers/tableData.js +0 -62
  466. package/server/routes/table/controllers/tableInfo.js +0 -110
  467. package/server/routes/table/controllers/tokenInfo.js +0 -12
  468. package/server/routes/table/controllers/utils/conditions.js +0 -21
  469. package/server/routes/table/controllers/utils/formatSchema.js +0 -23
  470. package/server/routes/table/controllers/utils/locales.js +0 -1
  471. package/server/routes/table/functions/getData.js +0 -436
  472. package/server/routes/table/index.js +0 -57
  473. package/server/routes/table/schema.js +0 -127
  474. package/server/routes/templates/controllers/getTemplate.js +0 -51
  475. package/server/routes/templates/index.mjs +0 -10
  476. package/server/routes/util/controllers/code.generator.js +0 -94
  477. package/server/routes/util/controllers/next.id.js +0 -4
  478. package/server/routes/util/controllers/status.monitor.js +0 -8
  479. package/server/routes/util/controllers/user.tokens.js +0 -45
  480. package/server/routes/util/index.js +0 -14
  481. package/server/routes/widget/controllers/file.edit.js +0 -55
  482. package/server/routes/widget/controllers/widget.del.js +0 -99
  483. package/server/routes/widget/controllers/widget.get.js +0 -137
  484. package/server/routes/widget/controllers/widget.set.js +0 -108
  485. package/server/routes/widget/hook/onWidgetSet.js +0 -13
  486. package/server/routes/widget/index.mjs +0 -38
  487. package/utils.js +0 -112
  488. /package/{server → dist/server}/plugins/grpc/utils/convertp.proto +0 -0
  489. /package/{server → dist/server}/plugins/grpc/utils/office2pdf.proto +0 -0
@@ -0,0 +1,20 @@
1
+ import { config, dblist, getRedis } from "../../../../utils.js";
2
+ const rclient = getRedis();
3
+ export default async function setItem(req) {
4
+ const { params = {} } = req;
5
+ const { id } = params;
6
+ if (!id) {
7
+ return { error: "not enough params", status: 400 };
8
+ }
9
+ const current = dblist.find((el) => [el.id, el.key].includes(id));
10
+ if (!current?.database) {
11
+ return { error: "invalid param id", status: 400 };
12
+ }
13
+ const uid = req.session?.passport?.user?.uid || // login db
14
+ req.session?.passport?.user?.username || // login passwd
15
+ "2";
16
+ if (config.redis) {
17
+ await rclient.setex(`current-db:${uid}`, 60 * 60 * 10000, id);
18
+ }
19
+ return { current: id };
20
+ }
@@ -0,0 +1,17 @@
1
+ import readItemList from "./controllers/readItems.js";
2
+ import setItem from "./controllers/setItem.js";
3
+ const policy = ["site"];
4
+ export default async function plugin(app) {
5
+ app.route({
6
+ method: "GET",
7
+ url: "/db-list",
8
+ config: { policy },
9
+ handler: readItemList,
10
+ });
11
+ app.route({
12
+ method: "GET",
13
+ url: "/db-list/:id",
14
+ config: { policy },
15
+ handler: setItem,
16
+ });
17
+ }
@@ -0,0 +1,8 @@
1
+ const showKeys = ["id", "key", "title"];
2
+ export default function formatData(data = []) {
3
+ return data?.length
4
+ ? data.map((el) => Object.keys(el)
5
+ .filter((key) => showKeys.includes(key))
6
+ .reduce((acc, curr) => Object.assign(acc, { [curr]: el[curr] }), {}))
7
+ : [];
8
+ }
@@ -0,0 +1,99 @@
1
+ import { config, dataUpdate, logger, pgClients } from "../../../../utils.js";
2
+ const resp = { message: "File not found", status: 404 };
3
+ /**
4
+ * Апі використовується для видалення файлів за допомогою fs або s3
5
+ *
6
+ * @method GET
7
+ * @summary Видалення файлів і оновлення логів в БД
8
+ * @priority 5
9
+ * @alias deleteFileAPI
10
+ * @type api
11
+ * @tag file
12
+ * @requires deleteFile
13
+ * @param {Object} params Параметри URL
14
+ * @param {String} params[0] Шлях до файла
15
+ * @errors 403,500
16
+ * @returns {Number} status Номер помилки
17
+ * @returns {String|Object} error Опис помилки
18
+ * @returns {Object} headers Заголовки HTTP
19
+ * @returns {String} message Повідомлення про успішне виконання або об'єкт з параметрами
20
+ */
21
+ export default async function deleteFileAPI(req) {
22
+ const { pg = pgClients.client, params = {}, user = {} } = req;
23
+ if (!params["*"]) {
24
+ return resp;
25
+ }
26
+ const filename = params["*"].startsWith("/") || /^[0-9]+$/.test(params["*"])
27
+ ? params["*"]
28
+ : `/${params["*"]}`;
29
+ const { uid, user_rnokpp: rnokpp } = user;
30
+ if (!filename) {
31
+ logger.file("file", {
32
+ level: "INFO",
33
+ type: "delete",
34
+ message: 'No required param "filename"',
35
+ file: params["*"],
36
+ uid,
37
+ rnokpp,
38
+ });
39
+ return resp;
40
+ }
41
+ if (filename.includes("..")) {
42
+ logger.file("file", {
43
+ level: "WARN",
44
+ type: "delete",
45
+ message: "injection attempt",
46
+ file: params["*"],
47
+ uid,
48
+ rnokpp,
49
+ });
50
+ return resp;
51
+ }
52
+ try {
53
+ const result = await pg
54
+ .query("select file_id, file_path as fpath, uid from crm.files where $1 in (file_path, file_id)", [filename])
55
+ .then((el) => el.rows?.[0] || {});
56
+ const res = await dataUpdate({
57
+ pg,
58
+ table: "crm.files",
59
+ id: result?.file_id,
60
+ data: { file_status: 3 },
61
+ uid,
62
+ });
63
+ if (!res) {
64
+ logger.file("file", {
65
+ level: "INFO",
66
+ type: "delete",
67
+ message: resp.message,
68
+ file: params["*"],
69
+ uid,
70
+ rnokpp,
71
+ });
72
+ return resp;
73
+ }
74
+ const message = { id: res.file_id, filepath: res.file_path };
75
+ logger.file("file", {
76
+ level: "INFO",
77
+ type: "delete",
78
+ message,
79
+ file: params["*"],
80
+ uid,
81
+ rnokpp,
82
+ });
83
+ return { message, status: 200 };
84
+ }
85
+ catch (err) {
86
+ logger.file("file", {
87
+ level: "ERROR",
88
+ type: "delete",
89
+ message: err.toString(),
90
+ file: params["*"],
91
+ uid,
92
+ rnokpp,
93
+ });
94
+ return {
95
+ error: config?.local ? err.toString() : "Помилка видалення файлу",
96
+ status: 500,
97
+ };
98
+ }
99
+ }
@@ -0,0 +1,56 @@
1
+ import path from 'node:path';
2
+ import providers from '../../../plugins/file/providers/index.js';
3
+ import getMimeType from '../../../plugins/file/providers/mime/index.js';
4
+ /* const allowedPublicDirs = [
5
+ 'upload', 'page', 'site', 'maps', 'tmp', 'uploads', 'site_slider', 'module', 'product', 'image', 'geo_works_file',
6
+ ]; */
7
+ /**
8
+ * Апі використовується для скачування файлів за допомогою fs або s3
9
+ *
10
+ * @method GET
11
+ * @summary Апі для скачування файлів за провайдером
12
+ * @priority 4
13
+ * @alias download
14
+ * @type api
15
+ * @tag file
16
+ * @requires getMimeType
17
+ * @param {Object} params Параметри URL
18
+ * @errors 400,404,403,500
19
+ * @returns {Number} status Номер помилки
20
+ * @returns {String|Object} error Опис помилки
21
+ * @returns {Object} headers Заголовки HTTP
22
+ * @returns {String} pipe Шлях до файла для скачування або відображення
23
+ */
24
+ async function download({ params }, reply) {
25
+ if (!params?.['*'])
26
+ return { message: 'not enough params', status: 400 };
27
+ const filename = params['*'].startsWith('/') ? params['*'].slice(1) : params['*'];
28
+ if (!filename)
29
+ return { message: "required param 'filename'", status: 400 };
30
+ if (filename?.includes?.('..'))
31
+ return { message: 'wrong params', status: 400 };
32
+ /* const { security } = getSettings();
33
+ const { enabled: externalAccess } = await pg.one('select enabled from admin.data_api where account_name = $1 and api_key = $2', { args: [account, key] });
34
+ if ((sid === 35 && !isUser && !externalAccess)
35
+ || (sid === 1
36
+ && !allowedPublicDirs.some((dir) => filename?.includes?.(`${dir}/`))
37
+ && !security?.public_dirs?.split(',')?.some((dir) => filename?.includes?.(`${dir}/`)))
38
+ ) {
39
+ return { error: 'Немає доступу', status: 403 };
40
+ } */
41
+ const filepath = filename.startsWith('files/')
42
+ ? filename
43
+ : path.join('files', filename);
44
+ // download
45
+ const fp = providers({});
46
+ const fileStream = await fp.downloadFile(filepath);
47
+ if (!fileStream)
48
+ return { error: `Файл не знайдено - ${filename}`, status: 404 };
49
+ const headers = {
50
+ 'Content-Disposition': `attachment; filename=${path.basename(filename)}`,
51
+ 'Content-Type': getMimeType(filepath),
52
+ };
53
+ reply.headers(headers);
54
+ return fileStream;
55
+ }
56
+ export default download;
@@ -0,0 +1,294 @@
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 { mkdir, readFile, rm, writeFile } from "node:fs/promises";
10
+ import config from "../../../../config.js";
11
+ import logger from "../../../plugins/logger/getLogger.js";
12
+ import getTemplate from "../../../plugins/table/funcs/getTemplate.js";
13
+ import getMeta from "../../../plugins/pg/funcs/getMeta.js";
14
+ import pgClients from "../../../plugins/pg/pgClients.js";
15
+ import eventStream from "../../../plugins/util/funcs/eventStream.js";
16
+ import getData from "../../../plugins/table/funcs/getData.js";
17
+ import getFolder from "../../../plugins/crud/funcs/utils/getFolder.js";
18
+ import metaFormat from "../../../plugins/table/funcs/metaFormat/index.js";
19
+ import jsonToXls from "./utils/jsonToXls.js";
20
+ import jsonToCsv from "./utils/jsonToCsv.js";
21
+ import formatResult from "./utils/formatResult.js";
22
+ const startStreamWithTotal = 10000;
23
+ const rootDir = getFolder(config, "local");
24
+ /**
25
+ * Експорт даних з таблиці
26
+ *
27
+ * @method GET
28
+ * @alias exportTable
29
+ * @type api
30
+ * @tag export
31
+ * @summary Експорт даних у таблицю(xlsx, csv, json, geojson)
32
+ * @priority 1
33
+ * @example
34
+ * /api/export?table=com_property.subjects.table&format=csv&cols=economy_type,name_ua
35
+ * @param {String} format Формат документу на виході
36
+ * @param {Boolean} nocache Чи використовувати кеш
37
+ * @param {String} table Таблиця в БД
38
+ * @param {String|Number} filter Параметр фільтру для застосування до експортованих даних
39
+ * @errors 400, 500
40
+ * @returns {Number} status Номер помилки
41
+ * @returns {String} error Опис помилки
42
+ * @returns {String|Object} message Повертає SQL запит або opt або рядки SQL запиту
43
+ * @returns {String} file Шлях до файла для скачування або відображення
44
+ */
45
+ export default async function exportTable({ pg = pgClients.client, user, unittest, columns: columns1, cls, query = {}, host = "127.0.0.1", tableSql, sourceName, }, reply) {
46
+ const { id, cols, search, format = "json", table, filter = "empty", nocache, formatAnswer = "file", sql, stream, } = query;
47
+ if (!table && !tableSql) {
48
+ return reply.status(400).send("not enough params: table");
49
+ }
50
+ if (!["csv", "xlsx", "json", "geojson"].includes(format)) {
51
+ return reply.status(400).send("param format is invalid");
52
+ }
53
+ const date = new Date();
54
+ const sufixName = `${filter}-${cols || "all"}-${search}-${query.limit || "unlimited"}`;
55
+ const sufixDate = [
56
+ date.getFullYear(),
57
+ date.getMonth(),
58
+ date.getDate(),
59
+ date.getHours(),
60
+ ].join("-");
61
+ const objInfo = createHash("md5")
62
+ .update([sufixName, sufixDate].join("-"))
63
+ .digest("hex");
64
+ const fileName = (table || (tableSql ? createHash("md5").update(tableSql).digest("hex") : ""))
65
+ .concat("_")
66
+ .concat(objInfo)
67
+ .concat(".")
68
+ .concat(format);
69
+ const filePath = path.join(rootDir, "/files/temp", fileName);
70
+ const ext = path.extname(filePath);
71
+ const cacheFile = existsSync(filePath);
72
+ const filePathJSON = ["csv", "xlsx", "geojson"].includes(format)
73
+ ? filePath.replace(ext, ".json")
74
+ : filePath;
75
+ const cacheFileJSON = existsSync(filePathJSON);
76
+ // return from cache
77
+ if (cacheFile && !sql && !nocache && !config.disableCache) {
78
+ return formatResult({
79
+ filePath,
80
+ formatAnswer,
81
+ folder: rootDir,
82
+ reply,
83
+ });
84
+ }
85
+ // delete old file, prevent append
86
+ if (nocache || config.disableCache) {
87
+ if (cacheFile)
88
+ await rm(filePath);
89
+ if (cacheFileJSON && format !== "json")
90
+ await rm(filePathJSON);
91
+ }
92
+ const loadTable = await getTemplate("table", table);
93
+ const meta = await getMeta({ pg, table: loadTable?.table || table });
94
+ if (!meta?.pk && !meta?.view && !tableSql) {
95
+ return reply.status(404).send("table not found");
96
+ }
97
+ if (format === "geojson" && !meta?.geom) {
98
+ return reply
99
+ .status(400)
100
+ .send("Ця форма не містить полів геометрії. Виберіть тип, який не потребує геометрії для вивантаження");
101
+ }
102
+ const options = {
103
+ id,
104
+ table,
105
+ pg,
106
+ filter,
107
+ search,
108
+ user,
109
+ sql,
110
+ sufix: false,
111
+ };
112
+ // check total count, debug sql etc.
113
+ const result = tableSql
114
+ ? await pg
115
+ .query(`select count(*) as total, json_agg(row_to_json(q)) as rows from (${tableSql})q`)
116
+ .then((el) => el.rows?.[0] || {})
117
+ : await getData(options, reply, true);
118
+ if (sql)
119
+ return result;
120
+ if (!result?.rows?.length) {
121
+ return reply.status(200).send("Немає даних, які можна експортувати");
122
+ }
123
+ const { total, filtered = result.total || 0 } = result;
124
+ const limit = startStreamWithTotal > filtered
125
+ ? filtered
126
+ : Math.min(query.limit || 1000, startStreamWithTotal) ||
127
+ startStreamWithTotal;
128
+ Object.assign(options, { limit });
129
+ const colmodel = (columns1 || loadTable?.columns || meta?.columns || [])?.map((el) => ({
130
+ name: el.name,
131
+ data: el.data || el.option,
132
+ title: el.title || el.ua,
133
+ type: el.type || el.format || "text",
134
+ html: el.html,
135
+ })); // skip html to avoid errors
136
+ // get present columns
137
+ const columns = cols === "all" || !cols
138
+ ? colmodel
139
+ : colmodel
140
+ ?.filter((el) => (el.type || /\./.test(el.name)) &&
141
+ !el?.hidden &&
142
+ (cols?.split(",")?.length
143
+ ? cols.split(",").includes(el.name)
144
+ : true))
145
+ ?.filter((el) => Object.hasOwn(el, "export") ? !el.export : true);
146
+ const htmls = columns
147
+ .filter((el) => el.html)
148
+ .reduce((acc, curr) => ({
149
+ ...acc,
150
+ [curr.name]: curr.html,
151
+ }), {});
152
+ const columnList = columns?.map((el) => /\./.test(el.name)
153
+ ? `${el.name.split(".")[0]}->>'${el.name.split(".")[1]}' as ${el.name
154
+ .split(".")
155
+ .pop()}` // check for json data
156
+ : el.name);
157
+ const send = (+filtered > startStreamWithTotal || stream) && !unittest
158
+ ? eventStream(reply)
159
+ : unittest
160
+ ? console.log
161
+ : () => { };
162
+ // export xlsx / csv / json
163
+ const source = loadTable?.title || loadTable?.ua || table || sourceName;
164
+ const interval = setInterval(async () => {
165
+ send("process query...");
166
+ }, 5000);
167
+ // start stream only if total exceed limit, but use while anyway
168
+ const res = {};
169
+ let offset = 0;
170
+ let page = 1;
171
+ let seq = 0;
172
+ send(`Всього в реєстрі: ${result.total} (${filtered} з урахуванням фільтрів)`);
173
+ if (!cacheFileJSON || nocache || config.disableCache) {
174
+ while (+filtered - offset > 0 && !res?.error) {
175
+ try {
176
+ send(`Оброблено: ${offset}/${filtered}`);
177
+ const { rows = [] } = tableSql
178
+ ? await pg.query(`select * from (${tableSql})q limit ${options.limit} offset ${offset}`)
179
+ : await getData({ ...options, page }, reply, true);
180
+ send(`seq: ${++seq}`);
181
+ send(`Обробка ${rows.length} об'єктів...`);
182
+ if (!rows.length) {
183
+ send("Обробка даних успішно завершена");
184
+ break;
185
+ }
186
+ await metaFormat({
187
+ rows,
188
+ cls,
189
+ htmls,
190
+ sufix: false,
191
+ }, pg);
192
+ // skip non present after metaFormat
193
+ if (!tableSql) {
194
+ rows.forEach((row) => {
195
+ Object.keys(row)
196
+ .filter((el) => !columnList.includes(el))
197
+ .forEach((key) => delete row[key]);
198
+ });
199
+ }
200
+ const jsonFileExists = existsSync(filePathJSON);
201
+ // convert from json to format
202
+ if (!jsonFileExists) {
203
+ // if json not exists
204
+ await mkdir(path.dirname(filePath), { recursive: true });
205
+ await writeFile(filePathJSON, JSON.stringify(rows));
206
+ }
207
+ else {
208
+ // if json exists
209
+ const jsonData = JSON.parse((await readFile(filePathJSON, "utf8")) || "{}");
210
+ const moreData = jsonData.concat(rows); // rewrite to appendFile?
211
+ await writeFile(filePathJSON, JSON.stringify(moreData));
212
+ }
213
+ offset += rows.length;
214
+ page++;
215
+ }
216
+ catch (err) {
217
+ send(`error: ${err.toString()}`);
218
+ logger.file("export/table/error", {
219
+ filePath: filePathJSON,
220
+ total,
221
+ filtered,
222
+ offset,
223
+ result: res,
224
+ error: err.toString(),
225
+ stack: err.stack,
226
+ });
227
+ Object.assign(res, { error: err.toString() });
228
+ }
229
+ }
230
+ }
231
+ clearInterval(interval);
232
+ if (res.error) {
233
+ send(res.error, 1);
234
+ return reply.status(500).send(res.error);
235
+ }
236
+ logger.file("export/table", {
237
+ table,
238
+ format,
239
+ total,
240
+ filtered,
241
+ time: Date.now() - date.getTime(),
242
+ });
243
+ if (format !== "json") {
244
+ const txt = nocache || config.disableCache || !cacheFileJSON
245
+ ? `Сформовано файл формату json. Початок конвертації в ${format}...`
246
+ : `Знайдено файл формату json. Початок конвертації в ${format}...`;
247
+ send(txt);
248
+ }
249
+ if (format === "geojson") {
250
+ const rows = JSON.parse((await readFile(filePathJSON, "utf8")) || "[]");
251
+ const geojson = {
252
+ type: "FeatureCollection",
253
+ features: rows.map((row) => ({
254
+ type: "Feature",
255
+ name: "export",
256
+ geometry: row.geom,
257
+ properties: Object.fromEntries(Object.entries(row).filter(([key]) => key !== "geom")),
258
+ })),
259
+ };
260
+ await mkdir(path.dirname(filePath), { recursive: true });
261
+ await writeFile(filePath, JSON.stringify(geojson));
262
+ }
263
+ const resp = {};
264
+ if (format === "csv") {
265
+ await jsonToCsv({
266
+ filePath: filePathJSON,
267
+ send,
268
+ colmodel,
269
+ domain: host,
270
+ source,
271
+ columnList,
272
+ });
273
+ }
274
+ if (format === "xlsx") {
275
+ await jsonToXls({
276
+ filePath: filePathJSON,
277
+ send,
278
+ colmodel,
279
+ domain: host,
280
+ source,
281
+ resp,
282
+ });
283
+ }
284
+ if (resp.error) {
285
+ return reply.status(resp.status || 500).send(resp.error);
286
+ }
287
+ send("Файл успішно сформовано. Натистіть кнопку ще раз для завантаження даних", 1);
288
+ return formatResult({
289
+ filePath,
290
+ formatAnswer,
291
+ folder: rootDir,
292
+ reply,
293
+ });
294
+ }
@@ -0,0 +1,57 @@
1
+ import path from "node:path";
2
+ import mime from "../../../plugins/file/providers/mime/index.js";
3
+ import isFileExists from "../../../plugins/file/isFileExists.js";
4
+ import downloadFile from "../../../plugins/file/downloadFile.js";
5
+ import { applyHook } from "../../../../utils.js";
6
+ /**
7
+ * Апі використовується для отримання різних файлів і можливістю змінювати їх
8
+ *
9
+ * @method GET
10
+ * @summary Отримання файлів з директорії системи
11
+ * @priority 5
12
+ * @alias files
13
+ * @type api
14
+ * @tag file
15
+ * @requires getFile
16
+ * @requires mime
17
+ * @param {Object} params Параметри URL
18
+ * @errors 500
19
+ * @returns {Number} status Номер помилки
20
+ * @returns {String} error Опис помилки
21
+ * @returns {Object} headers Заголовки HTTP
22
+ * @returns {String} pipe Шлях до файла для скачування або відображення
23
+ */
24
+ export default async function getFile({ params }, reply) {
25
+ if (!params?.["*"]) {
26
+ return { message: "not enough params", status: 400 };
27
+ }
28
+ if (params["*"]?.includes("../")) {
29
+ return { message: "wrong params", status: 403 };
30
+ }
31
+ const relpath = (params["*"].startsWith("/") ? params["*"].slice(1) : params["*"]).replace(/files\//g, "") + (params["*"].endsWith("/") ? "index.html" : "");
32
+ if (!relpath) {
33
+ return { message: "No required param 'filename'", status: 400 };
34
+ }
35
+ if (relpath.includes("..")) {
36
+ return { message: "wrong params", status: 400 };
37
+ }
38
+ const hookData = await applyHook("preFile", { relpath, reply });
39
+ if (hookData)
40
+ return hookData;
41
+ const filepath = path.join("files", relpath);
42
+ const exists = await isFileExists(filepath);
43
+ if (!exists) {
44
+ return { message: "file not found", status: 404 };
45
+ }
46
+ const fileStream = await downloadFile(filepath);
47
+ if (!fileStream) {
48
+ return { message: "file not found", status: 404 };
49
+ }
50
+ const headers = {
51
+ "Content-Disposition": `inline; filename=${path.basename(filepath)}`,
52
+ "Cache-Control": "max-age=86400",
53
+ "Content-Type": `${mime(filepath)}`, // ; charset=utf-8 --- untested
54
+ };
55
+ reply.headers(headers);
56
+ return fileStream;
57
+ }
@@ -0,0 +1,86 @@
1
+ /* eslint-disable no-console */
2
+ import path from "node:path";
3
+ import { imageSize } from "image-size";
4
+ import { config, downloadFile, uploadFile, grpc, isFileExists, } from "../../../../utils.js";
5
+ import getMimeType from "../../../plugins/file/providers/mime/index.js";
6
+ const defaultWidth = 400;
7
+ const defaultHeight = 240;
8
+ const maxWidth = 2000;
9
+ const getHeight = (width, size, ratio = 1) => {
10
+ if (size && size.toLowerCase().split("x")[1])
11
+ return size.toLowerCase().split("x")[1];
12
+ if (width)
13
+ return width / ratio;
14
+ return defaultHeight;
15
+ };
16
+ const { resizeImage } = grpc();
17
+ /**
18
+ * Апі використовується для зміни розміру фото за шляхом
19
+ */
20
+ export default async function resize({ query, unittest, }, reply) {
21
+ const { filepath, quality, size, w, h, nocache } = query || {};
22
+ if (!filepath) {
23
+ return reply.status(400).send("not enough query params: filepath");
24
+ }
25
+ const basename = path.basename(filepath);
26
+ const mimeType = getMimeType(filepath);
27
+ if (!mimeType) {
28
+ return reply.status(400).send("invalid query params: filepath");
29
+ }
30
+ const resizePath1 = size
31
+ ? filepath.replace(basename, `${size}_resized_${basename}`)
32
+ : filepath.replace(basename, `${w || defaultWidth}_${h || (w ? "" : defaultHeight)}_resized_${basename}`);
33
+ // get Resize Data
34
+ const fileExists = await isFileExists(resizePath1);
35
+ const originalFileExists = await isFileExists(resizePath1.replace("files/", "files/original/")); // resize-all API compatibility
36
+ const resizePath = originalFileExists
37
+ ? resizePath1.replace("files/", "files/original/")
38
+ : resizePath1;
39
+ const resizeData = fileExists
40
+ ? await downloadFile(resizePath, { buffer: true })
41
+ : null;
42
+ if (resizeData && !config.disableCache && !nocache && !unittest) {
43
+ return reply
44
+ .headers({ "Content-Type": mimeType, "Cache-control": "max-age=604800" })
45
+ .send(resizeData);
46
+ }
47
+ // get File Data
48
+ const fileData = await downloadFile(filepath, { buffer: true });
49
+ if (!fileData?.length) {
50
+ return reply.status(404).send(`Файл не знайдено - ${filepath}`);
51
+ }
52
+ const resizeQuality = Math.min(+(quality || 75), 100);
53
+ const { width = defaultWidth, height = defaultHeight } = imageSize(fileData) || {};
54
+ const ratio = width / height;
55
+ const check = (size?.toLowerCase?.()?.split?.("x") || [])
56
+ .concat(w || "", h || "")
57
+ .filter((el) => el && +el > maxWidth);
58
+ if (check.length) {
59
+ return reply.status(400).send({ message: "resize image size too big" });
60
+ }
61
+ const resizeWidth = (h && !w ? +h * ratio : null) ||
62
+ (size?.toLowerCase?.()?.split?.("x")?.[1] &&
63
+ !size?.toLowerCase?.()?.split?.("x")?.[0]
64
+ ? +(size?.toLowerCase?.()?.split?.("x")?.[1] || 0) * ratio
65
+ : null) ||
66
+ (w ? +w : null) ||
67
+ (size?.toLowerCase?.()?.split?.("x")?.[0]
68
+ ? +(size?.toLowerCase?.()?.split?.("x")?.[0] || 0)
69
+ : null) ||
70
+ Math.min(width, maxWidth);
71
+ const resizeHeight = h || getHeight(resizeWidth, size, ratio);
72
+ if (config.trace) {
73
+ console.log("original width/height/ratio: ", width, height, ratio);
74
+ console.log("resize width/height/ratio/quality: ", resizeWidth, resizeHeight, resizeWidth / resizeHeight, resizeQuality);
75
+ }
76
+ const { result } = await resizeImage({
77
+ base64: Buffer.from(fileData).toString("base64"),
78
+ width: resizeWidth,
79
+ height: resizeHeight,
80
+ quality: resizeQuality,
81
+ });
82
+ await uploadFile(resizePath, Buffer.from(result, "base64"));
83
+ return reply
84
+ .headers({ "Content-Type": mimeType })
85
+ .send(Buffer.from(result, "base64"));
86
+ }