@opengis/fastify-table 1.4.88 → 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 -156
  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-console */
2
+ function init(client) {
3
+ if (!client) {
4
+ return;
5
+ }
6
+ const rows = client.prepare(`WITH tables AS (
7
+ SELECT name AS table_name
8
+ FROM sqlite_master
9
+ WHERE type = 'table' AND name NOT LIKE 'sqlite_%'
10
+ ),
11
+ pk_columns AS (
12
+ SELECT
13
+ m.name AS table_name,
14
+ ti.name AS column_name,
15
+ ti.pk
16
+ FROM sqlite_master m
17
+ JOIN pragma_table_info(m.name) AS ti
18
+ WHERE ti.pk = 1
19
+ )
20
+ SELECT table_name, column_name
21
+ FROM pk_columns
22
+ WHERE table_name IN (
23
+ SELECT table_name
24
+ FROM pk_columns
25
+ GROUP BY table_name
26
+ HAVING COUNT(*) = 1
27
+ )
28
+ ORDER BY table_name;`).all();
29
+ const pk = Object.fromEntries(rows.map((row) => [row.table_name, row.column_name]));
30
+ const tlist = client.prepare('SELECT name FROM sqlite_master WHERE type=\'table\' AND name NOT LIKE \'sqlite_%\';').all().reduce((acc, curr) => {
31
+ acc.push(curr.name);
32
+ return acc;
33
+ }, []);
34
+ async function query(q, args = []) {
35
+ const data = client.prepare(q.replace(/\$\d+/g, '?')).all(...args);
36
+ return Promise.resolve({ rows: data, rowCount: data.length });
37
+ }
38
+ Object.assign(client, {
39
+ query,
40
+ pk,
41
+ tlist,
42
+ });
43
+ console.log('sqlite db connected', client.name || ':memory:');
44
+ }
45
+ export default init;
@@ -0,0 +1,8 @@
1
+ import fp from "fastify-plugin";
2
+ import sqliteClients from "./sqliteClients.js";
3
+ async function dbPlugin(app, opt) {
4
+ app.addHook("onClose", async () => {
5
+ Object.keys(sqliteClients).forEach((key) => sqliteClients[key].close());
6
+ });
7
+ }
8
+ export default fp(dbPlugin);
@@ -0,0 +1,24 @@
1
+ import path from "node:path";
2
+ const { name: execName } = path.parse(process.argv0);
3
+ // import Database from 'better-sqlite3';
4
+ const { default: Database } = execName === "bun"
5
+ ? // @ts-expect-error bun internal module
6
+ { default: (await import("bun:sqlite")).Database }
7
+ : await import("better-sqlite3");
8
+ import config from "../../../config.js";
9
+ import init from "./funcs/init.js";
10
+ const sqliteClients = {};
11
+ if (config.sqlite) {
12
+ const client = new Database(config.sqlite?.name || ":memory:", execName === "bun"
13
+ ? undefined
14
+ : {
15
+ readonly: config.sqlite?.readonly || false,
16
+ fileMustExist: config.sqlite?.fileMustExist || false,
17
+ timeout: config.sqlite?.statement_timeout || 10000,
18
+ verbose: config.trace ? console.log : undefined,
19
+ });
20
+ client.init = () => init(client);
21
+ client.init();
22
+ sqliteClients.client = client;
23
+ }
24
+ export default sqliteClients;
@@ -0,0 +1,12 @@
1
+ import { basename } from "node:path";
2
+ import { existsSync } from "node:fs";
3
+ import menuDirs from "./menuDirs.js";
4
+ export default function addMenu(filepath) {
5
+ if (basename(filepath) !== "menu.json") {
6
+ throw new Error("addMenu: filepath must be a menu.json file");
7
+ }
8
+ if (filepath && !menuDirs.includes(filepath) && existsSync(filepath)) {
9
+ menuDirs.push(filepath);
10
+ }
11
+ return menuDirs;
12
+ }
@@ -0,0 +1,16 @@
1
+ /* eslint-disable no-console */
2
+ import { existsSync, readFileSync } from "node:fs";
3
+ import userTemplateDir from "./userTemplateDir.js";
4
+ import customTokens from "./customTokens.js";
5
+ import yml2json from "../../yml/funcs/yml2json.js";
6
+ export default function addTemplateDir(dir) {
7
+ if (dir && !userTemplateDir.includes(dir)) {
8
+ userTemplateDir.push(dir);
9
+ if (existsSync(`${dir}/tokens.yml`)) {
10
+ const json = yml2json(readFileSync(`${dir}/tokens.yml`));
11
+ Object.assign(customTokens, json);
12
+ console.log("load user tokens", dir);
13
+ }
14
+ }
15
+ return userTemplateDir;
16
+ }
@@ -0,0 +1,2 @@
1
+ const userTokens = {};
2
+ export default userTokens;
@@ -0,0 +1,25 @@
1
+ import routeData from "../../../routes/table/controllers/tableData.js";
2
+ export default async function getData({ id, table, pg, headers, filter, state, limit, page, search, user, order, desc, sql, contextQuery, sufix, filterList, }, reply, called) {
3
+ const params = { table, id };
4
+ const query = {
5
+ filter,
6
+ limit,
7
+ page,
8
+ search,
9
+ sql,
10
+ state,
11
+ order,
12
+ desc,
13
+ };
14
+ const result = await routeData({
15
+ pg,
16
+ headers,
17
+ params,
18
+ query,
19
+ user,
20
+ contextQuery,
21
+ sufix,
22
+ filterList,
23
+ }, reply, called);
24
+ return result;
25
+ }
@@ -0,0 +1,18 @@
1
+ import routeFilter from "../../../routes/table/controllers/filter.js";
2
+ import pgClients from "../../pg/pgClients.js";
3
+ export default async function getFilter({ pg = pgClients.client, table, filter, custom, state, search, user, }, reply) {
4
+ const params = { table };
5
+ const query = {
6
+ filter,
7
+ custom,
8
+ state,
9
+ search,
10
+ };
11
+ const result = await routeFilter({
12
+ pg,
13
+ params,
14
+ query,
15
+ user,
16
+ }, reply, 1);
17
+ return result;
18
+ }
@@ -0,0 +1,201 @@
1
+ import getTemplate from "../getTemplate.js";
2
+ import getSelect from "../getSelect.js";
3
+ import pgClients from "../../../pg/pgClients.js";
4
+ import config from "../../../../../config.js";
5
+ // filter util
6
+ import getTableSql from "./util/getTableSql.js";
7
+ import getFilterQuery from "./util/getFilterQuery.js";
8
+ import getOptimizedQuery from "./util/getOptimizedQuery.js";
9
+ import getFilter from "../getFilter.js";
10
+ const checkInline = {};
11
+ const defaultTable = "crm.extra_data";
12
+ function getExtraQuery(mainColumns, schema, table, pk) {
13
+ const extraColumns = Object.keys(schema || {})
14
+ .filter((key) => !mainColumns.map((el) => el?.name).includes(key))
15
+ .map((key) => ({ name: key, type: schema[key]?.type }));
16
+ return {
17
+ q: extraColumns
18
+ .map((el) => `,(select value_text as "${el.name.replace(/'/g, "''")}" from ${table} where property_key='${el.name.replace(/'/g, "''")}' and object_id=t.${pk} limit 1)`)
19
+ .join(" "),
20
+ extraColumns,
21
+ };
22
+ }
23
+ export default async function getFilterSQL({ table, filter, pg = pgClients.client, search, filterList, query, custom, state, uid, objectId, order, }) {
24
+ if (!table)
25
+ return { error: "param table is required", status: 400 };
26
+ const body = await getTemplate("table", table);
27
+ const loadTemplate = body?.form
28
+ ? await getTemplate("form", body?.form)
29
+ : null;
30
+ const { extra } = loadTemplate || {};
31
+ const extraDataTable = extra
32
+ ? config.extraData?.[body.table] ||
33
+ config.extraData?.[body.table.split(".").shift()] ||
34
+ config.extraData?.default ||
35
+ config.extraData ||
36
+ defaultTable
37
+ : undefined;
38
+ const { fields: fieldsModel = [] } = body?.table && pg.pk?.[body.table]
39
+ ? await pg.query(`select * from ${body.table} limit 0`)
40
+ : {};
41
+ const { q: extraSqlColumns, extraColumns = [] } = pg.pk?.[extraDataTable] && pg.pk?.[body.table || table]
42
+ ? getExtraQuery(fieldsModel, loadTemplate?.schema, extraDataTable, pg.pk[body.table || table])
43
+ : {};
44
+ // console.log('extra getFilterSQL', extraDataTable, pg.pk?.[extraDataTable]);
45
+ // check sql inline fields count
46
+ if (body?.table && !checkInline[body?.table] && body?.sql?.length) {
47
+ const filterSql = body.sql.filter((el) => !el?.disabled && (el.inline ?? true));
48
+ const sqlTable = filterSql
49
+ .map((el, i) => ` left join lateral (${el.sql}) ${el.name || `t${i}`} on 1=1 `)
50
+ ?.join("") || "";
51
+ const d = await Promise.all(filterSql.map((el, i) => pg
52
+ .query(`select ${el.name || `t${i}`}.* from(select * from ${body.table})t ${sqlTable} limit 0`)
53
+ .then((item) => item.fields)));
54
+ d.forEach((el, i) => {
55
+ filterSql[i].inline = el.length === 1;
56
+ filterSql[i].fields = el.map((f) => f.name);
57
+ });
58
+ checkInline[body?.table] = body.sql;
59
+ }
60
+ else if (checkInline[body?.table]) {
61
+ body.sql = checkInline[body?.table];
62
+ }
63
+ const sqlTable = body?.sql?.length
64
+ ? body.sql
65
+ .filter((el) => !el?.disabled &&
66
+ !el.inline &&
67
+ el?.sql?.replace &&
68
+ (!el.sql.includes("{{uid}}") || uid))
69
+ .map((el, i) => ` left join lateral (${el.sql.replace("{{uid}}", uid)}) ${el.name || `t${i}`} on 1=1 `)
70
+ .join("")
71
+ : null;
72
+ const sqlInline = body?.sql
73
+ ?.filter?.((el) => el.inline)
74
+ .map((el) => `,(${el.sql})`)
75
+ .join("");
76
+ const fieldQuery = `select * ${extraSqlColumns || ""} ${sqlInline || ""} from ${body?.table || table} t ${sqlTable || ""} limit 0`;
77
+ const { fields = [] } = await pg.query(fieldQuery);
78
+ const autoSearchColumn = fields
79
+ ?.filter((el) => pg.pgType?.[el.dataTypeID] === "text")
80
+ ?.map((el) => el.name)
81
+ .join(",");
82
+ const searchColumn = body?.search_column || body?.meta?.search || autoSearchColumn;
83
+ const fieldsList = (fieldsModel || fields)?.map((el) => el.name);
84
+ try {
85
+ const tableSQL = await getTableSql({
86
+ pg,
87
+ body,
88
+ table,
89
+ fields,
90
+ });
91
+ const sval = `ilike '%${decodeURIComponent(search?.replace?.(/%/g, "%25") || "")
92
+ .replace(/'/g, "''")
93
+ .replace(/%/g, "\\%")}%'`;
94
+ const searchQuery = search && searchColumn
95
+ ? ` (${searchColumn
96
+ .split(",")
97
+ ?.map((name) => {
98
+ const { pk } = tableSQL.find((el) => el.name === name) || {};
99
+ return pk && !fieldsList.includes(name)
100
+ ? `${pk} in (select ${pk} from (${fieldQuery.replace(/limit 0/g, "")} where ${name} ${sval} )q where 1=1)`
101
+ : `${name} ${sval}`;
102
+ })
103
+ .join(" or ")} )`
104
+ : "";
105
+ const filterResponse = (await getFilter({
106
+ pg,
107
+ table,
108
+ user: { uid },
109
+ }, null));
110
+ const filterList1 = await Promise.all((filterList || [])
111
+ .concat(filterResponse?.inline || [])
112
+ .concat(filterResponse?.custom || [])
113
+ .concat(filterResponse?.state || [])
114
+ .concat(filterResponse?.list || [])
115
+ ?.filter((el) => el.id || el.name)
116
+ ?.map(async (el) => {
117
+ Object.assign(el, { name: el.name || el.id });
118
+ if (el.name &&
119
+ extraColumns.find((item) => item?.name === el?.name)) {
120
+ Object.assign(el, {
121
+ extra: {
122
+ table: extraDataTable,
123
+ input: extraColumns.find((item) => item?.name === el?.name)
124
+ ?.type,
125
+ },
126
+ });
127
+ }
128
+ if (!el?.data)
129
+ return el;
130
+ // const cls = await getTemplate(['cls', 'select'], el.data); // only git cls
131
+ const cls = await getSelect(el.data, pg); // git + db cls
132
+ if (Array.isArray(cls?.arr) && cls.arr.length) {
133
+ Object.assign(el, {
134
+ cls: el.data,
135
+ options: cls,
136
+ select: `select code, name from admin.cls where parent='${el.data}'`,
137
+ });
138
+ }
139
+ else if (typeof (cls?.sql || cls) === "string") {
140
+ Object.assign(el, { select: cls?.sql || cls });
141
+ }
142
+ return el;
143
+ }));
144
+ const modelQuery = body?.model || body?.table || table;
145
+ const filters = getFilterQuery({
146
+ pg,
147
+ filter,
148
+ table: modelQuery,
149
+ tableSQL,
150
+ fields,
151
+ filterList: filterList1,
152
+ uid,
153
+ objectId,
154
+ });
155
+ // filter
156
+ const customQuery = body?.filterCustom?.length && custom
157
+ ? body.filterCustom?.find((el) => el.name === custom)?.sql
158
+ : null;
159
+ const stateQuery = body?.filterState?.length && state
160
+ ? body.filterState?.find((el) => el.name === state)?.sql
161
+ : null;
162
+ const filterQuery = filters
163
+ ?.filter((el) => el.query)
164
+ ?.map((el) => `${el.query}`)
165
+ .join(" and ");
166
+ const q = [
167
+ body?.query,
168
+ query,
169
+ searchQuery,
170
+ filterQuery,
171
+ stateQuery,
172
+ customQuery,
173
+ ]
174
+ .filter((el) => el)
175
+ .join(" and ");
176
+ // table
177
+ const obj = {
178
+ body,
179
+ extraSqlColumns,
180
+ table,
181
+ q,
182
+ };
183
+ const optimizedSQL = `select * from ${getOptimizedQuery(obj)} ${order ? `order by ${order}` : ""}`;
184
+ const tableCount = getOptimizedQuery(obj, true);
185
+ return {
186
+ filterList,
187
+ filters,
188
+ q,
189
+ optimizedSQL,
190
+ sqlTable,
191
+ extraSqlColumns,
192
+ tableCount,
193
+ table: modelQuery,
194
+ // filter parts
195
+ searchQuery,
196
+ };
197
+ }
198
+ catch (err) {
199
+ throw err;
200
+ }
201
+ }
@@ -0,0 +1,131 @@
1
+ import applyHookSync from "../../../../hook/funcs/applyHookSync.js";
2
+ import getRangeQuery from "./getRangeQuery.js";
3
+ export default function formatValue({ pg, table, filter = {}, name, value, dataTypeID, uid = 1, optimize, }) {
4
+ const { extra, sql, select, strict, options /* default: defaultValue, */ } = filter;
5
+ const pk = pg?.pk && table ? pg.pk[table] : undefined;
6
+ const filterType = filter.type?.toLowerCase?.() || "text";
7
+ if (filterType === "text" && value && filter?.columns) {
8
+ const columns = filter.columns.split(",");
9
+ const sval = `ilike '%${decodeURIComponent(value.replace(/%/g, "%25")).replace(/%/g, "\\%")}%'`;
10
+ const query = `(${columns
11
+ .map((el) => `"${el}" ${sval}`)
12
+ .join(" or ")})`;
13
+ return { op: "~", query };
14
+ }
15
+ const fieldType = pg?.pgType?.[dataTypeID] || pg?.pgType?.[{ date: 1114 }[filterType] || 25];
16
+ const hookData = applyHookSync("onFormatValue", {
17
+ pg,
18
+ pk,
19
+ table,
20
+ name,
21
+ value,
22
+ filterType,
23
+ fieldType,
24
+ filter,
25
+ dataTypeID,
26
+ uid,
27
+ optimize,
28
+ });
29
+ if (hookData) {
30
+ return hookData?.query ? hookData : { op: "=", query: hookData };
31
+ }
32
+ if (!name ||
33
+ !value ||
34
+ (!dataTypeID && !extra && !sql && !options) ||
35
+ extra?.input?.toLowerCase?.() === "datatable" ||
36
+ (!["check", "autocomplete", "tags", "avatar", "radio"].includes(filterType) &&
37
+ options?.find?.((el) => el?.sql))) {
38
+ return {};
39
+ }
40
+ // my rows
41
+ if (value === "me" && uid) {
42
+ return { op: "=", query: `${name}::text = '${uid}'` };
43
+ }
44
+ const matchNull = { null: "is null", notnull: "is not null" }[value];
45
+ // null = true is null, not false
46
+ const matchBoolean = fieldType === "boolean"
47
+ ? { true: "is true", false: "is false" }[value]
48
+ : null;
49
+ const matchMulti = fieldType?.includes("[]")
50
+ ? `::text[] && '{${value}}'::text[]`
51
+ : null;
52
+ const match = matchNull ||
53
+ matchBoolean ||
54
+ matchMulti ||
55
+ `::text=any('{${value}}'::text[])`;
56
+ // geometry
57
+ if (["geometry"].includes(fieldType || "")) {
58
+ if (matchNull) {
59
+ return { op: "nullable", query: `${name} ${matchNull}` };
60
+ }
61
+ const bbox = value?.[0]?.split?.("_");
62
+ if (bbox?.length !== 4) {
63
+ return {};
64
+ }
65
+ const query = ` ${name} && 'box(${bbox[0]} ${bbox[1]},${bbox[2]} ${bbox[3]})'::box2d `;
66
+ return { op: "&&", query };
67
+ }
68
+ const querysql = sql
69
+ ?.replace?.(/= ?any\(\$1\)/g, `::text=any('{ ${value} }'::text[])`)
70
+ ?.replace?.(/\$1/g, `'${value}'`);
71
+ const op = filterType === "text" && !strict ? "~" : "=";
72
+ // text
73
+ if (["text"].includes(filterType)) {
74
+ // with sql subquery
75
+ if (sql) {
76
+ return { op: "=", query: querysql };
77
+ }
78
+ // extra table, example: crm.extra_data
79
+ if (extra?.table && pk) {
80
+ const query = `${pk} in (select object_id from ${extra.table} where property_key='${name}' and value_text ${matchNull || `${op} '${value}'`} )`;
81
+ return { op, query };
82
+ }
83
+ // select / cls
84
+ if (select) {
85
+ const subquery = matchNull
86
+ ? `name ${matchNull}`
87
+ : `lower(name::text) ~ lower('${value}')`;
88
+ return {
89
+ op,
90
+ query: `${name}::text in ( ( with q(id,name) as (${select}) select id from q where ${subquery}) )`,
91
+ };
92
+ }
93
+ // nullable
94
+ if (matchNull) {
95
+ const query = `${name} ${matchNull}`;
96
+ return { op, query };
97
+ }
98
+ // default
99
+ const query = `lower(${name}::text) ${op} lower('${value}')`;
100
+ return { op, query };
101
+ }
102
+ // date: 01.01.2024-31.12.2024 / number range: 100-500
103
+ if (["date", "datepicker", "range"].includes(filterType)) {
104
+ const query = getRangeQuery(value, name, fieldType, filterType, sql, extra, pk);
105
+ return { op: "between", query };
106
+ }
107
+ /* select query - from admin.cls / filter options */
108
+ if (["check", "autocomplete", "tags", "avatar", "radio"].includes(filterType)) {
109
+ // multiple checks with predefined query
110
+ if (options?.find?.((el) => el?.sql)) {
111
+ const query = options
112
+ .filter((el) => value.split(",").includes(el.id))
113
+ .map((el) => el.sql || "false")
114
+ .join(" and ") || "false";
115
+ return { op: "=", query };
116
+ }
117
+ // with sql subquery
118
+ if (sql) {
119
+ return { op: "=", query: querysql };
120
+ }
121
+ // extra table, example: crm.extra_data
122
+ if (extra?.table && pk) {
123
+ const query = `${pk} in (select object_id from ${extra.table} where property_key='${name}' and value_text ${matchNull || `='${value}'`} )`;
124
+ return { op: "=", query };
125
+ }
126
+ // nullable + default
127
+ const query = `${name} ${match}`;
128
+ return { op: "=", query };
129
+ }
130
+ return {};
131
+ }
@@ -0,0 +1,11 @@
1
+ async function getCustomQuery({ pg, table, customFilter }) {
2
+ if (!customFilter)
3
+ return null;
4
+ const customFilterList = customFilter?.split(',')?.map((el) => el?.split('_').pop());
5
+ const { property_json: customFilterSQL } = await pg.one(`select json_agg(json_build_object('id',property_id,'name',property_key,'query',property_text)
6
+ ) as property_json from admin.properties where property_key is not null and property_entity='customQuery' and object_id=$1`, [table]);
7
+ const data = customFilterSQL?.length ? customFilterSQL.filter((el) => customFilterList.includes(el.id)) || [] : [];
8
+ const customQuery = data?.map((el) => el.query).join(' and ');
9
+ return `${customQuery}`;
10
+ }
11
+ export default getCustomQuery;
@@ -0,0 +1,84 @@
1
+ /* eslint-disable no-continue */
2
+ import pgClients from "../../../../pg/pgClients.js";
3
+ import formatValue from "./formatValue.js";
4
+ /**
5
+ * @param {Number} opt.json - (1|0) 1 - Результат - Object, 0 - String
6
+ * @param {String} opt.query - запит до таблиці
7
+ * @param {String} opt.hash - інформація з хешу по запиту
8
+ */
9
+ function getFilterQuery({ pg = pgClients.client, filter: filterStr = "", table = "", tableSQL = [], fields, filterList, uid, objectId, }) {
10
+ // if (!filterStr) return null; // filter list API
11
+ const mainOperators = ["=", "~", ">", "<"];
12
+ const filterQueryArray = decodeURIComponent(filterStr
13
+ ?.replace?.(/%/g, "%25")
14
+ ?.replace?.(/%/g, "\\%")
15
+ ?.replace?.(/(^,)|(,$)/g, ""))
16
+ ?.replace?.(/'/g, "''")
17
+ ?.split?.(/[;|]/) || [];
18
+ // default filter value form checkboxes, autocomplete or sql-defined only - if not called from card
19
+ const filterDefaultQueryArray = !objectId
20
+ ? filterList
21
+ ?.filter?.((el) => el.name &&
22
+ !filterStr?.includes?.(`${el.name}=`) &&
23
+ el.default &&
24
+ (el.options || el.sql))
25
+ ?.map?.((el) => `${el.name}=${el.default}`) || []
26
+ : [];
27
+ // concat default + request filters
28
+ const arr = filterQueryArray
29
+ .concat(filterDefaultQueryArray)
30
+ .filter((el) => el);
31
+ const resultList = [];
32
+ for (let i = 0; i < arr.length; i += 1) {
33
+ const item = arr[i];
34
+ if (!item) {
35
+ continue;
36
+ }
37
+ const splitby = mainOperators?.find((el) => item.indexOf(el) !== -1) || "=";
38
+ const [name] = item.split(splitby);
39
+ // skip already added filter
40
+ if (resultList.find((el) => el.name === name)) {
41
+ continue;
42
+ }
43
+ // filter
44
+ const filter = filterList?.find?.((el) => el.type && el.name === name) || { type: "text" };
45
+ const { strict, extra } = filter;
46
+ // find all value
47
+ const value = arr
48
+ .filter((el) => el.split(splitby)?.[0] === name)
49
+ .map((el) => el.substring((name?.length || 0) + 1))
50
+ .join(",");
51
+ const optimize = fields?.find((el) => el.name === name)
52
+ ? null
53
+ : tableSQL.find((el) => el.name === name);
54
+ // find field and skip not exists
55
+ const { dataTypeID } = fields?.find((el) => el.name === name) ||
56
+ fields?.find((el) => el.name === optimize?.pk) ||
57
+ {};
58
+ // format query
59
+ const { op, query, filterType, fieldType } = formatValue({
60
+ pg,
61
+ table,
62
+ filter,
63
+ name,
64
+ value,
65
+ dataTypeID,
66
+ uid,
67
+ optimize,
68
+ }) || {};
69
+ if (!query)
70
+ continue;
71
+ resultList.push({
72
+ name,
73
+ value,
74
+ query,
75
+ operator: op,
76
+ filterType,
77
+ type: fieldType,
78
+ strict,
79
+ extra,
80
+ });
81
+ }
82
+ return resultList;
83
+ }
84
+ export default getFilterQuery;
@@ -0,0 +1,11 @@
1
+ export default function getOptimizedQuery({ body, extraSqlColumns, table, q, }, count) {
2
+ const order = body?.orderby || body?.order
3
+ ? `order by ${body?.orderby || body?.order}`
4
+ : "";
5
+ const tableName = body?.table || body?.model || table;
6
+ const sqlList = body?.sql
7
+ ?.filter((el) => !el.disabled && el?.sql?.replace && (count ? el.count !== false : true))
8
+ .map((el) => ` left join lateral (${el.filter ? el.sql.replace(/limit 1/gi, "") : el.sql}) as ${el.name} on 1=1 `)
9
+ .join(" ");
10
+ return `(select * ${extraSqlColumns || ""} from ${tableName} t ${sqlList ? ` ${sqlList}` : ""} where 1=1 and ${q?.replace("q.", "t.") || "1=1"} ${order})q`;
11
+ }