@opengis/admin 0.3.44 → 0.3.46

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 (114) hide show
  1. package/README.md +97 -97
  2. package/config.js +4 -4
  3. package/dist/{add-page-D7k1z2z2.js → add-page-CE3w_N_V.js} +1 -1
  4. package/dist/{admin-interface-C5JbxrTW.js → admin-interface-CZUmhaoy.js} +2 -2
  5. package/dist/{admin-view-CtyfgHHf.js → admin-view-DIeCS4jq.js} +1 -1
  6. package/dist/admin.js +1 -1
  7. package/dist/admin.umd.cjs +90 -90
  8. package/dist/assets/logo.svg +41 -41
  9. package/dist/{card-view-CS42wpFl.js → card-view-BtVVcc-W.js} +1 -1
  10. package/dist/{edit-page-DamPRsiC.js → edit-page-7de8lo0s.js} +1 -1
  11. package/dist/{import-file-DAuB2UFK.js → import-file-CkRu6SJY.js} +11847 -11782
  12. package/dist/{profile-page-CqrHlzPZ.js → profile-page-DsnzYp81.js} +1 -1
  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.routes.table/groups.hbs +11 -11
  18. package/module/settings/card/admin.routes.table/users.hbs +16 -16
  19. package/module/settings/cls/core.actions.json +17 -17
  20. package/module/settings/cls/core.scope.json +13 -13
  21. package/module/settings/cls/properties.site_status.json +13 -13
  22. package/module/settings/cls/properties.widget_status.json +13 -13
  23. package/module/settings/cls/users.user_type.json +13 -13
  24. package/module/settings/cls/yes_no.json +11 -11
  25. package/module/settings/form/admin.accounts.form.json +13 -13
  26. package/module/settings/form/admin.properties.form.json +15 -15
  27. package/module/settings/form/admin.roles.form.json +21 -21
  28. package/module/settings/form/admin.user_properties.form.json +15 -15
  29. package/module/settings/form/admin.user_roles_card.form.json +13 -13
  30. package/module/settings/interface/admin.properties.json +4 -4
  31. package/module/settings/interface/admin.roles.json +4 -4
  32. package/module/settings/interface/admin.routes.json +4 -4
  33. package/module/settings/interface/admin.users.json +4 -4
  34. package/module/settings/select/core.routes.sql +1 -1
  35. package/module/settings/select/core.user_mentioned.sql +1 -1
  36. package/module/settings/select/core.user_uid.sql +1 -1
  37. package/module/settings/table/admin.properties.table.json +39 -39
  38. package/module/settings/table/admin.user_properties.table.json +34 -34
  39. package/package.json +2 -1
  40. package/server/helpers/core/badge.js +16 -16
  41. package/server/helpers/core/buttonHelper.js +21 -21
  42. package/server/helpers/core/coalesce.js +7 -7
  43. package/server/helpers/core/select.js +48 -48
  44. package/server/helpers/core/token.js +18 -18
  45. package/server/helpers/list/buttonHelper.js +21 -21
  46. package/server/helpers/list/utils/button.js +5 -5
  47. package/server/helpers/temp/contentList.js +58 -58
  48. package/server/helpers/temp/ifCond.js +101 -101
  49. package/server/helpers/utils/button.js +5 -5
  50. package/server/helpers/utils/mdToHTML.js +17 -17
  51. package/server/plugins/access/index.mjs +6 -6
  52. package/server/plugins/adminHook.js +81 -81
  53. package/server/plugins/cron.js +10 -10
  54. package/server/plugins/docs.js +28 -28
  55. package/server/routes/access/controllers/access.group.js +29 -29
  56. package/server/routes/access/controllers/access.group.post.js +54 -54
  57. package/server/routes/access/index.mjs +11 -11
  58. package/server/routes/access/schema.mjs +67 -67
  59. package/server/routes/calendar/controllers/calendar.data.js +125 -125
  60. package/server/routes/calendar/index.mjs +7 -7
  61. package/server/routes/calendar/schema.js +21 -21
  62. package/server/routes/data/controllers/cardTabData.js +49 -49
  63. package/server/routes/data/controllers/funcs/getFilterSQL/index.js +92 -92
  64. package/server/routes/data/controllers/funcs/getFilterSQL/util/formatValue.js +170 -170
  65. package/server/routes/data/controllers/funcs/getFilterSQL/util/getCustomQuery.js +13 -13
  66. package/server/routes/data/controllers/funcs/getFilterSQL/util/getFilterQuery.js +64 -64
  67. package/server/routes/data/controllers/funcs/getFilterSQL/util/getOptimizedQuery.js +12 -12
  68. package/server/routes/data/controllers/funcs/getFilterSQL/util/getTableSql.js +34 -34
  69. package/server/routes/data/controllers/tableDataId.js +27 -27
  70. package/server/routes/data/controllers/tokenInfo.js +9 -9
  71. package/server/routes/data/controllers/utils/assignTokens.js +30 -30
  72. package/server/routes/data/controllers/utils/conditions.js +20 -20
  73. package/server/routes/data/controllers/utils/getColumns.js +8 -8
  74. package/server/routes/data/index.mjs +20 -20
  75. package/server/routes/data/schema.js +54 -54
  76. package/server/routes/notifications/controllers/readNotifications.js +18 -18
  77. package/server/routes/notifications/controllers/testEmail.js +35 -35
  78. package/server/routes/notifications/controllers/userNotifications.js +53 -53
  79. package/server/routes/notifications/hook/onWidgetSet.js +56 -56
  80. package/server/routes/notifications/index.mjs +26 -26
  81. package/server/routes/notifications/schema.js +16 -16
  82. package/server/routes/print/controllers/cardPrint.js +135 -135
  83. package/server/routes/properties/schema.js +10 -10
  84. package/server/routes/report/controllers/data.js +76 -76
  85. package/server/routes/report/controllers/list.js +18 -18
  86. package/server/routes/report/index.mjs +7 -7
  87. package/server/routes/report/utils/formatValue.js +179 -179
  88. package/server/routes/root.mjs +3 -3
  89. package/server/routes/templates/controllers/getTemplate.js +44 -44
  90. package/server/routes/templates/schema.js +8 -8
  91. package/server/routes/user/controllers/user.cls.id.js +14 -14
  92. package/server/routes/user/controllers/user.cls.js +72 -72
  93. package/server/routes/user/controllers/user.info.js +17 -17
  94. package/server/routes/user/schema.js +14 -14
  95. package/server/routes/util/controllers/code.generator.js +89 -89
  96. package/server/routes/widget/controllers/widget.del.js +80 -80
  97. package/server/routes/widget/controllers/widget.set.js +93 -93
  98. package/server/routes/widget/hook/onWidgetSet.js +12 -12
  99. package/server/routes/widget/index.mjs +16 -16
  100. package/server/routes/widget/schema.js +12 -12
  101. package/server/templates/cls/itree.recrzone_category.json +73 -73
  102. package/server/templates/cls/test.json +9 -9
  103. package/server/templates/form/admin.user_cls.data.form.json +49 -49
  104. package/server/templates/form/admin.user_group_rel.form.json +21 -21
  105. package/server/templates/form/form-user-pass.json +10 -10
  106. package/server/templates/form/form-user_group.json +39 -39
  107. package/server/templates/form/form-users.json +156 -156
  108. package/server/templates/form/user_group_access.form.json +22 -22
  109. package/server/templates/select/account_id.json +2 -2
  110. package/server/templates/table/gis.dataset.table.json +43 -43
  111. package/server/templates/table/management.user_group.table.json +112 -112
  112. package/server/templates/table/management.users.table.json +126 -126
  113. package/server/utils/addNotification.js +21 -21
  114. package/server/utils/sendNotification.js +89 -89
@@ -1,126 +1,126 @@
1
- import { getMeta, getTemplate, pgClients, handlebarsSync } from '@opengis/fastify-table/utils.js';
2
-
3
- const isValidDate = (dateStr) => (new Date(dateStr)).toString() !== 'Invalid Date';
4
-
5
- export default async function calendarData({
6
- pg = pgClients.client, params = {}, query = {}, session = {},
7
- }) {
8
- const { name } = params;
9
- const { granularity = 'month' } = query;
10
- const { user = {} } = session.passport || {};
11
-
12
- if (!name) {
13
- return { message: 'not enough params: name', status: 400 };
14
- }
15
-
16
- if (query.granularity && !['day', 'month', 'week', 'year'].includes(granularity)) {
17
- return { message: 'invalid query params: granularity', status: 400 };
18
- }
19
-
20
- const body = await getTemplate('calendar', name);
21
-
22
- if (!body) {
23
- return { message: `calendar not found: ${name}`, status: 404 };
24
- }
25
-
26
- const {
27
- title,
28
- table,
29
- meta = {},
30
- } = body || {};
31
-
32
- if (!table) {
33
- return { message: 'not enough calendar params: table', status: 404 };
34
- }
35
- if (!pg.pk?.[table]) {
36
- return { message: `table pkey not found: ${table}`, status: 404 };
37
- }
38
-
39
- const filterList = (body?.filter || [])
40
- .concat(body?.filterInline || [])
41
- .concat(body?.filterCustom || [])
42
- .concat(body?.filterState || [])
43
- .concat(body?.filterList || [])
44
- .concat(body?.filters || [])
45
- .concat(body?.filter_list || []);
46
-
47
- const { columns = [] } = await getMeta({ pg, table });
48
- const columnList = columns?.map((el) => el?.name);
49
-
50
- const dateColumn = columns?.find((el) => el?.name === (meta?.date || meta?.start))?.name
51
- || columns?.find((el) => el?.name === 'cdate')?.name;
52
-
53
- if (query.date && !dateColumn) {
54
- return { message: 'invalid template params: date column not found', status: 400 };
55
- }
56
-
57
- if (query.date && !isValidDate(query.date)) {
58
- return { message: 'Invalid date: out of range or incorrect format', status: 400 };
59
- }
60
-
61
- const filterWhere = filterList?.length && query.filter?.length
62
- ? filterList
63
- .filter((el) => (Object.hasOwn(el, 'enabled') ? el?.enabled : true))
64
- .map((el) => {
65
- const val = query.filter.split(',').find((e) => e?.split('=')?.shift()?.includes(el.column || el.name))?.split('=')?.pop();
66
- if (val) return el.column && val ? `(${[`${el.column}::text='${val.replace(/'/g, "''")}'::text`, el.query].filter((el) => el).join(' and ')})` : el.query;
67
- })
68
- .filter((el) => el)
69
- .join(' and ')
70
- : undefined;
71
-
72
- const queryWhere = handlebarsSync.compile(body.query || '1=1')({ user, uid: user?.uid });
73
- const filterDate = query.date ? `date_trunc('${granularity}', "${dateColumn}"::date)='${query.date}'::date` : undefined;
74
-
75
- const where = [queryWhere, filterDate, filterWhere].filter((el) => el).join(' and ');
76
-
77
- const filtersByColumn = filterList.filter((el) => (Object.hasOwn(el, 'enabled') ? el?.enabled : true) && el?.column);
78
-
79
- const filters = [];
80
- if (filtersByColumn?.length) {
81
- await Promise.all(filtersByColumn.map(async (el) => {
82
- const { rows: filterData = [] } = await pg.query(`select ${el.column.replace(/'/g, "''")} as id, count(*) from ${table}
83
- where ${el.query || '1=1'} and ${filterWhere || '1=1'} group by ${el.column.replace(/'/g, "''")}`);
84
- if (!filterData?.length) return;
85
-
86
- const clsData = await getTemplate(['cls', 'select'], el.cls);
87
-
88
- if (!el.cls || !clsData?.length) {
89
- filterData.forEach((item) => filters.push(item));
90
- return;
91
- }
92
-
93
- filterData.forEach((filter) => {
94
- const cls = clsData.find((item) => item.id === filter.id.toString());
95
- Object.assign(filter, { title: cls?.text, color: cls?.color });
96
- filters.push(filter);
97
- });
98
- }));
99
- }
100
-
101
- const filtersByPreparedQuery = filterList.filter((el) => (Object.hasOwn(el, 'enabled') ? el?.enabled : true) && !el?.column && el?.query);
102
-
103
- if (filtersByPreparedQuery?.length) {
104
- await Promise.all(filtersByPreparedQuery.map(async (el) => {
105
- const { rows = [] } = await pg.query(`select ${el.query} as id, count(*) from ${table}
106
- where ${filterWhere || '1=1'} group by ${el.query}`);
107
- rows.forEach((item) => filters.push(item));
108
- }));
109
- }
110
-
111
- const metaColumns = Object.keys(meta)
112
- .filter((el) => ['date', 'start', 'end', 'title', 'status'].includes(el) && columnList.includes(meta[el]))
113
- .map((el) => `"${meta[el]}" as ${el}`);
114
-
115
- if (!metaColumns?.length) {
116
- return { message: `calendar param meta is invalid: invalid/empty keys`, status: 404 };
117
- }
118
-
119
- const q = `select ${metaColumns.join(',')} from ${table} where ${where}`;
120
- if (query?.sql && user?.user_type?.includes('admin')) return q;
121
-
122
- const { rows = [] } = await pg.query(q);
123
-
124
- return { title, filters, granularity, sql: user?.user_type?.includes('admin') ? q : undefined, rows };
125
-
1
+ import { getMeta, getTemplate, pgClients, handlebarsSync } from '@opengis/fastify-table/utils.js';
2
+
3
+ const isValidDate = (dateStr) => (new Date(dateStr)).toString() !== 'Invalid Date';
4
+
5
+ export default async function calendarData({
6
+ pg = pgClients.client, params = {}, query = {}, session = {},
7
+ }) {
8
+ const { name } = params;
9
+ const { granularity = 'month' } = query;
10
+ const { user = {} } = session.passport || {};
11
+
12
+ if (!name) {
13
+ return { message: 'not enough params: name', status: 400 };
14
+ }
15
+
16
+ if (query.granularity && !['day', 'month', 'week', 'year'].includes(granularity)) {
17
+ return { message: 'invalid query params: granularity', status: 400 };
18
+ }
19
+
20
+ const body = await getTemplate('calendar', name);
21
+
22
+ if (!body) {
23
+ return { message: `calendar not found: ${name}`, status: 404 };
24
+ }
25
+
26
+ const {
27
+ title,
28
+ table,
29
+ meta = {},
30
+ } = body || {};
31
+
32
+ if (!table) {
33
+ return { message: 'not enough calendar params: table', status: 404 };
34
+ }
35
+ if (!pg.pk?.[table]) {
36
+ return { message: `table pkey not found: ${table}`, status: 404 };
37
+ }
38
+
39
+ const filterList = (body?.filter || [])
40
+ .concat(body?.filterInline || [])
41
+ .concat(body?.filterCustom || [])
42
+ .concat(body?.filterState || [])
43
+ .concat(body?.filterList || [])
44
+ .concat(body?.filters || [])
45
+ .concat(body?.filter_list || []);
46
+
47
+ const { columns = [] } = await getMeta({ pg, table });
48
+ const columnList = columns?.map((el) => el?.name);
49
+
50
+ const dateColumn = columns?.find((el) => el?.name === (meta?.date || meta?.start))?.name
51
+ || columns?.find((el) => el?.name === 'cdate')?.name;
52
+
53
+ if (query.date && !dateColumn) {
54
+ return { message: 'invalid template params: date column not found', status: 400 };
55
+ }
56
+
57
+ if (query.date && !isValidDate(query.date)) {
58
+ return { message: 'Invalid date: out of range or incorrect format', status: 400 };
59
+ }
60
+
61
+ const filterWhere = filterList?.length && query.filter?.length
62
+ ? filterList
63
+ .filter((el) => (Object.hasOwn(el, 'enabled') ? el?.enabled : true))
64
+ .map((el) => {
65
+ const val = query.filter.split(',').find((e) => e?.split('=')?.shift()?.includes(el.column || el.name))?.split('=')?.pop();
66
+ if (val) return el.column && val ? `(${[`${el.column}::text='${val.replace(/'/g, "''")}'::text`, el.query].filter((el) => el).join(' and ')})` : el.query;
67
+ })
68
+ .filter((el) => el)
69
+ .join(' and ')
70
+ : undefined;
71
+
72
+ const queryWhere = handlebarsSync.compile(body.query || '1=1')({ user, uid: user?.uid });
73
+ const filterDate = query.date ? `date_trunc('${granularity}', "${dateColumn}"::date)='${query.date}'::date` : undefined;
74
+
75
+ const where = [queryWhere, filterDate, filterWhere].filter((el) => el).join(' and ');
76
+
77
+ const filtersByColumn = filterList.filter((el) => (Object.hasOwn(el, 'enabled') ? el?.enabled : true) && el?.column);
78
+
79
+ const filters = [];
80
+ if (filtersByColumn?.length) {
81
+ await Promise.all(filtersByColumn.map(async (el) => {
82
+ const { rows: filterData = [] } = await pg.query(`select ${el.column.replace(/'/g, "''")} as id, count(*) from ${table}
83
+ where ${el.query || '1=1'} and ${filterWhere || '1=1'} group by ${el.column.replace(/'/g, "''")}`);
84
+ if (!filterData?.length) return;
85
+
86
+ const clsData = await getTemplate(['cls', 'select'], el.cls);
87
+
88
+ if (!el.cls || !clsData?.length) {
89
+ filterData.forEach((item) => filters.push(item));
90
+ return;
91
+ }
92
+
93
+ filterData.forEach((filter) => {
94
+ const cls = clsData.find((item) => item.id === filter.id.toString());
95
+ Object.assign(filter, { title: cls?.text, color: cls?.color });
96
+ filters.push(filter);
97
+ });
98
+ }));
99
+ }
100
+
101
+ const filtersByPreparedQuery = filterList.filter((el) => (Object.hasOwn(el, 'enabled') ? el?.enabled : true) && !el?.column && el?.query);
102
+
103
+ if (filtersByPreparedQuery?.length) {
104
+ await Promise.all(filtersByPreparedQuery.map(async (el) => {
105
+ const { rows = [] } = await pg.query(`select ${el.query} as id, count(*) from ${table}
106
+ where ${filterWhere || '1=1'} group by ${el.query}`);
107
+ rows.forEach((item) => filters.push(item));
108
+ }));
109
+ }
110
+
111
+ const metaColumns = Object.keys(meta)
112
+ .filter((el) => ['date', 'start', 'end', 'title', 'status'].includes(el) && columnList.includes(meta[el]))
113
+ .map((el) => `"${meta[el]}" as ${el}`);
114
+
115
+ if (!metaColumns?.length) {
116
+ return { message: `calendar param meta is invalid: invalid/empty keys`, status: 404 };
117
+ }
118
+
119
+ const q = `select ${metaColumns.join(',')} from ${table} where ${where}`;
120
+ if (query?.sql && user?.user_type?.includes('admin')) return q;
121
+
122
+ const { rows = [] } = await pg.query(q);
123
+
124
+ return { title, filters, granularity, sql: user?.user_type?.includes('admin') ? q : undefined, rows };
125
+
126
126
  }
@@ -1,7 +1,7 @@
1
- import calendarData from "./controllers/calendar.data.js";
2
-
3
- import { calendarDataSchema } from './schema.js';
4
-
5
- export default async function route(fastify) {
6
- fastify.get('/calendar/:name', { schema: calendarDataSchema }, calendarData);
7
- }
1
+ import calendarData from "./controllers/calendar.data.js";
2
+
3
+ import { calendarDataSchema } from './schema.js';
4
+
5
+ export default async function route(fastify) {
6
+ fastify.get('/calendar/:name', { schema: calendarDataSchema }, calendarData);
7
+ }
@@ -1,22 +1,22 @@
1
- const calendarDataSchema = {
2
- params: {
3
- name: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
4
- },
5
- querystring: {
6
- date: { type: 'string', pattern: '^\\d{4}-\\d{2}-\\d{2}$' },
7
- sql: { type: 'string', pattern: '^(\\d)$' },
8
- },
9
-
10
- // query: {
11
- // type: 'object',
12
- // properties: {
13
- // date: {
14
- // type: 'string',
15
- // format: 'date',
16
- // },
17
- // },
18
- // },
19
- };
20
-
21
- export { calendarDataSchema }
1
+ const calendarDataSchema = {
2
+ params: {
3
+ name: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
4
+ },
5
+ querystring: {
6
+ date: { type: 'string', pattern: '^\\d{4}-\\d{2}-\\d{2}$' },
7
+ sql: { type: 'string', pattern: '^(\\d)$' },
8
+ },
9
+
10
+ // query: {
11
+ // type: 'object',
12
+ // properties: {
13
+ // date: {
14
+ // type: 'string',
15
+ // format: 'date',
16
+ // },
17
+ // },
18
+ // },
19
+ };
20
+
21
+ export { calendarDataSchema }
22
22
  export default null;
@@ -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;