@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,45 @@
1
+ /* eslint-disable no-param-reassign */
2
+ function handleData(data, curr, acc, titles, plain, splittype = 1) {
3
+ const titleStr = {
4
+ 1: `${titles?.[curr] || curr}\n`, // for lists
5
+ 2: `${titles?.[curr] || curr}: `, // one-liner
6
+ 3: "", // for nested lists w/ one property
7
+ }[splittype];
8
+ if (Array.isArray(data[curr])) {
9
+ const str = `${plain ? "" : "\n\n### "}${titleStr}${data[curr].map((el) => {
10
+ if (typeof el === "object" && !Array.isArray(el)) {
11
+ const str1 = Object.keys(el)
12
+ .filter((item) => item !== "id")
13
+ .reduce((acc1, curr1) => handleData(el, curr1, acc1, {}, 1, 3), "");
14
+ return `\n - ${str1}`;
15
+ }
16
+ return `\n - ${el}`;
17
+ })}`;
18
+ acc += `${str}`;
19
+ return acc;
20
+ }
21
+ if (typeof data[curr] === "object") {
22
+ const str = `${plain ? "" : "\n\n### "} ${titleStr}${JSON.stringify(data[curr])}`;
23
+ acc += str;
24
+ return acc;
25
+ }
26
+ acc += `${plain ? "" : "\n\n### "}${titleStr}${data[curr] || ""}`;
27
+ return acc;
28
+ }
29
+ export default function formatMdoc(data, titles = {}, headerColumns = [], descriptionColumns = []) {
30
+ if (!data)
31
+ return "empty data";
32
+ if (typeof data !== "object" || Array.isArray(data))
33
+ return "invalid data";
34
+ if (headerColumns && !Array.isArray(headerColumns))
35
+ return "invalid headerColumns";
36
+ if (descriptionColumns && !Array.isArray(descriptionColumns))
37
+ return "invalid descriptionColumns";
38
+ const header = Object.keys(data)
39
+ .filter((key) => headerColumns.includes(key) && data[key])
40
+ .reduce((acc, curr) => handleData(data, curr, acc, titles, 1, 2), "");
41
+ const description = Object.keys(data)
42
+ .filter((key) => descriptionColumns.includes(key) && data[key])
43
+ .reduce((acc, curr) => handleData(data, curr, acc, titles), "");
44
+ return `---\n${header}\n---${description}`.replace(/,,/g, ",");
45
+ }
@@ -1,17 +1,16 @@
1
- import md from 'markdown-it';
2
-
3
- const md1 = md({ html: true });
4
-
5
- /**
6
- * Перетворення з файла readme.md до формату HTML.
7
- * Потрабно вставити в хелпер шлях до файла або текст readme.md і за допомогою бібліотеки markdown-it перетвориться в HTML.
8
-
9
- * @returns {String} Returns HTML
10
- */
11
- export default function mdToHTML(data) {
12
- // auto detect HTML or MD
13
- // const result = md().render(data);
14
- if (!data) return 'empty data';
15
- const result = md1.render(data);
16
- return result;
17
- }
1
+ import md from "markdown-it";
2
+ const md1 = md({ html: true });
3
+ /**
4
+ * Перетворення з файла readme.md до формату HTML.
5
+ * Потрабно вставити в хелпер шлях до файла або текст readme.md і за допомогою бібліотеки markdown-it перетвориться в HTML.
6
+
7
+ * @returns {String} Returns HTML
8
+ */
9
+ export default function mdToHTML(data) {
10
+ // auto detect HTML or MD
11
+ // const result = md().render(data);
12
+ if (!data)
13
+ return "empty data";
14
+ const result = md1.render(data);
15
+ return result;
16
+ }
@@ -0,0 +1,6 @@
1
+ import addCron from "../cron/funcs/addCron.js";
2
+ import systemMetricsFifthly from "./systemMetricsFifthly.js";
3
+ async function plugin() {
4
+ addCron(systemMetricsFifthly, 60 * 15);
5
+ }
6
+ export default plugin;
@@ -0,0 +1,127 @@
1
+ import os from "os";
2
+ import process from "process";
3
+ import util from "node:util";
4
+ import { exec } from "node:child_process";
5
+ import { config, getFolder, pgClients, getRedis } from "../../../utils.js";
6
+ const execAsync = util.promisify(exec);
7
+ const platform = os.platform();
8
+ const processFolder = os.homedir();
9
+ const formatMemoryUsage = (data) => `${(data / 1024 / 1024).toFixed(2)} MB`;
10
+ const rclient = getRedis();
11
+ const rclient2 = getRedis({ db: 2 });
12
+ // const rclient10 = getRedis({ db: 10 });
13
+ const filesFolder = getFolder(config);
14
+ const redisKey = "logger-process-online";
15
+ const sqlQuery = `select datname as dbname, application_name as app, client_addr as client_ip,
16
+ (now()-backend_start)::text as msec, state, query from pg_stat_activity where datname=$1`;
17
+ export default async function loggerSystem(req) {
18
+ const { pg = pgClients.client } = req;
19
+ const dbName = pg?.options?.database;
20
+ const dbsize = config.redis
21
+ ? await rclient.get(`${dbName}:content:dbsize:${redisKey}`)
22
+ : null;
23
+ const dbVerion = await pg
24
+ .query("select version();")
25
+ .then((el) => el.rows?.[0]?.version);
26
+ const dbSize = dbsize ||
27
+ (await pg
28
+ .query(`select pg_size_pretty(pg_database_size('${dbName}'));`)
29
+ .then((el) => el.rows?.[0]?.pg_size_pretty));
30
+ const { rows: query = [] } = await pg.query(sqlQuery, [dbName]);
31
+ const { stdout: topProcess } = platform === "win32"
32
+ ? { stdout: "Cant show top on this system type" }
33
+ : await execAsync("top -b -n 1");
34
+ const osInfo = `${os.version()} ${os.machine?.() || ""}`;
35
+ const cpuInfo = os.cpus();
36
+ const totalCpu = Object.values(cpuInfo?.[0]?.times || {}).reduce((acc, tv) => acc + tv, 0) *
37
+ cpuInfo.length;
38
+ const totalMemory = os.totalmem();
39
+ const memory = process.memoryUsage();
40
+ const resource = process.resourceUsage();
41
+ const currentCpuUsage = (((process.cpuUsage().user + process.cpuUsage().system) * 1000) /
42
+ totalCpu) *
43
+ 100;
44
+ const redisInfo = config.redis ? await rclient.info() : "";
45
+ const lines = redisInfo.split("\r\n").filter((el) => el && el.split);
46
+ const redis = {};
47
+ for (let i = 0; i < lines.length; i += 1) {
48
+ const [key, val] = lines[i].split(":");
49
+ if (val) {
50
+ redis[key] = val;
51
+ }
52
+ }
53
+ if (config.redis) {
54
+ await rclient.set(`${dbName}:content:dbsize:${redisKey}`, dbSize, "EX", 30 * 60);
55
+ }
56
+ const latency = config.redis ? await rclient.latency("latest") : null;
57
+ const uptime = await pg
58
+ .query("select extract('epoch' from current_timestamp - pg_postmaster_start_time())::int as uptime")
59
+ .then((el) => el.rows?.[0]?.uptime);
60
+ const metric5 = config.redis
61
+ ? await rclient2.hgetall(`${dbName}:system_metrics`)
62
+ : {};
63
+ Object.keys(metric5 || {})
64
+ .filter((el) => el.startsWith("time"))
65
+ .forEach((m) => {
66
+ metric5[m] /= 1000.0;
67
+ });
68
+ const metricSort = metric5
69
+ ? JSON.parse(JSON.stringify(metric5, Object.keys(metric5).sort()))
70
+ : undefined;
71
+ const userOnline = config.redis
72
+ ? await rclient2.scan(["0", "match", `${dbName}:user:*`, "count", "10000"])
73
+ : [];
74
+ // const userOnline = await rclient10.scan(['0', 'match', 'sess:*', 'count', '10000']);
75
+ return {
76
+ process: {
77
+ root: process.cwd(),
78
+ processFolder,
79
+ saveDirectory: filesFolder,
80
+ dbhost: pg?.options?.host,
81
+ dbport: pg?.options?.port,
82
+ dbname: dbName,
83
+ },
84
+ uptime: {
85
+ node: Math.round(process.uptime()),
86
+ system: os.uptime(),
87
+ pg: uptime,
88
+ redis: typeof redis?.uptime_in_seconds === "number"
89
+ ? redis.uptime_in_seconds - 0
90
+ : 0,
91
+ },
92
+ metric: {
93
+ cpu: `${Math.round(currentCpuUsage)} %`,
94
+ memory: `${Math.round((memory.rss / totalMemory) * 100 * 100) / 100} %`,
95
+ "user.online": userOnline?.[1]?.length,
96
+ "node.total": formatMemoryUsage(memory.heapTotal),
97
+ "node.used": formatMemoryUsage(memory.heapUsed),
98
+ "node.rss": formatMemoryUsage(memory.rss),
99
+ "node.cpu.time": resource.systemCPUTime,
100
+ "node.cpu.load": os.loadavg()[0],
101
+ "redis.ram": redis.used_memory_human,
102
+ "redis.latency": latency?.join?.(","),
103
+ "redis.ram.peak": redis.used_memory_peak_human,
104
+ "redis.clients": redis.connected_clients,
105
+ "redis.db0": redis.db0?.split(",")?.[0]?.substring(5),
106
+ "redis.db1": redis.db1?.split(",")?.[0]?.substring(5),
107
+ "redis.db2": redis.db2?.split(",")?.[0]?.substring(5),
108
+ "redis.db10": redis.db10?.split(",")?.[0]?.substring(5),
109
+ "pg.connection": query?.length,
110
+ dbsize: dbSize,
111
+ filesize: 0,
112
+ },
113
+ metricSort,
114
+ system: {
115
+ os: osInfo,
116
+ release: os.release(),
117
+ core: cpuInfo?.length,
118
+ cpu: cpuInfo?.[0]?.model,
119
+ ram: formatMemoryUsage(totalMemory),
120
+ db: dbVerion,
121
+ redis: rclient?.server_info?.redis_version,
122
+ node: process.version,
123
+ },
124
+ top: topProcess,
125
+ query,
126
+ };
127
+ }
@@ -0,0 +1,20 @@
1
+ import pgClients from "../pg/pgClients.js";
2
+ import logger from "../logger/getLogger.js";
3
+ import getRedis from "../redis/funcs/getRedis.js";
4
+ import config from "../../../config.js";
5
+ import loggerSystem from "./loggerSystem.js";
6
+ const rclient2 = getRedis({ db: 2 });
7
+ export default async function systemMetricsFifthly({ pg = pgClients.client }) {
8
+ const system = await loggerSystem({ pg });
9
+ const dbName = pg?.options?.database;
10
+ if (config.redis) {
11
+ await rclient2.del(`${dbName}:system_metrics`);
12
+ }
13
+ logger.file("metric", {
14
+ dbname: dbName,
15
+ ...system.metric,
16
+ uptime: system.uptime,
17
+ ...system.metricSort,
18
+ });
19
+ return { message: "Saved Fifthly" };
20
+ }
@@ -0,0 +1,59 @@
1
+ /* eslint-disable no-console */
2
+ import path from "node:path";
3
+ import { readdirSync, existsSync } from "node:fs";
4
+ import config from "../../../config.js";
5
+ import execSql from "./exec.sql.js";
6
+ import pgClients from "../pg/pgClients.js";
7
+ const time = Date.now();
8
+ const debug = config.debug || config.local;
9
+ export default async function execMigrations(dirPath, pg = pgClients.client, iscore = false) {
10
+ if (!dirPath) {
11
+ const txt = "migrations skip: path not specified";
12
+ if (debug)
13
+ console.warn(txt);
14
+ return txt;
15
+ }
16
+ if (config.migrationsCore === false && iscore) {
17
+ const txt = `migrations skip: core - ${dirPath}`;
18
+ if (debug)
19
+ console.log(txt);
20
+ return txt;
21
+ }
22
+ if (config.migrations === false && !iscore) {
23
+ const txt = `migrations skip: path - ${dirPath}`;
24
+ if (debug)
25
+ console.log(txt);
26
+ return txt;
27
+ }
28
+ if (process.env.NODE_ENV !== "production" &&
29
+ !(iscore ? config.migrationsCore : config.migrations)) {
30
+ const txt = `migrations skip: not a production environment - ${iscore ? "core" : "path"} : ${dirPath}`;
31
+ if (debug)
32
+ console.log(txt);
33
+ return txt;
34
+ }
35
+ if (debug)
36
+ console.log("migrations start", dirPath, Date.now() - time);
37
+ const exists = existsSync(dirPath);
38
+ if (!exists) {
39
+ const txt = `migrations skip: directory not found - ${dirPath}`;
40
+ if (debug)
41
+ console.warn(txt);
42
+ return txt;
43
+ }
44
+ // get directory sql file list
45
+ const content = readdirSync(dirPath, { withFileTypes: true })
46
+ ?.filter((el) => el.isFile() && path.extname(el.name) === ".sql")
47
+ ?.map((el) => el.name) || [];
48
+ // execute sql files
49
+ if (!content?.length) {
50
+ const txt = `migrations skip: no sql in specified directory - ${dirPath}`;
51
+ if (debug)
52
+ console.warn(txt);
53
+ return txt;
54
+ }
55
+ await content.reduce((promise, filename) => promise.then(() => execSql(path.join(dirPath, filename), pg)), Promise.resolve());
56
+ if (debug)
57
+ console.log("migrations success", dirPath, exists, Date.now() - time);
58
+ return "success";
59
+ }
@@ -0,0 +1,61 @@
1
+ /* eslint-disable no-console */
2
+ import path from "node:path";
3
+ import { createHash } from "node:crypto";
4
+ import { existsSync, readFileSync } from "node:fs";
5
+ import config from "../../../config.js";
6
+ import pgClients from "../pg/pgClients.js";
7
+ import logger from "../logger/getLogger.js";
8
+ import getRedis from "../redis/funcs/getRedis.js";
9
+ const rclient = getRedis();
10
+ const debug = config.debug || config.local;
11
+ export default async function execSql(filepath, pg = pgClients.client) {
12
+ const start = Date.now();
13
+ if (!pg || !filepath)
14
+ return null;
15
+ const filename = path.basename(filepath);
16
+ if (!existsSync(filepath)) {
17
+ logger.file("migration/notfound", {
18
+ filepath,
19
+ result: "not found",
20
+ });
21
+ console.log(filepath, "warn", "not found", Date.now() - start);
22
+ return null;
23
+ }
24
+ const sql = readFileSync(filepath, "utf-8");
25
+ const hash = createHash("md5").update(sql).digest("hex");
26
+ const hashes = config.redis
27
+ ? await rclient
28
+ .hgetall(`${pg?.options?.database}:migration-hashes`)
29
+ .then((obj) => Object.keys(obj))
30
+ : [];
31
+ if (hashes.includes(hash) && !config.disableCache && debug) {
32
+ console.log(filename, "skip equal hash", Date.now() - start);
33
+ return null;
34
+ }
35
+ try {
36
+ if (debug)
37
+ console.log(filename, "start", Date.now() - start);
38
+ await pg.query(sql);
39
+ if (!config.disableCache && config.redis)
40
+ await rclient.hset(`${pg?.options?.database}:migration-hashes`, hash, 1);
41
+ if (debug)
42
+ console.log(filename, "finish", Date.now() - start);
43
+ logger.file("migration/success", {
44
+ filepath,
45
+ result: "success",
46
+ time: Date.now() - start,
47
+ });
48
+ return "ok";
49
+ }
50
+ catch (err) {
51
+ console.error(filename, "error", err.toString(), Date.now() - start);
52
+ logger.file("migration/error", {
53
+ filepath,
54
+ result: "error",
55
+ error: err.toString(),
56
+ stack: err.stack,
57
+ time: Date.now() - start,
58
+ });
59
+ return err.toString();
60
+ }
61
+ }
@@ -1,7 +1,5 @@
1
- // import execMigrations from './funcs/exec.migrations.js';
2
-
3
- async function plugin() {
4
- // fastify.decorate('execMigrations', execMigrations);
5
- }
6
-
7
- export default plugin;
1
+ // import execMigrations from './funcs/exec.migrations.js';
2
+ async function plugin() {
3
+ // fastify.decorate('execMigrations', execMigrations);
4
+ }
5
+ export default plugin;
@@ -0,0 +1,102 @@
1
+ /* eslint-disable no-console */
2
+ import config from "../../../../config.js";
3
+ import pgClient from "../pgClients.js";
4
+ // subfunc
5
+ const getTable = ({ table }) => table
6
+ ?.toLowerCase?.()
7
+ ?.replace?.(/[\n\r]+/g, " ")
8
+ ?.split?.(" from ")
9
+ ?.filter((el) => /^[a-z0-9_]+\.[a-z0-9_]+/.test(el))
10
+ ?.map((el) => el?.split?.(/[ )]/)?.[0]);
11
+ const loadedIndex = {};
12
+ // main func
13
+ async function autoIndex({ table, columns: filter1, pg = pgClient.client, gin, }) {
14
+ const filter = filter1.filter((el) => el);
15
+ if (!filter?.length || !table || process.env.NODE_ENV === "unit test")
16
+ return null;
17
+ const attrs = filter
18
+ .map((el) => (el.name || el).replace(/'/g, ""))
19
+ .filter((el) => el?.indexOf("(") === -1)
20
+ .sort();
21
+ const types = filter
22
+ .filter((el) => (el?.name || el)?.indexOf?.("(") === -1)
23
+ .map((el) => (el.name ? el : { name: el }))
24
+ .reduce((p, el) => ({
25
+ ...p,
26
+ [el.name]: el.type || "-",
27
+ }), {});
28
+ const redisKey = `autoindex1:${table}:${attrs.join(";")}`;
29
+ const tableList = getTable({ table });
30
+ const existsCache = loadedIndex[redisKey];
31
+ if (existsCache && !config.disableCache) {
32
+ return "ok";
33
+ }
34
+ const tbs = tableList[0];
35
+ const [ns, tbl] = tableList[0]?.split?.(".") || [];
36
+ const { rows: index } = tbl
37
+ ? await pg.query("select * from pg_indexes where tablename = $1 and schemaname = $2", [tbl, ns])
38
+ : {};
39
+ if (existsCache && !config.disableCache && index?.length > 0) {
40
+ return null;
41
+ }
42
+ // console.log('autoindex', table, filter?.map((el) => el.name || el));
43
+ const { rows: cols } = await pg.query(`SELECT attrelid::regclass AS tbl, attname AS aname, atttypid::regtype AS datatype, atttypid
44
+ FROM pg_attribute WHERE attrelid = '${tbs}'::regclass and attname = any('{ ${attrs} }')`);
45
+ const qIndex = [];
46
+ const indexAr = {};
47
+ // console.log(cols);
48
+ for (let i = 0; i < cols.length; i += 1) {
49
+ const el = cols[i];
50
+ el.relname = tbl;
51
+ el.nspname = ns;
52
+ const isGin = types[el.aname] === "Text" || gin;
53
+ const indexUsing = (el.datatype === "geometry" ? "gist" : null) ||
54
+ (isGin ? "gin" : null) ||
55
+ "btree";
56
+ const name = `${el.nspname}_${el.relname}_${el.aname}_${indexUsing}_idx`;
57
+ const exists = index.filter((ind) => ind.tablename === el.relname &&
58
+ ind.schemaname === el.nspname &&
59
+ ind.indexdef.includes(isGin ? `gin (${el.aname} gin_trgm_ops)` : `btree (${el.aname})`));
60
+ indexAr[el.aname] = {
61
+ name,
62
+ type: el.datatype,
63
+ exists, // exists1,
64
+ };
65
+ // drop
66
+ /* if (exists?.length > 1) {
67
+ exists.filter((ind, i1) => i1).forEach((ind) => qIndex.push(`DROP INDEX if exists ${ind.schemaname}.${ind.indexname} `));
68
+ } */
69
+ // add
70
+ if (exists?.length <= (isGin ? 2 : 1)) {
71
+ // console.log(`${name} - ${el.datatype}`);
72
+ const suffix = isGin ? "gin_trgm_ops" : "";
73
+ qIndex.push(`CREATE INDEX if not exists ${name} ON ${el.nspname}.${el.relname} USING ${indexUsing} (${el.aname} ${suffix})`);
74
+ if (isGin) {
75
+ qIndex.push(`CREATE INDEX if not exists ${name}_lower ON ${el.nspname}.${el.relname} USING ${indexUsing} (lower(${el.aname}) ${suffix})`);
76
+ }
77
+ if (indexUsing === "gist") {
78
+ qIndex.push(`CREATE INDEX if not exists ${name.replace("gist", "gist1")}
79
+ ON ${el.nspname}.${el.relname} USING gist (${el.aname})`);
80
+ qIndex.push(`CREATE INDEX if not exists ${name.replace("gist", "area")}
81
+ ON ${el.nspname}.${el.relname} USING btree (st_area(st_transform(${el.aname},3857)))`);
82
+ qIndex.push(`CREATE INDEX if not exists ${name.replace("gist", "area_true")}
83
+ ON ${el.nspname}.${el.relname} USING btree (st_area(${el.aname}, true))`);
84
+ qIndex.push(`CREATE INDEX if not exists ${name.replace("gist", "4326")}
85
+ ON ${el.nspname}.${el.relname} USING gist (st_transform(${el.aname},4326))`);
86
+ }
87
+ }
88
+ }
89
+ loadedIndex[redisKey] = 1;
90
+ // throw qIndex;
91
+ if (!qIndex.length)
92
+ return null;
93
+ if (config.local) {
94
+ // console.log(qIndex.filter((v, i, a) => a.indexOf(v) === i));
95
+ }
96
+ // logger.file('index', { table, filter, sql: qIndex.filter((v, i, a) => a.indexOf(v) === i) });
97
+ qIndex
98
+ .filter((v, i, a) => a.indexOf(v) === i)
99
+ .map((el) => pg.one(el).catch((err) => console.log(err.toString())));
100
+ return "ok";
101
+ }
102
+ export default autoIndex;
@@ -1,15 +1,16 @@
1
- export default function getDBParams(str) {
2
- if (typeof str !== 'string') return str;
3
- if (str.includes('/')) {
4
- const arr = str.match(/(([A-z_0-9]+):([A-z0-9_]+)@)?([a-z0-9._]+):([0-9]+)(\/([a-z0-9_]+))?/) || [];
5
- const [, , user, password, host, port, , db] = arr;
6
- return {
7
- name: str, user, password, host, port, db,
8
- };
9
- }
10
- if (str.includes(':')) {
11
- const [db, port] = str.split(':') || [];
12
- return { name: str, port, db };
13
- }
14
- return { name: str, db: str };
15
- }
1
+ export default function getDBParams(str) {
2
+ if (typeof str !== 'string')
3
+ return str;
4
+ if (str.includes('/')) {
5
+ const arr = str.match(/(([A-z_0-9]+):([A-z0-9_]+)@)?([a-z0-9._]+):([0-9]+)(\/([a-z0-9_]+))?/) || [];
6
+ const [, , user, password, host, port, , db] = arr;
7
+ return {
8
+ name: str, user, password, host, port, db,
9
+ };
10
+ }
11
+ if (str.includes(':')) {
12
+ const [db, port] = str.split(':') || [];
13
+ return { name: str, port, db };
14
+ }
15
+ return { name: str, db: str };
16
+ }
@@ -0,0 +1,48 @@
1
+ import getPG from "./getPG.js";
2
+ const data = {};
3
+ export default async function getMeta(opt, nocache) {
4
+ const pg = opt?.pg || getPG({ name: "client" });
5
+ if (!pg)
6
+ return { error: "pg connection not established", status: 400 };
7
+ const table1 = opt?.table || opt;
8
+ const table = pg.pk[table1] ? table1 : table1?.replace?.(/"/g, "");
9
+ if (pg?.options?.database && data[pg.options.database]?.[table] && !nocache)
10
+ return data[pg.options.database][table];
11
+ if (!pg?.tlist?.includes(table) &&
12
+ !pg?.tlist?.includes(table?.replace?.(/"/g, ""))) {
13
+ return { error: `${table} - not found`, status: 400 };
14
+ }
15
+ const { fields = [] } = await pg.query(`select * from ${table} limit 0`);
16
+ const pks1 = await pg
17
+ .query(`SELECT json_object_agg(c.conrelid::regclass, a.attname) as pks1
18
+ FROM pg_constraint c
19
+ left join pg_attribute a on c.conrelid=a.attrelid and a.attnum = c.conkey[1]
20
+ WHERE c.contype='p'::"char" and c.conrelid::regclass = $1::regclass`, [table])
21
+ .then((el) => el.rows[0].pks1 || {});
22
+ const pk = table.startsWith("public.")
23
+ ? pks1[table.replace("public.", "")] || pks1[table.replace("public.", "")]
24
+ : pks1[table] || pks1[table];
25
+ const geomAttr = fields.find((el) => pg.pgType?.[el.dataTypeID] === "geometry")?.name; // change geometry text to geometry code
26
+ const dbColumns = await pg
27
+ .query(`select json_object_agg(
28
+ attname,
29
+ json_build_object(
30
+ 'title', pg_catalog.col_description(attrelid,attnum)
31
+ /*,'type', atttypid::regtype */
32
+ )
33
+ ) from pg_catalog.pg_attribute a
34
+ where attrelid=$1::regclass and attnum>0`, [table])
35
+ .then((el) => el.rows?.[0]?.json_object_agg || {});
36
+ fields.forEach((el) => Object.assign(el, { ...(dbColumns[el.name] || {}) }));
37
+ const res = {
38
+ pk,
39
+ columns: fields,
40
+ geom: geomAttr,
41
+ view: pg.relkinds?.[table] === "v",
42
+ };
43
+ if (!data[pg.options.database]) {
44
+ data[pg.options.database] = {};
45
+ }
46
+ data[pg.options.database][table] = res;
47
+ return res;
48
+ }
@@ -0,0 +1,39 @@
1
+ import pg from "pg";
2
+ const { types } = pg;
3
+ types.setTypeParser(1082, (stringValue) => stringValue);
4
+ types.setTypeParser(1114, (stringValue) => stringValue);
5
+ import config from "../../../../config.js";
6
+ import dblist from "../../../../dblist.js";
7
+ import pgClients from "../pgClients.js";
8
+ import init from "./init.js";
9
+ import getDBParams from "./getDBParams.js";
10
+ function getPG(param = {}) {
11
+ if (!config.pg)
12
+ return null;
13
+ const dbListParams = dblist.find((el) => el.key === param?.key) ||
14
+ dblist.find((el) => el.database === (param?.db || param?.database || param) &&
15
+ el.port === param?.port);
16
+ const { user, password, host, port, db, database, name: origin, } = dbListParams ??
17
+ (typeof param === "string" ? getDBParams(param) : param || {});
18
+ const name = origin || db || database || param || "client";
19
+ if (pgClients[name])
20
+ return pgClients[name];
21
+ const dbConfig = {
22
+ user: user || config.pg?.user || "postgres",
23
+ password: password || config.pg?.password || "postgres",
24
+ host: host || config.pg?.host,
25
+ port: port || config.pg?.port,
26
+ database: db || database || config.pg?.db || config.pg?.database,
27
+ statement_timeout: config.pg?.statement_timeout || 10000,
28
+ };
29
+ if (!dbConfig.database) {
30
+ return null;
31
+ }
32
+ pgClients[name] = new pg.Pool(dbConfig);
33
+ pgClients[name].init = async () => {
34
+ await init(pgClients[name]);
35
+ };
36
+ init(pgClients[name]);
37
+ return pgClients[name];
38
+ }
39
+ export default getPG;
@@ -0,0 +1,45 @@
1
+ import pg from "pg";
2
+ const { types } = pg;
3
+ types.setTypeParser(1082, (stringValue) => stringValue);
4
+ types.setTypeParser(1114, (stringValue) => stringValue);
5
+ import config from "../../../../config.js";
6
+ import dblist from "../../../../dblist.js";
7
+ import pgClients from "../pgClients.js";
8
+ import init from "./init.js";
9
+ import getDBParams from "./getDBParams.js";
10
+ async function getPGAsync(param) {
11
+ if (!config.pg)
12
+ return null;
13
+ const dbListParams = dblist.find((el) => el.key === param?.key) ||
14
+ dblist.find((el) => el.database === (param?.db || param?.database || param));
15
+ const { user, password, host, port, db, database, name: origin, } = dbListParams ??
16
+ (typeof param === "string" ? getDBParams(param) : param || {});
17
+ const name = origin || db || database || param || "client";
18
+ if (pgClients[name]?.tlist)
19
+ return pgClients[name];
20
+ const dbConfig = {
21
+ user: user || config.pg?.user || "postgres",
22
+ password: password || config.pg?.password || "postgres",
23
+ host: host || config.pg?.host,
24
+ port: port || config.pg?.port,
25
+ database: db || database || config.pg?.db || config.pg?.database,
26
+ statement_timeout: config.pg?.statement_timeout || 10000,
27
+ };
28
+ if (!dbConfig.database) {
29
+ return null;
30
+ }
31
+ pgClients[name] = new pg.Pool(dbConfig);
32
+ try {
33
+ await init(pgClients[name]);
34
+ }
35
+ catch (err) {
36
+ console.error("pg client init error", host, port, database);
37
+ // debug only
38
+ if (config.local && name !== "client") {
39
+ console.warn("fall back to default pgClient", pgClients.client?.host, pgClients.client?.port, pgClients.client?.database);
40
+ return pgClients.client;
41
+ }
42
+ }
43
+ return pgClients[name];
44
+ }
45
+ export default getPGAsync;