@opengis/admin 0.2.26 → 0.2.27

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 (163) hide show
  1. package/README.md +89 -74
  2. package/config.js +4 -4
  3. package/dist/{IconChevronDown-JWm_82sv.js → IconChevronDown-H8JooCxL.js} +1 -1
  4. package/dist/{add-page-fptWbh7o.js → add-page-DXzuVNRB.js} +1 -1
  5. package/dist/{admin-interface-Cy578t-S.js → admin-interface-C2c1mmYC.js} +4 -4
  6. package/dist/{admin-view-ClA3MaHw.js → admin-view-CH5ugpkG.js} +3 -3
  7. package/dist/admin.js +1 -1
  8. package/dist/admin.umd.cjs +44 -44
  9. package/dist/assets/logo.svg +41 -41
  10. package/dist/{card-view-lQrpanQg.js → card-view-CHd5AODz.js} +1 -1
  11. package/dist/{edit-page-BSVwhvxu.js → edit-page-Burzk1u4.js} +1 -1
  12. package/dist/{import-file-Rjl_B7Cb.js → import-file-BEg7UgB4.js} +3019 -3016
  13. package/dist/style.css +1 -1
  14. package/module/settings/card/admin.accounts.table/index.yml +7 -7
  15. package/module/settings/card/admin.accounts.table/rules.hbs +18 -18
  16. package/module/settings/card/admin.accounts.table/users.hbs +13 -13
  17. package/module/settings/card/admin.roles.table/access.hbs +3 -3
  18. package/module/settings/card/admin.roles.table/general_info.hbs +1 -1
  19. package/module/settings/card/admin.roles.table/index.yml +21 -21
  20. package/module/settings/card/admin.roles.table/users.hbs +6 -6
  21. package/module/settings/card/admin.routes.table/general_info.hbs +13 -13
  22. package/module/settings/card/admin.routes.table/groups.hbs +11 -11
  23. package/module/settings/card/admin.routes.table/index.yml +11 -11
  24. package/module/settings/card/admin.routes.table/users.hbs +16 -16
  25. package/module/settings/card/admin.users.table/context.hbs +14 -14
  26. package/module/settings/card/admin.users.table/general_info.hbs +12 -12
  27. package/module/settings/card/admin.users.table/index.yml +22 -22
  28. package/module/settings/card/admin.users.table/last_login.hbs +9 -9
  29. package/module/settings/card/admin.users.table/logs.hbs +10 -10
  30. package/module/settings/card/admin.users.table/routes.hbs +7 -7
  31. package/module/settings/card/admin.users.table/user_roles.hbs +12 -12
  32. package/module/settings/cls/core.actions.json +17 -17
  33. package/module/settings/cls/core.scope.json +13 -13
  34. package/module/settings/cls/properties.site_status.json +13 -13
  35. package/module/settings/cls/properties.widget_status.json +13 -13
  36. package/module/settings/cls/users.user_type.json +13 -13
  37. package/module/settings/cls/yes_no.json +11 -11
  38. package/module/settings/form/admin.accounts.form.json +13 -13
  39. package/module/settings/form/admin.custom_column.form.json +71 -71
  40. package/module/settings/form/admin.properties.form.json +15 -15
  41. package/module/settings/form/admin.roles.form.json +21 -21
  42. package/module/settings/form/admin.routes.form.json +25 -25
  43. package/module/settings/form/admin.rules.form.json +30 -30
  44. package/module/settings/form/admin.user_properties.form.json +15 -15
  45. package/module/settings/form/admin.user_roles.form.json +13 -13
  46. package/module/settings/form/admin.user_roles_card.form.json +13 -13
  47. package/module/settings/form/admin.users.form.json +153 -153
  48. package/module/settings/form/context.account_grants.form.json +23 -23
  49. package/module/settings/form/context.account_users.form.json +12 -12
  50. package/module/settings/form/user.user_roles.form.json +13 -13
  51. package/module/settings/interface/admin.properties.json +4 -4
  52. package/module/settings/interface/admin.roles.json +4 -4
  53. package/module/settings/interface/admin.routes.json +4 -4
  54. package/module/settings/interface/admin.users.json +4 -4
  55. package/module/settings/menu.json +84 -84
  56. package/module/settings/select/core.routes.sql +1 -1
  57. package/module/settings/select/core.user_mentioned.sql +1 -1
  58. package/module/settings/select/core.user_uid.sql +1 -1
  59. package/module/settings/table/admin.accounts.table.json +42 -42
  60. package/module/settings/table/admin.custom_column.table.json +99 -99
  61. package/module/settings/table/admin.properties.table.json +39 -39
  62. package/module/settings/table/admin.roles.table.json +64 -64
  63. package/module/settings/table/admin.routes.table.json +73 -73
  64. package/module/settings/table/admin.rules.table.json +76 -76
  65. package/module/settings/table/admin.user_properties.table.json +34 -34
  66. package/module/settings/table/admin.user_roles.table.json +72 -72
  67. package/module/settings/table/admin.users.table.json +132 -132
  68. package/module/settings/table/context.account_grants.table.json +67 -67
  69. package/module/settings/table/context.account_users.table.json +37 -37
  70. package/package.json +91 -84
  71. package/plugin.js +29 -29
  72. package/server/helpers/core/badge.js +16 -16
  73. package/server/helpers/core/buttonHelper.js +21 -21
  74. package/server/helpers/core/select.js +48 -48
  75. package/server/helpers/core/token.js +18 -18
  76. package/server/helpers/index.js +29 -29
  77. package/server/helpers/list/buttonHelper.js +21 -21
  78. package/server/helpers/list/descriptionList.js +43 -43
  79. package/server/helpers/list/tableList.js +81 -81
  80. package/server/helpers/temp/contentList.js +58 -58
  81. package/server/helpers/temp/ifCond.js +101 -101
  82. package/server/helpers/utils/button.js +5 -5
  83. package/server/helpers/utils/buttonAdd.js +5 -5
  84. package/server/helpers/utils/buttonDel.js +5 -5
  85. package/server/helpers/utils/buttonEdit.js +5 -5
  86. package/server/plugins/access/funcs/getAdminAccess.js +12 -12
  87. package/server/plugins/access/index.mjs +6 -6
  88. package/server/plugins/adminHook.js +81 -81
  89. package/server/plugins/cron.js +10 -10
  90. package/server/plugins/docs.js +28 -28
  91. package/server/plugins/hook.js +236 -236
  92. package/server/plugins/vite.js +71 -71
  93. package/server/routes/access/controllers/access.group.js +29 -29
  94. package/server/routes/access/controllers/access.group.post.js +49 -49
  95. package/server/routes/access/index.mjs +8 -8
  96. package/server/routes/access/schema.mjs +57 -57
  97. package/server/routes/calendar/controllers/calendar.data.js +87 -87
  98. package/server/routes/calendar/index.mjs +7 -7
  99. package/server/routes/calendar/schema.js +21 -21
  100. package/server/routes/data/controllers/cardData.js +105 -105
  101. package/server/routes/data/controllers/cardTabData.js +49 -49
  102. package/server/routes/data/controllers/funcs/getFilterSQL/index.js +92 -92
  103. package/server/routes/data/controllers/funcs/getFilterSQL/util/formatValue.js +170 -170
  104. package/server/routes/data/controllers/funcs/getFilterSQL/util/getCustomQuery.js +13 -13
  105. package/server/routes/data/controllers/funcs/getFilterSQL/util/getFilterQuery.js +64 -64
  106. package/server/routes/data/controllers/funcs/getFilterSQL/util/getOptimizedQuery.js +12 -12
  107. package/server/routes/data/controllers/funcs/getFilterSQL/util/getTableSql.js +34 -34
  108. package/server/routes/data/controllers/tableData.js +29 -29
  109. package/server/routes/data/controllers/tableDataId.js +27 -27
  110. package/server/routes/data/controllers/tableFilter.js +67 -67
  111. package/server/routes/data/controllers/tokenInfo.js +9 -9
  112. package/server/routes/data/controllers/utils/assignTokens.js +30 -30
  113. package/server/routes/data/controllers/utils/getColumns.js +8 -8
  114. package/server/routes/data/index.mjs +17 -17
  115. package/server/routes/data/schema.js +54 -54
  116. package/server/routes/menu/controllers/getMenu.js +58 -58
  117. package/server/routes/menu/index.mjs +5 -5
  118. package/server/routes/notifications/controllers/readNotifications.js +27 -27
  119. package/server/routes/notifications/controllers/testEmail.js +35 -35
  120. package/server/routes/notifications/controllers/userNotifications.js +53 -53
  121. package/server/routes/notifications/funcs/addNotification.js +21 -21
  122. package/server/routes/notifications/funcs/sendNotification.js +92 -92
  123. package/server/routes/notifications/hook/onWidgetSet.js +57 -57
  124. package/server/routes/notifications/index.mjs +27 -27
  125. package/server/routes/notifications/schema.js +16 -16
  126. package/server/routes/properties/controllers/admin.properties.get.js +29 -29
  127. package/server/routes/properties/controllers/user.properties.get.js +30 -30
  128. package/server/routes/properties/controllers/user.properties.post.js +30 -30
  129. package/server/routes/properties/funcs/getSettings.js +56 -56
  130. package/server/routes/properties/funcs/setSettings.js +44 -44
  131. package/server/routes/properties/funcs/utils/dataInsert.js +26 -26
  132. package/server/routes/properties/index.mjs +14 -14
  133. package/server/routes/properties/schema.js +10 -10
  134. package/server/routes/root.mjs +3 -3
  135. package/server/routes/templates/controllers/getTemplate.js +43 -43
  136. package/server/routes/templates/index.mjs +16 -16
  137. package/server/routes/templates/schema.js +8 -8
  138. package/server/routes/user/controllers/user.cls.id.js +14 -14
  139. package/server/routes/user/controllers/user.cls.js +71 -71
  140. package/server/routes/user/controllers/user.cls.post.js +52 -52
  141. package/server/routes/user/controllers/user.info.js +17 -17
  142. package/server/routes/user/schema.js +14 -14
  143. package/server/routes/widget/controllers/utils/historyFormat.js +75 -75
  144. package/server/routes/widget/controllers/utils/obj2db.js +13 -13
  145. package/server/routes/widget/controllers/widget.del.js +41 -41
  146. package/server/routes/widget/controllers/widget.get.js +96 -96
  147. package/server/routes/widget/controllers/widget.set.js +76 -76
  148. package/server/routes/widget/index.mjs +11 -11
  149. package/server/routes/widget/schema.js +12 -12
  150. package/server/templates/cls/itree.recrzone_category.json +73 -73
  151. package/server/templates/cls/test.json +9 -9
  152. package/server/templates/form/admin.user_cls.data.form.json +49 -49
  153. package/server/templates/form/admin.user_group_rel.form.json +21 -21
  154. package/server/templates/form/cp_building.form.json +32 -32
  155. package/server/templates/form/form-user-pass.json +10 -10
  156. package/server/templates/form/form-user_group.json +39 -39
  157. package/server/templates/form/form-users.json +156 -156
  158. package/server/templates/form/user_group_access.form.json +22 -22
  159. package/server/templates/select/account_id.json +2 -2
  160. package/server/templates/table/gis.dataset.table.json +43 -43
  161. package/server/templates/table/management.user_group.table.json +112 -112
  162. package/server/templates/table/management.users.table.json +126 -126
  163. package/utils.js +29 -29
@@ -1,106 +1,106 @@
1
- import path from 'node:path';
2
-
3
- import { config, handlebars, setOpt, setToken, getTemplate, handlebarsSync, applyHook } from "@opengis/fastify-table/utils.js";
4
- //import { setOpt, setToken } from "../../../../../fastify-table/utils.js";
5
- // import yaml from 'js-yaml';
6
- import getTableData from "./tableData.js";
7
- import conditions from './utils/conditions.js';
8
-
9
- export default async function getCardData(req) {
10
-
11
- const {
12
- pg, params = {}, session = {}, user
13
- } = req;
14
- const { table, id } = params;
15
- const uid = session.passport?.user?.uid;
16
-
17
- const res = await applyHook('cardData', { table, id, user });
18
- if (res) return res;
19
-
20
-
21
- const time = Date.now();
22
-
23
- const template = await getTemplate('card', table);
24
-
25
- const tableTemplate = await getTemplate('table', table);
26
-
27
- const index = template?.find(el => el[0] === 'index.yml')?.[1] || {};
28
-
29
- const { message, rows = [] } = index.table && index.query ? await pg.query(`select * from ${index.table} where ${handlebarsSync.compile(index.query)({ uid, user })}`) :
30
- await getTableData({ pg, params: { table, id }, session, user });
31
-
32
- if (message) return { message };
33
-
34
- // conditions
35
- index.panels?.filter(el => el.items).forEach(el => {
36
- el.items = el.items?.filter(el => conditions(el.conditions, rows[0]));
37
- })
38
-
39
- // title, count
40
- index.panels?.filter(el => el.items).forEach(async el => {
41
- const filtered = el.items.filter(el => el.count?.toLowerCase?.().includes('select'));
42
- const data = await Promise.all(filtered.map(el => pg.query(el.count).then(el => el.rows[0] || {})))
43
- filtered.forEach((el, i) => {
44
- Object.assign(el, data[i] || {}, data[i].count ? {} : { count: undefined })
45
- })
46
- })
47
-
48
-
49
- // tokens result
50
- const tokens = {};
51
- if (index?.tokens && typeof index?.tokens === 'object' && !Array.isArray(index?.tokens)) {
52
- for (let key in index?.tokens) {
53
- const item = index?.tokens[key];
54
- Object.keys(item).filter(el => item[el]?.includes?.('{{')).forEach(el => {
55
- item[el] = handlebarsSync.compile(item[el])({ user, uid: user?.uid, id, data: rows[0] });
56
- });
57
-
58
- const token = item.form && item.table ? setToken({
59
- ids: [JSON.stringify(item)],
60
- uid,
61
- array: 1,
62
- })[0] : setOpt(item, user.uid);
63
- tokens[key] = token;
64
- }
65
- }
66
-
67
- // vue result
68
- const vue = template?.filter((el) => el[0].endsWith('.vue'))
69
- .reduce((acc, curr) => Object.assign(acc, { [path.parse(curr[0]).name]: curr[1].match(/<template[^>]*>([\s\S]*?)<\/template>/)[1].trim() }), {});
70
-
71
- // data result
72
- const data = {};
73
- if (index?.data && index?.data?.[0]?.name) {
74
- await Promise.all(index.data.filter((el) => el?.name && el?.sql).map(async (el) => {
75
- const q = handlebarsSync.compile(el.sql)({ data: rows[0], user, uid: user?.uid, id });
76
- const { rows: sqlData } = await pg.query(q);
77
- data[el.name] = sqlData;
78
- }));
79
- }
80
-
81
-
82
-
83
- // html result
84
- const html = {};
85
- if (template) {
86
- await Promise.all(template.filter(el => el[0].includes('.hbs')).map(async (el) => {
87
- const htmlContent = await handlebars.compile(el[1])({ ...rows[0], user, data, tokens });
88
- const name = el[0].substring(0, el[0].lastIndexOf('.'))
89
- html[name] = htmlContent;
90
- }));
91
- }
92
-
93
- return {
94
- time: Date.now() - time,
95
- ...index,
96
- tokens,
97
- vue,
98
- data,
99
- html,
100
- rows,
101
- columns: tableTemplate?.columns || tableTemplate?.colModel,
102
- table: undefined,
103
- query: undefined,
104
- };
105
-
1
+ import path from 'node:path';
2
+
3
+ import { config, handlebars, setOpt, setToken, getTemplate, handlebarsSync, applyHook } from "@opengis/fastify-table/utils.js";
4
+ //import { setOpt, setToken } from "../../../../../fastify-table/utils.js";
5
+ // import yaml from 'js-yaml';
6
+ import getTableData from "./tableData.js";
7
+ import conditions from './utils/conditions.js';
8
+
9
+ export default async function getCardData(req) {
10
+
11
+ const {
12
+ pg, params = {}, session = {}, user
13
+ } = req;
14
+ const { table, id } = params;
15
+ const uid = session.passport?.user?.uid;
16
+
17
+ const res = await applyHook('cardData', { table, id, user });
18
+ if (res) return res;
19
+
20
+
21
+ const time = Date.now();
22
+
23
+ const template = await getTemplate('card', table);
24
+
25
+ const tableTemplate = await getTemplate('table', table);
26
+
27
+ const index = template?.find(el => el[0] === 'index.yml')?.[1] || {};
28
+
29
+ const { message, rows = [] } = index.table && index.query ? await pg.query(`select * from ${index.table} where ${handlebarsSync.compile(index.query)({ uid, user })}`) :
30
+ await getTableData({ pg, params: { table, id }, session, user });
31
+
32
+ if (message) return { message };
33
+
34
+ // conditions
35
+ index.panels?.filter(el => el.items).forEach(el => {
36
+ el.items = el.items?.filter(el => conditions(el.conditions, rows[0]));
37
+ })
38
+
39
+ // title, count
40
+ index.panels?.filter(el => el.items).forEach(async el => {
41
+ const filtered = el.items.filter(el => el.count?.toLowerCase?.().includes('select'));
42
+ const data = await Promise.all(filtered.map(el => pg.query(el.count).then(el => el.rows[0] || {})))
43
+ filtered.forEach((el, i) => {
44
+ Object.assign(el, data[i] || {}, data[i].count ? {} : { count: undefined })
45
+ })
46
+ })
47
+
48
+
49
+ // tokens result
50
+ const tokens = {};
51
+ if (index?.tokens && typeof index?.tokens === 'object' && !Array.isArray(index?.tokens)) {
52
+ for (let key in index?.tokens) {
53
+ const item = index?.tokens[key];
54
+ Object.keys(item).filter(el => item[el]?.includes?.('{{')).forEach(el => {
55
+ item[el] = handlebarsSync.compile(item[el])({ user, uid: user?.uid, id, data: rows[0] });
56
+ });
57
+
58
+ const token = item.form && item.table ? setToken({
59
+ ids: [JSON.stringify(item)],
60
+ uid,
61
+ array: 1,
62
+ })[0] : setOpt(item, user.uid);
63
+ tokens[key] = token;
64
+ }
65
+ }
66
+
67
+ // vue result
68
+ const vue = template?.filter((el) => el[0].endsWith('.vue'))
69
+ .reduce((acc, curr) => Object.assign(acc, { [path.parse(curr[0]).name]: curr[1].match(/<template[^>]*>([\s\S]*?)<\/template>/)[1].trim() }), {});
70
+
71
+ // data result
72
+ const data = {};
73
+ if (index?.data && index?.data?.[0]?.name) {
74
+ await Promise.all(index.data.filter((el) => el?.name && el?.sql).map(async (el) => {
75
+ const q = handlebarsSync.compile(el.sql)({ data: rows[0], user, uid: user?.uid, id });
76
+ const { rows: sqlData } = await pg.query(q);
77
+ data[el.name] = sqlData;
78
+ }));
79
+ }
80
+
81
+
82
+
83
+ // html result
84
+ const html = {};
85
+ if (template) {
86
+ await Promise.all(template.filter(el => el[0].includes('.hbs')).map(async (el) => {
87
+ const htmlContent = await handlebars.compile(el[1])({ ...rows[0], user, data, tokens });
88
+ const name = el[0].substring(0, el[0].lastIndexOf('.'))
89
+ html[name] = htmlContent;
90
+ }));
91
+ }
92
+
93
+ return {
94
+ time: Date.now() - time,
95
+ ...index,
96
+ tokens,
97
+ vue,
98
+ data,
99
+ html,
100
+ rows,
101
+ columns: tableTemplate?.columns || tableTemplate?.colModel,
102
+ table: undefined,
103
+ query: undefined,
104
+ };
105
+
106
106
  }
@@ -1,50 +1,50 @@
1
- import { config, handlebars, getToken, getTemplate, getMeta } from "@opengis/fastify-table/utils.js";
2
-
3
- import getTableData from "./tableData.js";
4
-
5
- export default async function cardTabData({
6
- pg, query = {}, params = {}, session = {},
7
- }) {
8
- const { token } = params;
9
- const { sql } = query;
10
-
11
- if (!token) {
12
- return { message: 'not enough params: token', status: 400 };
13
- }
14
-
15
- const time = Date.now();
16
- const { uid } = config?.auth?.disable ? { uid: '1' } : (session.passport?.user || {});
17
-
18
- const props = await getToken({
19
- token,
20
- mode: 'w',
21
- uid,
22
- json: 1,
23
- });
24
-
25
- if (!props || !props?.table || !props) {
26
- return { message: { error: 'token is invalid', props }, status: 403 };
27
- }
28
-
29
- const tableTemplate = await getTemplate('table', props.table);
30
-
31
- const { columns = [] } = tableTemplate?.columns || tableTemplate?.colModel
32
- ? { columns: tableTemplate?.columns || tableTemplate?.colModel }
33
- : await getMeta({ table: props.table });
34
-
35
- const filter = await handlebars.compile(props.query.replace(/@id/g, '{{id}}'))(props);
36
- const { message, rows = [] } = await getTableData({ pg, params: { table: props.table }, session, query: { filter, sql } });
37
- if (message) return { message };
38
-
39
- if (props.columns?.length && rows?.length) {
40
- const allowList = ['id', 'token'].concat(props.columns).map((el) => [el, `${el}_text`]).flat();
41
- rows.forEach((row) => Object.keys(row).forEach((el) => { if (!allowList.includes(el)) delete row[el]; }));
42
-
43
- return {
44
- time: Date.now() - time,
45
- rows,
46
- columns: columns.filter((col) => props.columns.includes(col.name)),
47
- };
48
- }
49
- return { time: Date.now() - time, rows, columns };
1
+ import { config, handlebars, getToken, getTemplate, getMeta } from "@opengis/fastify-table/utils.js";
2
+
3
+ import getTableData from "./tableData.js";
4
+
5
+ export default async function cardTabData({
6
+ pg, query = {}, params = {}, session = {},
7
+ }) {
8
+ const { token } = params;
9
+ const { sql } = query;
10
+
11
+ if (!token) {
12
+ return { message: 'not enough params: token', status: 400 };
13
+ }
14
+
15
+ const time = Date.now();
16
+ const { uid } = config?.auth?.disable ? { uid: '1' } : (session.passport?.user || {});
17
+
18
+ const props = await getToken({
19
+ token,
20
+ mode: 'w',
21
+ uid,
22
+ json: 1,
23
+ });
24
+
25
+ if (!props || !props?.table || !props) {
26
+ return { message: { error: 'token is invalid', props }, status: 403 };
27
+ }
28
+
29
+ const tableTemplate = await getTemplate('table', props.table);
30
+
31
+ const { columns = [] } = tableTemplate?.columns || tableTemplate?.colModel
32
+ ? { columns: tableTemplate?.columns || tableTemplate?.colModel }
33
+ : await getMeta({ table: props.table });
34
+
35
+ const filter = await handlebars.compile(props.query.replace(/@id/g, '{{id}}'))(props);
36
+ const { message, rows = [] } = await getTableData({ pg, params: { table: props.table }, session, query: { filter, sql } });
37
+ if (message) return { message };
38
+
39
+ if (props.columns?.length && rows?.length) {
40
+ const allowList = ['id', 'token'].concat(props.columns).map((el) => [el, `${el}_text`]).flat();
41
+ rows.forEach((row) => Object.keys(row).forEach((el) => { if (!allowList.includes(el)) delete row[el]; }));
42
+
43
+ return {
44
+ time: Date.now() - time,
45
+ rows,
46
+ columns: columns.filter((col) => props.columns.includes(col.name)),
47
+ };
48
+ }
49
+ return { time: Date.now() - time, rows, columns };
50
50
  }
@@ -1,92 +1,92 @@
1
- import { getPG, getTemplate } from "@opengis/fastify-table/utils.js";
2
- // import pgClients from '@opengis/fastify-table/pg/funcs/pgClients.js';
3
-
4
- import getTableSql from './util/getTableSql.js';
5
- import getFilterQuery from './util/getFilterQuery.js';
6
- import getOptimizedQuery from './util/getOptimizedQuery.js';
7
-
8
- async function getFilterSQL({
9
- pg: pg1, table, filter, search, filterList, query, uid,
10
- }) {
11
- if (!table) return { error: 'param table is required', status: 400 };
12
-
13
- const pg = pg1 || getPG();
14
- const body = await getTemplate('table', table);
15
-
16
- const sqlList = body?.sql?.length
17
- ? body?.sql?.filter((el) => !el.disabled && el?.sql?.replace)
18
- .map((el, i) => {
19
- Object.assign(el, { name: el.name || `t${i + 1}` });
20
- return ` left join lateral (${el.filter ? el.sql.replace(/limit 1/ig, '') : el.sql}) as ${el.name} on 1=1 `;
21
- }).join(' ')
22
- : '';
23
- const fieldQuery = `select * from ${body?.table || table} ${sqlList ? ` t ${sqlList}` : ''} where 1=1 limit 0`;
24
- const { fields = [] } = await pg.query(fieldQuery);
25
-
26
- const { fields: fieldsModel } = pg.pk[body?.table] ? await pg.query(`select * from ${body.table} limit 0`) : {};
27
-
28
- const autoSearchColumn = fields?.filter((el) => pg.pgType?.[el.dataTypeID] === 'text')?.map((el) => el.name).join(',');
29
- const searchColumn = body?.search_column || autoSearchColumn;
30
- const fieldsList = (fieldsModel || fields)?.map((el) => el.name);
31
- try {
32
- const tableSQL = await getTableSql({
33
- pg, body, table, fields,
34
- });
35
- const sval = `ilike '%${decodeURIComponent(search).replace(/'/g, "''")}%'`;
36
- const searchQuery = search && searchColumn
37
- ? ` (${searchColumn.split(',')?.map((name) => {
38
- const { pk } = tableSQL.find((el) => el.name === name) || {};
39
- return pk && !fieldsList.includes(name) ? `${pk} in (select ${pk} from (${fieldQuery})q where ${name} ${sval})` : `${name} ${sval}`;
40
- }).join(' or ')} )` : '';
41
-
42
- // table_properties - user filter data
43
- const { rows: filterProperties = [] } = await pg.query(`select column_id, name, title, format, data from admin.custom_column where entity=$1 and uid=$2`, [table, uid]);
44
- const extraFilters = filterProperties.map((row) => ({ ua: row.title, name: row.name, type: row.format, data: row.data, extra: true }));
45
- const customFilters = [];
46
-
47
- const filterList1 = await Promise.all((filterList || (body?.filter_list || []).concat(body?.filterInline || []).concat(body?.filterCustom || []).concat(body?.filterState || []).concat(body?.filterList || []).concat(body?.filters || [])).concat(extraFilters || []).concat(customFilters || [])
48
-
49
- ?.map(async (el) => {
50
- if (!el?.data) return el;
51
- const cls = await getTemplate(['cls', 'select'], el.data);
52
- if (Array.isArray(cls) && cls?.length) {
53
- Object.assign(el, { options: cls });
54
- } else if (typeof (cls?.sql || cls) === 'string') {
55
- Object.assign(el, { sql: cls?.sql || cls });
56
- }
57
- return el;
58
- })
59
- );
60
- const filters = getFilterQuery({
61
- pg,
62
- filter,
63
- table: body?.table || table,
64
- tableSQL,
65
- fields,
66
- filterList: filterList1,
67
- });
68
-
69
- // filter
70
- const filterQuery = filters?.filter((el) => el.query)?.map((el) => `${el.query} `).join(' and ');
71
- const q = [body?.query, query, searchQuery, filterQuery].filter((el) => el).join(' and ');
72
-
73
- // table
74
- const modelQuery = body?.model || body?.table || table;
75
- const optimizedSQL = `select * from ${getOptimizedQuery({ body, table, q })} `;
76
- const tableCount = getOptimizedQuery({ body, table, q }, true);
77
- // console.log(optimizedSQL);
78
- return {
79
- filterList,
80
- q,
81
- optimizedSQL,
82
- tableCount,
83
- table: modelQuery,
84
- searchQuery,
85
- };
86
- }
87
- catch (err) {
88
- throw new Error(err.toString());
89
- }
90
- }
91
-
92
- export default getFilterSQL;
1
+ import { getPG, getTemplate } from "@opengis/fastify-table/utils.js";
2
+ // import pgClients from '@opengis/fastify-table/pg/funcs/pgClients.js';
3
+
4
+ import getTableSql from './util/getTableSql.js';
5
+ import getFilterQuery from './util/getFilterQuery.js';
6
+ import getOptimizedQuery from './util/getOptimizedQuery.js';
7
+
8
+ async function getFilterSQL({
9
+ pg: pg1, table, filter, search, filterList, query, uid,
10
+ }) {
11
+ if (!table) return { error: 'param table is required', status: 400 };
12
+
13
+ const pg = pg1 || getPG();
14
+ const body = await getTemplate('table', table);
15
+
16
+ const sqlList = body?.sql?.length
17
+ ? body?.sql?.filter((el) => !el.disabled && el?.sql?.replace)
18
+ .map((el, i) => {
19
+ Object.assign(el, { name: el.name || `t${i + 1}` });
20
+ return ` left join lateral (${el.filter ? el.sql.replace(/limit 1/ig, '') : el.sql}) as ${el.name} on 1=1 `;
21
+ }).join(' ')
22
+ : '';
23
+ const fieldQuery = `select * from ${body?.table || table} ${sqlList ? ` t ${sqlList}` : ''} where 1=1 limit 0`;
24
+ const { fields = [] } = await pg.query(fieldQuery);
25
+
26
+ const { fields: fieldsModel } = pg.pk[body?.table] ? await pg.query(`select * from ${body.table} limit 0`) : {};
27
+
28
+ const autoSearchColumn = fields?.filter((el) => pg.pgType?.[el.dataTypeID] === 'text')?.map((el) => el.name).join(',');
29
+ const searchColumn = body?.search_column || autoSearchColumn;
30
+ const fieldsList = (fieldsModel || fields)?.map((el) => el.name);
31
+ try {
32
+ const tableSQL = await getTableSql({
33
+ pg, body, table, fields,
34
+ });
35
+ const sval = `ilike '%${decodeURIComponent(search).replace(/'/g, "''")}%'`;
36
+ const searchQuery = search && searchColumn
37
+ ? ` (${searchColumn.split(',')?.map((name) => {
38
+ const { pk } = tableSQL.find((el) => el.name === name) || {};
39
+ return pk && !fieldsList.includes(name) ? `${pk} in (select ${pk} from (${fieldQuery})q where ${name} ${sval})` : `${name} ${sval}`;
40
+ }).join(' or ')} )` : '';
41
+
42
+ // table_properties - user filter data
43
+ const { rows: filterProperties = [] } = await pg.query(`select column_id, name, title, format, data from admin.custom_column where entity=$1 and uid=$2`, [table, uid]);
44
+ const extraFilters = filterProperties.map((row) => ({ ua: row.title, name: row.name, type: row.format, data: row.data, extra: true }));
45
+ const customFilters = [];
46
+
47
+ const filterList1 = await Promise.all((filterList || (body?.filter_list || []).concat(body?.filterInline || []).concat(body?.filterCustom || []).concat(body?.filterState || []).concat(body?.filterList || []).concat(body?.filters || [])).concat(extraFilters || []).concat(customFilters || [])
48
+
49
+ ?.map(async (el) => {
50
+ if (!el?.data) return el;
51
+ const cls = await getTemplate(['cls', 'select'], el.data);
52
+ if (Array.isArray(cls) && cls?.length) {
53
+ Object.assign(el, { options: cls });
54
+ } else if (typeof (cls?.sql || cls) === 'string') {
55
+ Object.assign(el, { sql: cls?.sql || cls });
56
+ }
57
+ return el;
58
+ })
59
+ );
60
+ const filters = getFilterQuery({
61
+ pg,
62
+ filter,
63
+ table: body?.table || table,
64
+ tableSQL,
65
+ fields,
66
+ filterList: filterList1,
67
+ });
68
+
69
+ // filter
70
+ const filterQuery = filters?.filter((el) => el.query)?.map((el) => `${el.query} `).join(' and ');
71
+ const q = [body?.query, query, searchQuery, filterQuery].filter((el) => el).join(' and ');
72
+
73
+ // table
74
+ const modelQuery = body?.model || body?.table || table;
75
+ const optimizedSQL = `select * from ${getOptimizedQuery({ body, table, q })} `;
76
+ const tableCount = getOptimizedQuery({ body, table, q }, true);
77
+ // console.log(optimizedSQL);
78
+ return {
79
+ filterList,
80
+ q,
81
+ optimizedSQL,
82
+ tableCount,
83
+ table: modelQuery,
84
+ searchQuery,
85
+ };
86
+ }
87
+ catch (err) {
88
+ throw new Error(err.toString());
89
+ }
90
+ }
91
+
92
+ export default getFilterSQL;