@opengis/admin 0.3.23 → 0.3.25

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 (203) hide show
  1. package/README.md +97 -97
  2. package/config.js +4 -4
  3. package/dist/{add-page-2cPkdIAC.js → add-page-BI4K8Lzk.js} +1 -1
  4. package/dist/{admin-interface-D9Dx7QqK.js → admin-interface-DDP6KpGO.js} +226 -226
  5. package/dist/{admin-view-C_Ecdip-.js → admin-view-C--DkpIG.js} +3 -3
  6. package/dist/admin.js +1 -1
  7. package/dist/admin.umd.cjs +48 -48
  8. package/dist/assets/logo.svg +41 -41
  9. package/dist/{card-view-MuS2Gqq6.js → card-view-CPwz8aJg.js} +1 -1
  10. package/dist/{edit-page-Dr397YuE.js → edit-page-BsDJ8lKP.js} +1 -1
  11. package/dist/{import-file-CcRnsq1s.js → import-file-B8gDejaq.js} +5459 -5452
  12. package/dist/{profile-page-BrKTAsqO.js → profile-page-C5UftUwo.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.roles.table/access.hbs +11 -11
  18. package/module/settings/card/admin.roles.table/general_info.hbs +9 -9
  19. package/module/settings/card/admin.roles.table/index.yml +22 -22
  20. package/module/settings/card/admin.roles.table/users.hbs +12 -12
  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 +15 -15
  24. package/module/settings/card/admin.routes.table/users.hbs +16 -16
  25. package/module/settings/card/admin.table_properties.table/custom_columns.hbs +22 -22
  26. package/module/settings/card/admin.table_properties.table/index.yml +12 -12
  27. package/module/settings/card/admin.table_properties.table/info.hbs +17 -17
  28. package/module/settings/card/admin.users.table/general_info.hbs +18 -18
  29. package/module/settings/card/admin.users.table/index.yml +20 -20
  30. package/module/settings/card/admin.users.table/last_login.hbs +17 -17
  31. package/module/settings/card/admin.users.table/logs.hbs +16 -16
  32. package/module/settings/card/admin.users.table/routes.hbs +13 -13
  33. package/module/settings/card/admin.users.table/user_roles.hbs +35 -35
  34. package/module/settings/cls/change_type.json +13 -13
  35. package/module/settings/cls/core.actions.json +17 -17
  36. package/module/settings/cls/core.column_type.json +14 -14
  37. package/module/settings/cls/core.scope.json +13 -13
  38. package/module/settings/cls/properties.site_status.json +13 -13
  39. package/module/settings/cls/properties.widget_status.json +13 -13
  40. package/module/settings/cls/users.user_type.json +13 -13
  41. package/module/settings/cls/yes_no.json +11 -11
  42. package/module/settings/form/admin.accounts.form.json +13 -13
  43. package/module/settings/form/admin.custom_column.form.json +55 -55
  44. package/module/settings/form/admin.properties.form.json +15 -15
  45. package/module/settings/form/admin.roles.form.json +21 -21
  46. package/module/settings/form/admin.routes.form.json +25 -25
  47. package/module/settings/form/admin.rules.form.json +30 -30
  48. package/module/settings/form/admin.table_properties.form.json +19 -19
  49. package/module/settings/form/admin.user_properties.form.json +15 -15
  50. package/module/settings/form/admin.user_roles.form.json +24 -24
  51. package/module/settings/form/admin.user_roles_card.form.json +13 -13
  52. package/module/settings/form/admin.users.form.json +177 -177
  53. package/module/settings/form/admin.users_edit.form.json +145 -145
  54. package/module/settings/form/context.account_grants.form.json +24 -24
  55. package/module/settings/form/context.account_users.form.json +12 -12
  56. package/module/settings/form/user.user_roles.form.json +13 -13
  57. package/module/settings/interface/admin.properties.json +4 -4
  58. package/module/settings/interface/admin.roles.json +4 -4
  59. package/module/settings/interface/admin.routes.json +4 -4
  60. package/module/settings/interface/admin.users.json +4 -4
  61. package/module/settings/menu.json +72 -72
  62. package/module/settings/select/core.routes.sql +1 -1
  63. package/module/settings/select/core.user_mentioned.sql +1 -1
  64. package/module/settings/select/core.user_uid.sql +1 -1
  65. package/module/settings/table/admin.accounts.table.json +49 -49
  66. package/module/settings/table/admin.custom_column.table.json +100 -100
  67. package/module/settings/table/admin.properties.table.json +39 -39
  68. package/module/settings/table/admin.roles.table.json +77 -77
  69. package/module/settings/table/admin.routes.table.json +73 -73
  70. package/module/settings/table/admin.rules.table.json +77 -77
  71. package/module/settings/table/admin.table_properties.table.json +37 -37
  72. package/module/settings/table/admin.user_properties.table.json +34 -34
  73. package/module/settings/table/admin.user_roles.table.json +74 -74
  74. package/module/settings/table/admin.users.table.json +135 -135
  75. package/module/settings/table/context.account_grants.table.json +88 -88
  76. package/module/settings/table/context.account_users.table.json +53 -53
  77. package/module/settings/table/log.table_changes.table.json +100 -100
  78. package/package.json +102 -102
  79. package/plugin.js +30 -30
  80. package/server/helpers/core/badge.js +16 -16
  81. package/server/helpers/core/buttonHelper.js +21 -21
  82. package/server/helpers/core/coalesce.js +7 -7
  83. package/server/helpers/core/select.js +48 -48
  84. package/server/helpers/core/token.js +18 -18
  85. package/server/helpers/index.js +40 -40
  86. package/server/helpers/list/buttonHelper.js +21 -21
  87. package/server/helpers/list/descriptionList.js +45 -45
  88. package/server/helpers/list/tableList.js +82 -82
  89. package/server/helpers/list/utils/button.js +5 -5
  90. package/server/helpers/list/utils/buttonDel.js +12 -12
  91. package/server/helpers/list/utils/buttonEdit.js +14 -14
  92. package/server/helpers/temp/contentList.js +58 -58
  93. package/server/helpers/temp/ifCond.js +101 -101
  94. package/server/helpers/utils/button.js +5 -5
  95. package/server/helpers/utils/buttonAdd.js +6 -6
  96. package/server/helpers/utils/buttonDel.js +6 -6
  97. package/server/helpers/utils/buttonEdit.js +5 -5
  98. package/server/helpers/utils/mdToHTML.js +17 -17
  99. package/server/helpers/utils/paddingNumber.js +3 -3
  100. package/server/plugins/access/funcs/getAdminAccess.js +12 -12
  101. package/server/plugins/access/index.mjs +6 -6
  102. package/server/plugins/adminHook.js +81 -81
  103. package/server/plugins/cron.js +10 -10
  104. package/server/plugins/docs.js +28 -28
  105. package/server/plugins/hook.js +276 -276
  106. package/server/plugins/vite.js +77 -77
  107. package/server/routes/access/controllers/access.group.js +29 -29
  108. package/server/routes/access/controllers/access.group.post.js +54 -54
  109. package/server/routes/access/controllers/access.interface.js +33 -33
  110. package/server/routes/access/index.mjs +11 -11
  111. package/server/routes/access/schema.mjs +67 -67
  112. package/server/routes/calendar/controllers/calendar.data.js +125 -125
  113. package/server/routes/calendar/index.mjs +7 -7
  114. package/server/routes/calendar/schema.js +21 -21
  115. package/server/routes/data/controllers/cardData.js +127 -127
  116. package/server/routes/data/controllers/cardTabData.js +49 -49
  117. package/server/routes/data/controllers/funcs/getFilterSQL/index.js +92 -92
  118. package/server/routes/data/controllers/funcs/getFilterSQL/util/formatValue.js +170 -170
  119. package/server/routes/data/controllers/funcs/getFilterSQL/util/getCustomQuery.js +13 -13
  120. package/server/routes/data/controllers/funcs/getFilterSQL/util/getFilterQuery.js +64 -64
  121. package/server/routes/data/controllers/funcs/getFilterSQL/util/getOptimizedQuery.js +12 -12
  122. package/server/routes/data/controllers/funcs/getFilterSQL/util/getTableSql.js +34 -34
  123. package/server/routes/data/controllers/tableData.js +31 -31
  124. package/server/routes/data/controllers/tableDataId.js +27 -27
  125. package/server/routes/data/controllers/tableFilter.js +9 -9
  126. package/server/routes/data/controllers/tableInfo.js +112 -112
  127. package/server/routes/data/controllers/tokenInfo.js +9 -9
  128. package/server/routes/data/controllers/utils/assignTokens.js +30 -30
  129. package/server/routes/data/controllers/utils/conditions.js +20 -20
  130. package/server/routes/data/controllers/utils/getColumns.js +8 -8
  131. package/server/routes/data/index.mjs +20 -20
  132. package/server/routes/data/schema.js +54 -54
  133. package/server/routes/dblist/controllers/readItems.js +20 -20
  134. package/server/routes/dblist/controllers/setItem.js +22 -22
  135. package/server/routes/dblist/index.mjs +18 -18
  136. package/server/routes/dblist/utils/formatData.js +7 -7
  137. package/server/routes/menu/controllers/getMenu.js +77 -77
  138. package/server/routes/menu/controllers/interfaces.js +20 -20
  139. package/server/routes/menu/index.mjs +7 -7
  140. package/server/routes/notifications/controllers/readNotifications.js +27 -27
  141. package/server/routes/notifications/controllers/testEmail.js +35 -35
  142. package/server/routes/notifications/controllers/userNotifications.js +53 -53
  143. package/server/routes/notifications/funcs/addNotification.js +21 -21
  144. package/server/routes/notifications/funcs/sendNotification.js +92 -92
  145. package/server/routes/notifications/hook/onWidgetSet.js +56 -56
  146. package/server/routes/notifications/index.mjs +26 -26
  147. package/server/routes/notifications/schema.js +16 -16
  148. package/server/routes/print/controllers/cardPrint.js +135 -135
  149. package/server/routes/print/controllers/printTemplate.add.js +37 -37
  150. package/server/routes/print/controllers/printTemplate.delete.js +29 -29
  151. package/server/routes/print/controllers/printTemplate.edit.js +42 -42
  152. package/server/routes/print/controllers/printTemplate.js +67 -67
  153. package/server/routes/print/controllers/printTemplateList.js +19 -19
  154. package/server/routes/print/controllers/printTemplatePreview.js +87 -87
  155. package/server/routes/print/index.mjs +19 -19
  156. package/server/routes/properties/controllers/admin.properties.get.js +31 -31
  157. package/server/routes/properties/controllers/table.properties.get.js +120 -120
  158. package/server/routes/properties/controllers/table.properties.post.js +115 -115
  159. package/server/routes/properties/controllers/user.properties.get.js +19 -19
  160. package/server/routes/properties/controllers/user.properties.post.js +10 -10
  161. package/server/routes/properties/index.mjs +21 -21
  162. package/server/routes/properties/schema.js +10 -10
  163. package/server/routes/properties/utils/dataInsert.js +26 -26
  164. package/server/routes/properties/utils/getColumnMetaData.js +17 -17
  165. package/server/routes/properties/utils/refreshData.js +128 -128
  166. package/server/routes/report/controllers/data.js +76 -76
  167. package/server/routes/report/controllers/list.js +18 -18
  168. package/server/routes/report/index.mjs +7 -7
  169. package/server/routes/report/utils/formatValue.js +179 -179
  170. package/server/routes/report/utils/getFilterQuery.js +67 -67
  171. package/server/routes/root.mjs +3 -3
  172. package/server/routes/templates/controllers/getTemplate.js +44 -44
  173. package/server/routes/templates/index.mjs +16 -16
  174. package/server/routes/templates/schema.js +8 -8
  175. package/server/routes/user/controllers/user.cls.id.js +14 -14
  176. package/server/routes/user/controllers/user.cls.js +72 -72
  177. package/server/routes/user/controllers/user.cls.post.js +54 -54
  178. package/server/routes/user/controllers/user.info.js +17 -17
  179. package/server/routes/user/schema.js +14 -14
  180. package/server/routes/util/controllers/code.generator.js +89 -89
  181. package/server/routes/util/index.mjs +5 -5
  182. package/server/routes/widget/controllers/widget.del.js +63 -63
  183. package/server/routes/widget/controllers/widget.get.js +125 -125
  184. package/server/routes/widget/controllers/widget.set.js +84 -84
  185. package/server/routes/widget/hook/onWidgetSet.js +12 -12
  186. package/server/routes/widget/index.mjs +16 -16
  187. package/server/routes/widget/schema.js +12 -12
  188. package/server/templates/cls/itree.recrzone_category.json +73 -73
  189. package/server/templates/cls/test.json +9 -9
  190. package/server/templates/form/admin.profile.form.json +31 -31
  191. package/server/templates/form/admin.user_cls.data.form.json +49 -49
  192. package/server/templates/form/admin.user_group_rel.form.json +21 -21
  193. package/server/templates/form/cp_building.form.json +32 -32
  194. package/server/templates/form/form-user-pass.json +10 -10
  195. package/server/templates/form/form-user_group.json +39 -39
  196. package/server/templates/form/form-users.json +156 -156
  197. package/server/templates/form/user_group_access.form.json +22 -22
  198. package/server/templates/pt/card-print.pt.hbs +245 -245
  199. package/server/templates/select/account_id.json +2 -2
  200. package/server/templates/table/gis.dataset.table.json +43 -43
  201. package/server/templates/table/management.user_group.table.json +112 -112
  202. package/server/templates/table/management.users.table.json +126 -126
  203. package/utils.js +26 -26
@@ -1,128 +1,128 @@
1
- import { randomUUID, createHash } from 'crypto';
2
-
3
- import { dataInsert, pgClients } from '@opengis/fastify-table/utils.js';
4
-
5
- function prepareResult(res) {
6
- const arr = (res.rows || (Array.isArray(res) ? res : Object.values(res || {})));
7
- return {
8
- command: 'INSERT',
9
- count: res?.rowCount || arr.filter((el) => el.command === 'INSERT')
10
- ?.map((el) => ({ result: 'success', count: el.rowCount }))
11
- ?.reduce((acc, curr) => acc + curr.count, 0),
12
- };
13
- }
14
-
15
- export default async function refreshData({
16
- pg = pgClients.client, entity, table, uid, data,
17
- }) {
18
- if (!['filter', 'column', 'customQuery', 'customColumn'].includes(entity)) {
19
- return { message: 'invalid params: entity', status: 400 };
20
- }
21
-
22
- const client = await pg.connect();
23
-
24
- /* getMeta support */
25
- client.options = pg.options;
26
- client.tlist = pg.tlist;
27
- client.pgType = pg.pgType;
28
- client.pk = pg.pk;
29
- client.relkinds = pg.relkinds;
30
-
31
- const result = {};
32
-
33
- try {
34
- await client.query('BEGIN');
35
-
36
- if (['filter', 'column'].includes(entity)) {
37
- data?.forEach((el) => Object.assign(el, { id: el.id || randomUUID() }));
38
- await client.query('delete from setting.property where object_id=$1 and property_entity=$2', [table, entity]);
39
-
40
- const res = await dataInsert({
41
- pg: client,
42
- table: 'setting.property',
43
- data: {
44
- property_entity: entity,
45
- object_id: table,
46
- property_json: JSON.stringify(data), // ?.replace(/'+/g, "'")?.replace(/'/g, "''")
47
- },
48
- uid,
49
- });
50
- Object.assign(result, res);
51
- }
52
-
53
- if (['customQuery'].includes(entity)) {
54
- await client.query('delete from setting.property where object_id=$1 and property_entity=$2', [table, entity]);
55
-
56
- const res = await Promise.all(data?.map(async (el) => dataInsert({
57
- pg: client,
58
- table: 'setting.property',
59
- data: {
60
- property_entity: entity,
61
- object_id: table,
62
- property_key: el.name,
63
- property_text: el.query,
64
- property_json: { disabled: el.disabled },
65
- },
66
- uid,
67
- })));
68
- Object.assign(result, res);
69
- }
70
-
71
- if (entity === 'customColumn') {
72
- const prefix = createHash('md5').update(table).digest('hex').substr(0, 10);
73
- const data1 = [];
74
-
75
- await Promise.all(data.map(async (el, index) => {
76
- const obj = {
77
- cf_id: `col_${prefix}_${index}`,
78
- cf_name: el.title || el.ua || el.name,
79
- cf_type: el.format || el.type,
80
- cf_default: el.default,
81
- cf_notnull: el.notnull,
82
- object_id: table,
83
- tablename: table,
84
- };
85
-
86
- data1.push({
87
- name: obj.cf_id,
88
- title: obj.cf_name,
89
- format: obj.cf_type,
90
- option: data[index]?.option,
91
- hidden: data[index]?.hidden,
92
- custom: true,
93
- });
94
-
95
- await dataInsert({
96
- pg: client,
97
- table: 'setting.custom_field',
98
- data: obj,
99
- uid,
100
- });
101
- }));
102
-
103
- await client.query('delete from setting.custom_field where $1 in (tablename, object_id)', [table]);
104
- await client.query('delete from setting.property where object_id=$1 and property_entity=$2', [table, entity]);
105
-
106
- const data2 = JSON.stringify(data1?.filter((value, index, array) => array.indexOf(value) === index)); // ?.replace(/'+/g, "'")?.replace(/'/g, "''")
107
- const res = await dataInsert({
108
- pg: client,
109
- table: 'setting.property',
110
- data: {
111
- property_entity: 'customColumn',
112
- object_id: table,
113
- property_json: data2,
114
- },
115
- uid,
116
- });
117
- Object.assign(result, res);
118
- }
119
- await client.query('COMMIT');
120
- return prepareResult(result);
121
- } catch (err) {
122
- await client.query('ROLLBACK');
123
- return { error: err.toString(), status: 500 };
124
- }
125
- finally {
126
- client.release();
127
- }
128
- };
1
+ import { randomUUID, createHash } from 'crypto';
2
+
3
+ import { dataInsert, pgClients } from '@opengis/fastify-table/utils.js';
4
+
5
+ function prepareResult(res) {
6
+ const arr = (res.rows || (Array.isArray(res) ? res : Object.values(res || {})));
7
+ return {
8
+ command: 'INSERT',
9
+ count: res?.rowCount || arr.filter((el) => el.command === 'INSERT')
10
+ ?.map((el) => ({ result: 'success', count: el.rowCount }))
11
+ ?.reduce((acc, curr) => acc + curr.count, 0),
12
+ };
13
+ }
14
+
15
+ export default async function refreshData({
16
+ pg = pgClients.client, entity, table, uid, data,
17
+ }) {
18
+ if (!['filter', 'column', 'customQuery', 'customColumn'].includes(entity)) {
19
+ return { message: 'invalid params: entity', status: 400 };
20
+ }
21
+
22
+ const client = await pg.connect();
23
+
24
+ /* getMeta support */
25
+ client.options = pg.options;
26
+ client.tlist = pg.tlist;
27
+ client.pgType = pg.pgType;
28
+ client.pk = pg.pk;
29
+ client.relkinds = pg.relkinds;
30
+
31
+ const result = {};
32
+
33
+ try {
34
+ await client.query('BEGIN');
35
+
36
+ if (['filter', 'column'].includes(entity)) {
37
+ data?.forEach((el) => Object.assign(el, { id: el.id || randomUUID() }));
38
+ await client.query('delete from setting.property where object_id=$1 and property_entity=$2', [table, entity]);
39
+
40
+ const res = await dataInsert({
41
+ pg: client,
42
+ table: 'setting.property',
43
+ data: {
44
+ property_entity: entity,
45
+ object_id: table,
46
+ property_json: JSON.stringify(data), // ?.replace(/'+/g, "'")?.replace(/'/g, "''")
47
+ },
48
+ uid,
49
+ });
50
+ Object.assign(result, res);
51
+ }
52
+
53
+ if (['customQuery'].includes(entity)) {
54
+ await client.query('delete from setting.property where object_id=$1 and property_entity=$2', [table, entity]);
55
+
56
+ const res = await Promise.all(data?.map(async (el) => dataInsert({
57
+ pg: client,
58
+ table: 'setting.property',
59
+ data: {
60
+ property_entity: entity,
61
+ object_id: table,
62
+ property_key: el.name,
63
+ property_text: el.query,
64
+ property_json: { disabled: el.disabled },
65
+ },
66
+ uid,
67
+ })));
68
+ Object.assign(result, res);
69
+ }
70
+
71
+ if (entity === 'customColumn') {
72
+ const prefix = createHash('md5').update(table).digest('hex').substr(0, 10);
73
+ const data1 = [];
74
+
75
+ await Promise.all(data.map(async (el, index) => {
76
+ const obj = {
77
+ cf_id: `col_${prefix}_${index}`,
78
+ cf_name: el.title || el.ua || el.name,
79
+ cf_type: el.format || el.type,
80
+ cf_default: el.default,
81
+ cf_notnull: el.notnull,
82
+ object_id: table,
83
+ tablename: table,
84
+ };
85
+
86
+ data1.push({
87
+ name: obj.cf_id,
88
+ title: obj.cf_name,
89
+ format: obj.cf_type,
90
+ option: data[index]?.option,
91
+ hidden: data[index]?.hidden,
92
+ custom: true,
93
+ });
94
+
95
+ await dataInsert({
96
+ pg: client,
97
+ table: 'setting.custom_field',
98
+ data: obj,
99
+ uid,
100
+ });
101
+ }));
102
+
103
+ await client.query('delete from setting.custom_field where $1 in (tablename, object_id)', [table]);
104
+ await client.query('delete from setting.property where object_id=$1 and property_entity=$2', [table, entity]);
105
+
106
+ const data2 = JSON.stringify(data1?.filter((value, index, array) => array.indexOf(value) === index)); // ?.replace(/'+/g, "'")?.replace(/'/g, "''")
107
+ const res = await dataInsert({
108
+ pg: client,
109
+ table: 'setting.property',
110
+ data: {
111
+ property_entity: 'customColumn',
112
+ object_id: table,
113
+ property_json: data2,
114
+ },
115
+ uid,
116
+ });
117
+ Object.assign(result, res);
118
+ }
119
+ await client.query('COMMIT');
120
+ return prepareResult(result);
121
+ } catch (err) {
122
+ await client.query('ROLLBACK');
123
+ return { error: err.toString(), status: 500 };
124
+ }
125
+ finally {
126
+ client.release();
127
+ }
128
+ };
@@ -1,76 +1,76 @@
1
- import { handlebars, pgClients, getTemplate, metaFormat, handlebarsSync } from '@opengis/fastify-table/utils.js';
2
-
3
- import getFilterQuery from '../utils/getFilterQuery.js';
4
-
5
- const maxLimit = 100;
6
-
7
- export default async function reportData({
8
- pg = pgClients.client, params = {}, query = {}, user = {},
9
- }) {
10
- if (!params?.name) {
11
- return { message: 'not enough params: name', status: 400 };
12
- }
13
-
14
- const loadTemplate = await getTemplate('report', params.name);
15
-
16
- if (!loadTemplate?.sql) {
17
- return { message: `report not found: ${params.name}`, status: 404 };
18
- }
19
-
20
- const { uid } = user;
21
-
22
- const { kpi, sql, meta, filters } = loadTemplate;
23
- const { date, columns: metaColumns } = meta || {};
24
-
25
- const granularity = query.granularity && date && false ? `date_trunc('${query.granularity}',${date})::date::text` : null;
26
- const groupby = [meta?.groupby, granularity].filter(el => el).join(',');
27
-
28
- const period = query.period && date ? `${date}=${query.period}` : null;
29
- const filter = [query.filter, period].filter(el => el).join(';');
30
-
31
- const limit = Math.min(maxLimit, +(query.limit || 20));
32
- const offset = query.page && query.page > 0 ? (query.page - 1) * limit : 0;
33
-
34
- const kpiColumns = kpi ? kpi?.map(el => `${el.sql || 'count(*)'} as "${el.name}"`)?.join(',') : '';
35
- const columnsList = metaColumns || loadTemplate.columns?.map(el => el.name)?.join(',');
36
-
37
- const qMeta = await handlebars.compile(sql)({ user, uid });
38
- const { fields = [] } = await pg.query(`select * from (${qMeta})q limit 0`);
39
-
40
- const where = filter ? getFilterQuery({ pg, filter, fields, filterList: filters })?.map?.(el => el.query)?.join(' and ') : null;
41
-
42
- const qAgg = `select ${kpiColumns || ''} from (${qMeta})q where ${where || '1=1'}`;
43
- const q = `select ${columnsList || '*'} from (${qMeta})q where ${where || '1=1'} ${groupby ? `group by ${groupby}` : ''} limit ${limit} offset ${offset}`;
44
-
45
- if (query.sql && user?.user_type?.includes('admin')) return `${qAgg};${q}`;
46
-
47
- const kpiData = await pg.query(qAgg).then(el => el.rows?.[0] || {});
48
- kpi?.forEach(el => Object.assign(el, { count: kpiData[el.name] || '0' }));
49
-
50
- const { rows = [] } = await pg.query(q);
51
-
52
- const cls = meta?.cls || loadTemplate.columns
53
- ?.filter(el => (el.option || el.data))
54
- ?.reduce((acc, curr) => Object.assign(acc, { [curr.name]: (curr.option || curr.data) }), {});
55
-
56
- const titles = meta?.titles
57
- || loadTemplate.columns?.reduce((acc, curr) => Object.assign(acc, { [curr.name]: curr.title }), {});
58
-
59
- await metaFormat({ rows, cls, sufix: true });
60
-
61
- const columns = loadTemplate.columns
62
- || fields.map(el => ({
63
- name: el.name,
64
- title: titles?.[el.name] || el.name,
65
- type: cls?.[el.name] ? 'Autocomplete' : 'Text',
66
- format: pg.pgType?.[el.dataTypeID],
67
- data: cls?.[el.name],
68
- }));
69
-
70
- return {
71
- q: user?.user_type?.includes('admin') ? q : undefined,
72
- kpi,
73
- rows,
74
- columns,
75
- };
76
- }
1
+ import { handlebars, pgClients, getTemplate, metaFormat, handlebarsSync } from '@opengis/fastify-table/utils.js';
2
+
3
+ import getFilterQuery from '../utils/getFilterQuery.js';
4
+
5
+ const maxLimit = 100;
6
+
7
+ export default async function reportData({
8
+ pg = pgClients.client, params = {}, query = {}, user = {},
9
+ }) {
10
+ if (!params?.name) {
11
+ return { message: 'not enough params: name', status: 400 };
12
+ }
13
+
14
+ const loadTemplate = await getTemplate('report', params.name);
15
+
16
+ if (!loadTemplate?.sql) {
17
+ return { message: `report not found: ${params.name}`, status: 404 };
18
+ }
19
+
20
+ const { uid } = user;
21
+
22
+ const { kpi, sql, meta, filters } = loadTemplate;
23
+ const { date, columns: metaColumns } = meta || {};
24
+
25
+ const granularity = query.granularity && date && false ? `date_trunc('${query.granularity}',${date})::date::text` : null;
26
+ const groupby = [meta?.groupby, granularity].filter(el => el).join(',');
27
+
28
+ const period = query.period && date ? `${date}=${query.period}` : null;
29
+ const filter = [query.filter, period].filter(el => el).join(';');
30
+
31
+ const limit = Math.min(maxLimit, +(query.limit || 20));
32
+ const offset = query.page && query.page > 0 ? (query.page - 1) * limit : 0;
33
+
34
+ const kpiColumns = kpi ? kpi?.map(el => `${el.sql || 'count(*)'} as "${el.name}"`)?.join(',') : '';
35
+ const columnsList = metaColumns || loadTemplate.columns?.map(el => el.name)?.join(',');
36
+
37
+ const qMeta = await handlebars.compile(sql)({ user, uid });
38
+ const { fields = [] } = await pg.query(`select * from (${qMeta})q limit 0`);
39
+
40
+ const where = filter ? getFilterQuery({ pg, filter, fields, filterList: filters })?.map?.(el => el.query)?.join(' and ') : null;
41
+
42
+ const qAgg = `select ${kpiColumns || ''} from (${qMeta})q where ${where || '1=1'}`;
43
+ const q = `select ${columnsList || '*'} from (${qMeta})q where ${where || '1=1'} ${groupby ? `group by ${groupby}` : ''} limit ${limit} offset ${offset}`;
44
+
45
+ if (query.sql && user?.user_type?.includes('admin')) return `${qAgg};${q}`;
46
+
47
+ const kpiData = await pg.query(qAgg).then(el => el.rows?.[0] || {});
48
+ kpi?.forEach(el => Object.assign(el, { count: kpiData[el.name] || '0' }));
49
+
50
+ const { rows = [] } = await pg.query(q);
51
+
52
+ const cls = meta?.cls || loadTemplate.columns
53
+ ?.filter(el => (el.option || el.data))
54
+ ?.reduce((acc, curr) => Object.assign(acc, { [curr.name]: (curr.option || curr.data) }), {});
55
+
56
+ const titles = meta?.titles
57
+ || loadTemplate.columns?.reduce((acc, curr) => Object.assign(acc, { [curr.name]: curr.title }), {});
58
+
59
+ await metaFormat({ rows, cls, sufix: true });
60
+
61
+ const columns = loadTemplate.columns
62
+ || fields.map(el => ({
63
+ name: el.name,
64
+ title: titles?.[el.name] || el.name,
65
+ type: cls?.[el.name] ? 'Autocomplete' : 'Text',
66
+ format: pg.pgType?.[el.dataTypeID],
67
+ data: cls?.[el.name],
68
+ }));
69
+
70
+ return {
71
+ q: user?.user_type?.includes('admin') ? q : undefined,
72
+ kpi,
73
+ rows,
74
+ columns,
75
+ };
76
+ }
@@ -1,18 +1,18 @@
1
- import { getTemplatePath, getTemplate } from '@opengis/fastify-table/utils.js';
2
-
3
- export default async function reportList({
4
- user = {},
5
- }) {
6
- const arr = getTemplatePath('report').filter(el => el[2] === 'json').map(el => el[0]);
7
-
8
- const rows = await Promise.all(arr.map(async (el) => {
9
- const loadTemplate = await getTemplate('report', el);
10
- return {
11
- name: el,
12
- filters: loadTemplate?.filters || [],
13
- title: loadTemplate?.title || el,
14
- sql: user.user_type?.includes('admin') ? loadTemplate?.sql : undefined,
15
- };
16
- }));
17
- return { rows };
18
- }
1
+ import { getTemplatePath, getTemplate } from '@opengis/fastify-table/utils.js';
2
+
3
+ export default async function reportList({
4
+ user = {},
5
+ }) {
6
+ const arr = getTemplatePath('report').filter(el => el[2] === 'json').map(el => el[0]);
7
+
8
+ const rows = await Promise.all(arr.map(async (el) => {
9
+ const loadTemplate = await getTemplate('report', el);
10
+ return {
11
+ name: el,
12
+ filters: loadTemplate?.filters || [],
13
+ title: loadTemplate?.title || el,
14
+ sql: user.user_type?.includes('admin') ? loadTemplate?.sql : undefined,
15
+ };
16
+ }));
17
+ return { rows };
18
+ }
@@ -1,7 +1,7 @@
1
- import reportData from './controllers/data.js';
2
- import reportList from './controllers/list.js';
3
-
4
- export default async function route(app) {
5
- app.get('/reports', {}, reportList);
6
- app.get('/reports/:name', {}, reportData);
7
- }
1
+ import reportData from './controllers/data.js';
2
+ import reportList from './controllers/list.js';
3
+
4
+ export default async function route(app) {
5
+ app.get('/reports', {}, reportList);
6
+ app.get('/reports/:name', {}, reportData);
7
+ }