@opengis/gis 0.2.176 → 0.2.178

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 (164) hide show
  1. package/README.md +181 -181
  2. package/dist/{CardIcon-c1Q2M3wQ.js → CardIcon-CMRD1LLh.js} +1 -1
  3. package/dist/{EntityTablePage-B5gpkH4S.js → EntityTablePage-XNNCltAN.js} +2 -2
  4. package/dist/{ExtentOutlineLayer.vue_vue_type_script_setup_true_lang-DnGSvmMU.js → ExtentOutlineLayer.vue_vue_type_script_setup_true_lang-BqUjKTDY.js} +1 -1
  5. package/dist/{HeaderActions.vue_vue_type_script_setup_true_lang-C2B61JP6.js → HeaderActions.vue_vue_type_script_setup_true_lang-BXQ3hKwa.js} +1 -1
  6. package/dist/{MapSettings-6-Xru5Q8.js → MapSettings-P3h-vHn3.js} +2 -2
  7. package/dist/{RastersTablePage-CXNOcTy-.js → RastersTablePage-DnhGZLiH.js} +2 -2
  8. package/dist/{cartocss-BFVqWvfP.js → cartocss-BkrOeQg4.js} +6 -6
  9. package/dist/{import-utils-uxk4LdUJ.js → import-utils-BCATsbB5.js} +1 -1
  10. package/dist/{index-CahlV-Xs.js → index-cUagVqgA.js} +39 -39
  11. package/dist/index.css +1 -1
  12. package/dist/index.js +1 -1
  13. package/dist/index.umd.cjs +5 -5
  14. package/dist/{raster-CEi56f0P.js → raster-CP0tUp3j.js} +3 -3
  15. package/dist/{register-NFAGBNa3.js → register-Cr-uQcby.js} +3 -3
  16. package/dist/{service-BYspag8U.js → service-DwJaKrOd.js} +6 -6
  17. package/dist/{vs-datatable-CHcBr6zy.js → vs-datatable-B9WoVk-b.js} +2 -2
  18. package/module/gis/cls/service_type.json +42 -42
  19. package/module/gis/form/gis.registers.form.json +127 -127
  20. package/module/test/map/addr.json +302 -302
  21. package/module/test/map/addr1.yml +23 -23
  22. package/module/test/select/address.str_id.sql +3 -3
  23. package/package.json +77 -77
  24. package/plugin.js +64 -64
  25. package/server/migrations/array_intersect.sql +13 -13
  26. package/server/migrations/cartocss.sql +27 -27
  27. package/server/migrations/group_list.sql +74 -74
  28. package/server/migrations/maps.sql +30 -30
  29. package/server/migrations/metadata.sql +415 -415
  30. package/server/migrations/ogc.sql +106 -106
  31. package/server/migrations/rasters.sql +265 -265
  32. package/server/migrations/services.sql +247 -247
  33. package/server/migrations/services_users_rel.sql +22 -22
  34. package/server/migrations/widgets.sql +20 -20
  35. package/server/plugins/crons.js +21 -21
  36. package/server/plugins/mapnik/funcs/checkRasterFile.js +107 -107
  37. package/server/plugins/mapnik/funcs/mapnik.js +151 -151
  38. package/server/plugins/mapnik/funcs/rootFolder.mjs +8 -8
  39. package/server/plugins/mapnik/map.proto +437 -437
  40. package/server/plugins/vite.js +74 -74
  41. package/server/routes/cartocss/cartocss.route.js +31 -31
  42. package/server/routes/cartocss/cartocss.route.test.js +78 -78
  43. package/server/routes/cartocss/cartocss.schema.js +73 -73
  44. package/server/routes/cartocss/functions/add.cartocss.js +39 -39
  45. package/server/routes/cartocss/functions/get.cartocss.js +57 -57
  46. package/server/routes/gis/functions/checkXML.js +107 -107
  47. package/server/routes/gis/functions/dashboard.js +24 -24
  48. package/server/routes/gis/gis.route.js +26 -26
  49. package/server/routes/gis/gis.route.test.js +33 -33
  50. package/server/routes/map/functions/clearTiles.js +35 -35
  51. package/server/routes/map/functions/geojson.js +187 -187
  52. package/server/routes/map/functions/gis.convert.js +65 -65
  53. package/server/routes/map/functions/gis.icon.js +220 -220
  54. package/server/routes/map/functions/jsonData.js +206 -206
  55. package/server/routes/map/functions/layerList.js +102 -102
  56. package/server/routes/map/functions/map.js +122 -122
  57. package/server/routes/map/functions/mapCatalog.js +72 -72
  58. package/server/routes/map/functions/mapCatalogAttribute.js +53 -53
  59. package/server/routes/map/functions/mapFeatures.js +133 -133
  60. package/server/routes/map/functions/mapFormat.js +232 -232
  61. package/server/routes/map/functions/mapTiles.js +162 -162
  62. package/server/routes/map/functions/maps.js +15 -15
  63. package/server/routes/map/functions/marker_icon.js +43 -43
  64. package/server/routes/map/functions/parseGeoFile.js +85 -85
  65. package/server/routes/map/functions/pointHeight.js +51 -51
  66. package/server/routes/map/functions/vtile.js +174 -174
  67. package/server/routes/map/functions/vtile1.js +185 -185
  68. package/server/routes/map/map.route.js +280 -280
  69. package/server/routes/map/map.route.test.js +503 -503
  70. package/server/routes/map/map.schema.js +356 -356
  71. package/server/routes/map/pin/circle1.svg +76 -76
  72. package/server/routes/map/pin/circle2.svg +18 -18
  73. package/server/routes/map/pin/none.svg +12 -12
  74. package/server/routes/map/pin/pin.svg +14 -14
  75. package/server/routes/map/pin/pin1.svg +16 -16
  76. package/server/routes/map/pin/pin2.svg +7 -7
  77. package/server/routes/map/pin/pin3.svg +34 -34
  78. package/server/routes/map/pin/pin4.svg +14 -14
  79. package/server/routes/map/pin/pin5.svg +7 -7
  80. package/server/routes/map/pin/pin6.svg +12 -12
  81. package/server/routes/map/pin/pin7.svg +12 -12
  82. package/server/routes/mapnik/functions/cartoBounds.js +32 -32
  83. package/server/routes/mapnik/functions/clearTiles.js +103 -103
  84. package/server/routes/mapnik/functions/convertBoundToTile.js +27 -27
  85. package/server/routes/mapnik/functions/createXml.js +76 -76
  86. package/server/routes/mapnik/functions/createXmlMulti.js +72 -72
  87. package/server/routes/mapnik/functions/fileSearch.js +35 -35
  88. package/server/routes/mapnik/functions/fileStat.js +28 -28
  89. package/server/routes/mapnik/functions/pretile.js +138 -138
  90. package/server/routes/mapnik/functions/rasterInfo.js +66 -66
  91. package/server/routes/mapnik/functions/readDir.js +22 -22
  92. package/server/routes/mapnik/functions/rtile.js +164 -164
  93. package/server/routes/mapnik/functions/uploadRaster.js +152 -152
  94. package/server/routes/mapnik/functions/uploadXML.js +140 -140
  95. package/server/routes/mapnik/mapnik.route.js +102 -102
  96. package/server/routes/mapnik/mapnik.route.test.js +370 -370
  97. package/server/routes/mapnik/mapnik.schema.mjs +195 -195
  98. package/server/routes/mapnik.prefixless/functions/mapnikLogger.js +31 -31
  99. package/server/routes/mapnik.prefixless/functions/mapnikStat.js +21 -21
  100. package/server/routes/mapnik.prefixless/mapnik.prefixless.route.js +20 -20
  101. package/server/routes/mapnik.prefixless/mapnik.prefixless.route.test.js +91 -91
  102. package/server/routes/mapnik.prefixless/mapnik.prefixless.schema.mjs +27 -27
  103. package/server/routes/maps/functions/add.map.js +42 -42
  104. package/server/routes/maps/functions/del.map.js +17 -17
  105. package/server/routes/maps/functions/get.map.js +119 -119
  106. package/server/routes/maps/maps.route.js +58 -58
  107. package/server/routes/maps/maps.route.test.js +231 -231
  108. package/server/routes/maps/maps.schema.js +9 -9
  109. package/server/routes/metadata/functions/editMetadata.js +35 -35
  110. package/server/routes/metadata/functions/metadataXML.js +19 -19
  111. package/server/routes/metadata/metadata.route.js +26 -26
  112. package/server/routes/metadata/metadata.route.test.js +46 -46
  113. package/server/routes/metadata/metadata.schema.js +53 -53
  114. package/server/routes/ogc/functions/map.info.point.js +117 -117
  115. package/server/routes/ogc/ogc.route.js +21 -21
  116. package/server/routes/ogc/ogc.route.test.js +53 -53
  117. package/server/routes/ogc/ogc.schema.js +16 -16
  118. package/server/routes/permissions/functions/catalog.permissions.edit.js +20 -20
  119. package/server/routes/permissions/functions/catalog.permissions.js +12 -12
  120. package/server/routes/permissions/functions/get.permissions.js +59 -59
  121. package/server/routes/permissions/functions/gis.catalog.js +80 -80
  122. package/server/routes/permissions/permissions.route.js +35 -35
  123. package/server/routes/permissions/permissions.route.test.js +35 -35
  124. package/server/routes/permissions/permissions.schema.js +43 -43
  125. package/server/routes/registers/functions/add.registry.js +37 -37
  126. package/server/routes/registers/functions/classifiers.js +100 -100
  127. package/server/routes/registers/functions/columns.js +3 -3
  128. package/server/routes/registers/functions/content.type.js +9 -9
  129. package/server/routes/registers/functions/del.registry.js +14 -14
  130. package/server/routes/registers/functions/get.info.js +93 -93
  131. package/server/routes/registers/functions/getFilterSQLParametrized/formatValue.js +312 -0
  132. package/server/routes/registers/functions/getFilterSQLParametrized/getFilterQuery.js +126 -0
  133. package/server/routes/registers/functions/getFilterSQLParametrized/getRangeQuery.js +353 -0
  134. package/server/routes/registers/functions/getFilterSQLParametrized/index.js +81 -0
  135. package/server/routes/registers/functions/getTableColumnMeta.js +125 -0
  136. package/server/routes/registers/functions/gis.export.js +159 -159
  137. package/server/routes/registers/functions/gis.registry.js +71 -71
  138. package/server/routes/registers/functions/gis.registry.list.js +61 -61
  139. package/server/routes/registers/functions/gis.suggest.js +275 -0
  140. package/server/routes/registers/functions/handleRegistryRequest.js +175 -147
  141. package/server/routes/registers/functions/map.registry.js +87 -87
  142. package/server/routes/registers/registers.route.js +91 -80
  143. package/server/routes/registers/registers.route.test.js +173 -144
  144. package/server/routes/registers/registers.schema.js +275 -246
  145. package/server/routes/root.mjs +3 -3
  146. package/server/routes/services/functions/add.service.js +62 -62
  147. package/server/routes/services/functions/create.route.js +93 -93
  148. package/server/routes/services/functions/del.service.js +12 -12
  149. package/server/routes/services/functions/get.layer.geom.js +27 -27
  150. package/server/routes/services/functions/get.service.users.js +76 -76
  151. package/server/routes/services/functions/get.services.col.js +34 -34
  152. package/server/routes/services/functions/get.services.js +89 -89
  153. package/server/routes/services/functions/legend.auto.js +77 -77
  154. package/server/routes/services/services.route.js +76 -76
  155. package/server/routes/services/services.route.test.js +167 -167
  156. package/server/routes/services/services.schema.js +285 -278
  157. package/server/routes/widgets/functions/add.widget.js +38 -38
  158. package/server/routes/widgets/functions/del.widget.js +17 -17
  159. package/server/routes/widgets/functions/get.widget.js +41 -41
  160. package/server/routes/widgets/widgets.route.js +61 -61
  161. package/server/routes/widgets/widgets.route.test.js +144 -144
  162. package/server/routes/widgets/widgets.schema.js +24 -24
  163. package/server/shared/listFiles.js +14 -14
  164. package/utils.js +13 -13
@@ -1,44 +1,44 @@
1
- export const getCatalogPermissionsSchema = {
2
- params: {
3
- type: 'object',
4
- required: ['uid'],
5
- properties: {
6
- uid: {
7
- type: 'string', pattern: '^([\\d\\w._-]+)$'
8
- },
9
- },
10
- },
11
- };
12
-
13
- export const editCatalogPermissionsSchema = {
14
- params: {
15
- type: 'object',
16
- required: ['uid'],
17
- properties: {
18
- uid: {
19
- type: 'string', pattern: '^([\\d\\w._-]+)$'
20
- },
21
- },
22
- },
23
- body: {
24
- type: 'array',
25
- items: {
26
- type: 'object',
27
- required: ['service_id', 'actions'],
28
- properties: {
29
- service_id: {
30
- type: 'string', pattern: '^([\\d\\w._-]+)$'
31
- },
32
- actions: {
33
- type: 'array',
34
- items: {
35
- type: 'string',
36
- enum: ['view', 'edit', 'add', 'del']
37
- }
38
- }
39
- }
40
- }
41
- }
42
- };
43
-
1
+ export const getCatalogPermissionsSchema = {
2
+ params: {
3
+ type: 'object',
4
+ required: ['uid'],
5
+ properties: {
6
+ uid: {
7
+ type: 'string', pattern: '^([\\d\\w._-]+)$'
8
+ },
9
+ },
10
+ },
11
+ };
12
+
13
+ export const editCatalogPermissionsSchema = {
14
+ params: {
15
+ type: 'object',
16
+ required: ['uid'],
17
+ properties: {
18
+ uid: {
19
+ type: 'string', pattern: '^([\\d\\w._-]+)$'
20
+ },
21
+ },
22
+ },
23
+ body: {
24
+ type: 'array',
25
+ items: {
26
+ type: 'object',
27
+ required: ['service_id', 'actions'],
28
+ properties: {
29
+ service_id: {
30
+ type: 'string', pattern: '^([\\d\\w._-]+)$'
31
+ },
32
+ actions: {
33
+ type: 'array',
34
+ items: {
35
+ type: 'string',
36
+ enum: ['view', 'edit', 'add', 'del']
37
+ }
38
+ }
39
+ }
40
+ }
41
+ }
42
+ };
43
+
44
44
  export default null;
@@ -1,37 +1,37 @@
1
- import { dataInsert, dataUpdate, pgClients } from "@opengis/fastify-table/utils.js";
2
- import { BadRequestError } from "@opengis/fastify-table/errors.js";
3
-
4
- export default async function addGisRegistry({
5
- method, body, slug, uid,
6
- }, pg = pgClients.client) {
7
- if (method === 'POST' && !body?.register_key) {
8
- throw BadRequestError('not enough body params: register_key');
9
- }
10
-
11
- if (method === 'POST') {
12
- const res = await dataInsert({
13
- pg,
14
- id: slug,
15
- table: 'gis.registers',
16
- data: body,
17
- uid,
18
- });
19
- return res.data;
20
- }
21
-
22
- if (!slug) {
23
- throw BadRequestError('not enough params: slug');
24
- }
25
-
26
- const id = await pg.query('select register_id from gis.registers where register_key=$1', [slug]).then(r => r.rows?.[0]?.register_id) || slug;
27
-
28
- const row = await dataUpdate({
29
- pg,
30
- id,
31
- table: 'gis.registers',
32
- data: body,
33
- uid,
34
- });
35
-
36
- return row;
37
- }
1
+ import { dataInsert, dataUpdate, pgClients } from "@opengis/fastify-table/utils.js";
2
+ import { BadRequestError } from "@opengis/fastify-table/errors.js";
3
+
4
+ export default async function addGisRegistry({
5
+ method, body, slug, uid,
6
+ }, pg = pgClients.client) {
7
+ if (method === 'POST' && !body?.register_key) {
8
+ throw BadRequestError('not enough body params: register_key');
9
+ }
10
+
11
+ if (method === 'POST') {
12
+ const res = await dataInsert({
13
+ pg,
14
+ id: slug,
15
+ table: 'gis.registers',
16
+ data: body,
17
+ uid,
18
+ });
19
+ return res.data;
20
+ }
21
+
22
+ if (!slug) {
23
+ throw BadRequestError('not enough params: slug');
24
+ }
25
+
26
+ const id = await pg.query('select register_id from gis.registers where register_key=$1', [slug]).then(r => r.rows?.[0]?.register_id) || slug;
27
+
28
+ const row = await dataUpdate({
29
+ pg,
30
+ id,
31
+ table: 'gis.registers',
32
+ data: body,
33
+ uid,
34
+ });
35
+
36
+ return row;
37
+ }
@@ -1,101 +1,101 @@
1
- import { getSelectVal, getSelect, getTemplates } from '@opengis/fastify-table/utils.js';
2
-
3
- export async function attachClassifiers(rowOrRows, classifiers, table) {
4
- const rows = Array.isArray(rowOrRows) ? rowOrRows : [rowOrRows];
5
-
6
- const list = getTemplates(['cls', 'select']);
7
-
8
- // classifiers as object
9
- if (table) {
10
- await Promise.all(rows.map(async row => {
11
- await Promise.all(Object.keys(row).filter(key => classifiers?.[key] || list.map(el => el[0]).includes(`${table}.${key}`) || list.map(el => el[0]).includes(key)).map(async key => {
12
- const clsAsColumn = list.map(el => el[0]).includes(key);
13
- const arr = await getSelectVal({ name: classifiers?.[key] || (clsAsColumn ? key : `${table}.${key}`), values: [row[key]], ar: true });
14
- const val = arr?.find?.(el => el.id && el.id.toString() === row[key].toString());
15
- if (val?.text) { row[`${key}_data`] = val; }
16
- row[key] = val?.text || val || row[key]; // for frontend
17
- row[`${key}_text`] = val?.text || val || row[key]; // legacy?
18
- }));
19
- }));
20
- return rowOrRows;
21
- }
22
-
23
- // classifiers as array of objects
24
- await Promise.all(rows.map(async row => {
25
- (classifiers || []).filter(item => item.classifier && item.name && row[item.name]).map(async ({ name, classifier }) => {
26
- const arr = await getSelectVal({ name: classifier, values: [row[name]], ar: true });
27
- const val = arr?.find?.(el => el.id === row[name]);
28
- if (val?.text) { row[`${name}_data`] = val; }
29
- row[name] = val?.text || val || row[name]; // for frontend
30
- row[`${name}_text`] = val?.text || val || row[name]; // legacy?
31
- });
32
- }));
33
-
34
- /* for (const row of rows) {
35
- for (const { name, classifier } of classifiers) {
36
- const value = row[name];
37
- if (value != null && classifier) {
38
-
39
- const match = await getSelectVal({ name: classifier, values: [value] });
40
- const matchVal = Object.values(match)?.[0]
41
-
42
- if (typeof matchVal === 'object' && matchVal !== null) {
43
- row[`${name}_data`] = matchVal;
44
- } else if (
45
- typeof matchVal === 'string' && matchVal !== null
46
- ) {
47
- row[`${name}_text`] = matchVal;
48
- };
49
-
50
- }
51
- }
52
- } */
53
-
54
- return rowOrRows;
55
- }
56
-
57
- export async function populateFilterOptions({ pg, table, filters, columns, whereConditions, args = [] }) {
58
- if (!filters?.length || !table || !columns?.length) return;
59
-
60
- const optimizedSQL = `select * from ${table} where ${whereConditions || '1=1'}`;
61
-
62
- await Promise.all(
63
- filters
64
- .filter(
65
- (el) =>
66
- el.id &&
67
- el.type !== "Autocomplete" &&
68
- !el.sql &&
69
- !el.options?.find?.((item) => item.sql)
70
- )
71
- .map(async (el) => {
72
- const cls = el.data ? await getSelect(el.data, pg) : null;
73
-
74
- if (!cls && !el.type?.includes?.("Check")) return;
75
- const { dataTypeID } = (columns || []).find((item) => item.name === el.id) || {};
76
-
77
- const q = pg.pgType[dataTypeID || '']?.includes("[]")
78
- ? `select unnest(${el.id})::text as id,count(*) from (${optimizedSQL})q group by unnest(${el.id}) limit 100`
79
- : `select ${el.id}::text as id,count(*) from (${optimizedSQL})q group by ${el.id} limit 100`;
80
-
81
- const countArr = await pg.queryCache(q, { args, table });
82
-
83
- if (countArr.timeout) {
84
- Object.assign(el, { timeout: countArr.timeout });
85
- console.warn("timeout filter", table, el.id);
86
- }
87
-
88
- const ids = countArr.rows.map((el1) => el1.id);
89
-
90
- const clsData = await getSelectVal({ pg, values: ids, name: el.data });
91
-
92
- const options = countArr.rows.map((cel) => {
93
- const data = cls?.arr?.find?.(
94
- (c) => c.id?.toString?.() === cel.id?.toString?.()
95
- ) || { text: clsData?.[cel.id]?.text || clsData?.[cel.id] || cel.id };
96
- return { ...cel, id: cel.id === null ? "null" : cel.id, ...data };
97
- });
98
- Object.assign(el, { options });
99
- })
100
- );
1
+ import { getSelectVal, getSelect, getTemplates } from '@opengis/fastify-table/utils.js';
2
+
3
+ export async function attachClassifiers(rowOrRows, classifiers, table) {
4
+ const rows = Array.isArray(rowOrRows) ? rowOrRows : [rowOrRows];
5
+
6
+ const list = getTemplates(['cls', 'select']);
7
+
8
+ // classifiers as object
9
+ if (table) {
10
+ await Promise.all(rows.map(async row => {
11
+ await Promise.all(Object.keys(row).filter(key => classifiers?.[key] || list.map(el => el[0]).includes(`${table}.${key}`) || list.map(el => el[0]).includes(key)).map(async key => {
12
+ const clsAsColumn = list.map(el => el[0]).includes(key);
13
+ const arr = await getSelectVal({ name: classifiers?.[key] || (clsAsColumn ? key : `${table}.${key}`), values: [row[key]], ar: true });
14
+ const val = arr?.find?.(el => el.id && el.id.toString() === row[key].toString());
15
+ if (val?.text) { row[`${key}_data`] = val; }
16
+ row[key] = val?.text || val || row[key]; // for frontend
17
+ row[`${key}_text`] = val?.text || val || row[key]; // legacy?
18
+ }));
19
+ }));
20
+ return rowOrRows;
21
+ }
22
+
23
+ // classifiers as array of objects
24
+ await Promise.all(rows.map(async row => {
25
+ (classifiers || []).filter(item => item.classifier && item.name && row[item.name]).map(async ({ name, classifier }) => {
26
+ const arr = await getSelectVal({ name: classifier, values: [row[name]], ar: true });
27
+ const val = arr?.find?.(el => el.id === row[name]);
28
+ if (val?.text) { row[`${name}_data`] = val; }
29
+ row[name] = val?.text || val || row[name]; // for frontend
30
+ row[`${name}_text`] = val?.text || val || row[name]; // legacy?
31
+ });
32
+ }));
33
+
34
+ /* for (const row of rows) {
35
+ for (const { name, classifier } of classifiers) {
36
+ const value = row[name];
37
+ if (value != null && classifier) {
38
+
39
+ const match = await getSelectVal({ name: classifier, values: [value] });
40
+ const matchVal = Object.values(match)?.[0]
41
+
42
+ if (typeof matchVal === 'object' && matchVal !== null) {
43
+ row[`${name}_data`] = matchVal;
44
+ } else if (
45
+ typeof matchVal === 'string' && matchVal !== null
46
+ ) {
47
+ row[`${name}_text`] = matchVal;
48
+ };
49
+
50
+ }
51
+ }
52
+ } */
53
+
54
+ return rowOrRows;
55
+ }
56
+
57
+ export async function populateFilterOptions({ pg, table, filters, columns, whereConditions, args = [] }) {
58
+ if (!filters?.length || !table || !columns?.length) return;
59
+
60
+ const optimizedSQL = `select * from ${table} where ${whereConditions || '1=1'}`;
61
+
62
+ await Promise.all(
63
+ filters
64
+ .filter(
65
+ (el) =>
66
+ el.id &&
67
+ el.type !== "Autocomplete" &&
68
+ !el.sql &&
69
+ !el.options?.find?.((item) => item.sql)
70
+ )
71
+ .map(async (el) => {
72
+ const cls = el.data ? await getSelect(el.data, pg) : null;
73
+
74
+ if (!cls && !el.type?.includes?.("Check")) return;
75
+ const { dataTypeID } = (columns || []).find((item) => item.name === el.id) || {};
76
+
77
+ const q = pg.pgType[dataTypeID || '']?.includes("[]")
78
+ ? `select unnest(${el.id})::text as id,count(*) from (${optimizedSQL})q group by unnest(${el.id}) limit 100`
79
+ : `select ${el.id}::text as id,count(*) from (${optimizedSQL})q group by ${el.id} limit 100`;
80
+
81
+ const countArr = await pg.queryCache(q, { args, table });
82
+
83
+ if (countArr.timeout) {
84
+ Object.assign(el, { timeout: countArr.timeout });
85
+ console.warn("timeout filter", table, el.id);
86
+ }
87
+
88
+ const ids = countArr.rows.map((el1) => el1.id);
89
+
90
+ const clsData = await getSelectVal({ pg, values: ids, name: el.data });
91
+
92
+ const options = countArr.rows.map((cel) => {
93
+ const data = cls?.arr?.find?.(
94
+ (c) => c.id?.toString?.() === cel.id?.toString?.()
95
+ ) || { text: clsData?.[cel.id]?.text || clsData?.[cel.id] || cel.id };
96
+ return { ...cel, id: cel.id === null ? "null" : cel.id, ...data };
97
+ });
98
+ Object.assign(el, { options });
99
+ })
100
+ );
101
101
  }
@@ -1,3 +1,3 @@
1
- export function extractVisibleColumns(columns, mode = "table") {
2
- return (columns || []).filter((col) => (mode === "card" ? col.hidden_card !== true : col.hidden_register !== true));
3
- }
1
+ export function extractVisibleColumns(columns, mode = "table") {
2
+ return (columns || []).filter((col) => (mode === "card" ? col.hidden_card !== true : col.hidden_register !== true));
3
+ }
@@ -1,10 +1,10 @@
1
- const ContentType = {
2
- xml: 'application/xml',
3
- shp: 'application/zip',
4
- csv: 'text/csv',
5
- geojson: 'application/vnd.geo+json',
6
- json: 'application/json',
7
- xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
8
- };
9
-
1
+ const ContentType = {
2
+ xml: 'application/xml',
3
+ shp: 'application/zip',
4
+ csv: 'text/csv',
5
+ geojson: 'application/vnd.geo+json',
6
+ json: 'application/json',
7
+ xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
8
+ };
9
+
10
10
  export default ContentType;
@@ -1,15 +1,15 @@
1
- import { dataDelete, pgClients } from "@opengis/fastify-table/utils.js";
2
-
3
- export default async function deleteGisRegistry({
4
- slug, uid,
5
- }, pg = pgClients.client) {
6
- const id = await pg.query('select register_id from gis.registers where register_key=$1', [slug]).then(el => el.rows?.[0]?.register_id) || slug;
7
-
8
- const row = await dataDelete({
9
- pg,
10
- id,
11
- table: 'gis.registers',
12
- uid,
13
- });
14
- return row;
1
+ import { dataDelete, pgClients } from "@opengis/fastify-table/utils.js";
2
+
3
+ export default async function deleteGisRegistry({
4
+ slug, uid,
5
+ }, pg = pgClients.client) {
6
+ const id = await pg.query('select register_id from gis.registers where register_key=$1', [slug]).then(el => el.rows?.[0]?.register_id) || slug;
7
+
8
+ const row = await dataDelete({
9
+ pg,
10
+ id,
11
+ table: 'gis.registers',
12
+ uid,
13
+ });
14
+ return row;
15
15
  }
@@ -1,93 +1,93 @@
1
- import { pgClients } from '@opengis/fastify-table/utils.js';
2
- import { NotFoundError } from '@opengis/fastify-table/errors.js';
3
-
4
- import { attachClassifiers } from '../../registers/functions/classifiers.js';
5
-
6
- const pg = pgClients.client;
7
-
8
- export default async function getInfo({ finalInfo, format }) {
9
- if (!finalInfo) return { error: 'No data found' };
10
-
11
- const table = finalInfo?.table_name;
12
- const queryCondition = finalInfo?.query || '1=1';
13
- const columns = finalInfo?.columns || finalInfo?.attributes || [];
14
- const exportable = columns.filter(c => c.is_export);
15
- const selectNames = exportable.map(c => `"${c.name}"`);
16
- const selectSQL = `
17
- SELECT ${selectNames?.length ? selectNames.join(', ') : ''} ${format === 'geojson' || format === 'shp' ? `${selectNames?.length ? ',' : ''} ST_AsGeoJSON(geom)::json as geom` : ``}
18
- FROM ${table}
19
- WHERE ${queryCondition} ${format === 'geojson' || format === 'shp' ? `and geom is not null` : ``}
20
- `;
21
-
22
- if (format === 'shp') {
23
- const { rows: geomTypeRows } = await pg.query(`
24
- SELECT DISTINCT ST_GeometryType(geom) AS geom_type
25
- FROM ${table}
26
- WHERE geom IS NOT NULL
27
- `);
28
- const geometryTypes = geomTypeRows.map(row => row.geom_type);
29
-
30
- const sqlList = geometryTypes.map(type => {
31
- return {
32
- type,
33
- query: `
34
- SELECT ${selectNames.join(', ')} ${selectNames?.length ? ',' : ''} ST_AsGeoJSON(geom)::json as geom
35
- FROM ${table}
36
- WHERE ${queryCondition} AND ST_GeometryType(geom) = '${type}' AND geom IS NOT NULL
37
- `,
38
- };
39
- });
40
-
41
- const { rows: [{ srid }] } = await pg.query(`
42
- SELECT ST_SRID(geom) AS srid
43
- FROM ${table}
44
- WHERE geom IS NOT NULL
45
- LIMIT 1;
46
- `);
47
-
48
- return {
49
- columns: exportable,
50
- table,
51
- srid: srid || 4326,
52
- geomTypes: geometryTypes,
53
- sqlList
54
- };
55
- }
56
-
57
- const rows = await pg.query(selectSQL).then(r => r.rows || []);
58
-
59
- if (!rows?.length) {
60
- throw NotFoundError('Немає даних, які можна експортувати');
61
- }
62
-
63
- const classifiers = exportable
64
- .filter(col => col.data && ["select", "badge", "tags"].includes(col.format))
65
- .map(col => ({ name: col.name, classifier: col.data }));
66
-
67
- const rowsWithClassifiers = await attachClassifiers(rows, classifiers);
68
-
69
- const simplifiedRows = rowsWithClassifiers.map(row => {
70
- const newRow = { ...row };
71
-
72
- for (const key of Object.keys(newRow)) {
73
- if (key.endsWith('_data') && typeof newRow[key]?.text === 'string') {
74
- const baseKey = key.replace(/_data$/, '');
75
- newRow[baseKey] = newRow[key].text;
76
- }
77
-
78
- if (key.endsWith('_text') && typeof newRow[key] === 'string') {
79
- const baseKey = key.replace(/_text$/, '');
80
- newRow[baseKey] = newRow[key];
81
- }
82
- }
83
-
84
- return newRow;
85
- });
86
-
87
- return {
88
- rows: simplifiedRows,
89
- data: rows,
90
- columns: exportable,
91
- table
92
- };
93
- }
1
+ import { pgClients } from '@opengis/fastify-table/utils.js';
2
+ import { NotFoundError } from '@opengis/fastify-table/errors.js';
3
+
4
+ import { attachClassifiers } from '../../registers/functions/classifiers.js';
5
+
6
+ const pg = pgClients.client;
7
+
8
+ export default async function getInfo({ finalInfo, format }) {
9
+ if (!finalInfo) return { error: 'No data found' };
10
+
11
+ const table = finalInfo?.table_name;
12
+ const queryCondition = finalInfo?.query || '1=1';
13
+ const columns = finalInfo?.columns || finalInfo?.attributes || [];
14
+ const exportable = columns.filter(c => c.is_export);
15
+ const selectNames = exportable.map(c => `"${c.name}"`);
16
+ const selectSQL = `
17
+ SELECT ${selectNames?.length ? selectNames.join(', ') : ''} ${format === 'geojson' || format === 'shp' ? `${selectNames?.length ? ',' : ''} ST_AsGeoJSON(geom)::json as geom` : ``}
18
+ FROM ${table}
19
+ WHERE ${queryCondition} ${format === 'geojson' || format === 'shp' ? `and geom is not null` : ``}
20
+ `;
21
+
22
+ if (format === 'shp') {
23
+ const { rows: geomTypeRows } = await pg.query(`
24
+ SELECT DISTINCT ST_GeometryType(geom) AS geom_type
25
+ FROM ${table}
26
+ WHERE geom IS NOT NULL
27
+ `);
28
+ const geometryTypes = geomTypeRows.map(row => row.geom_type);
29
+
30
+ const sqlList = geometryTypes.map(type => {
31
+ return {
32
+ type,
33
+ query: `
34
+ SELECT ${selectNames.join(', ')} ${selectNames?.length ? ',' : ''} ST_AsGeoJSON(geom)::json as geom
35
+ FROM ${table}
36
+ WHERE ${queryCondition} AND ST_GeometryType(geom) = '${type}' AND geom IS NOT NULL
37
+ `,
38
+ };
39
+ });
40
+
41
+ const { rows: [{ srid }] } = await pg.query(`
42
+ SELECT ST_SRID(geom) AS srid
43
+ FROM ${table}
44
+ WHERE geom IS NOT NULL
45
+ LIMIT 1;
46
+ `);
47
+
48
+ return {
49
+ columns: exportable,
50
+ table,
51
+ srid: srid || 4326,
52
+ geomTypes: geometryTypes,
53
+ sqlList
54
+ };
55
+ }
56
+
57
+ const rows = await pg.query(selectSQL).then(r => r.rows || []);
58
+
59
+ if (!rows?.length) {
60
+ throw NotFoundError('Немає даних, які можна експортувати');
61
+ }
62
+
63
+ const classifiers = exportable
64
+ .filter(col => col.data && ["select", "badge", "tags"].includes(col.format))
65
+ .map(col => ({ name: col.name, classifier: col.data }));
66
+
67
+ const rowsWithClassifiers = await attachClassifiers(rows, classifiers);
68
+
69
+ const simplifiedRows = rowsWithClassifiers.map(row => {
70
+ const newRow = { ...row };
71
+
72
+ for (const key of Object.keys(newRow)) {
73
+ if (key.endsWith('_data') && typeof newRow[key]?.text === 'string') {
74
+ const baseKey = key.replace(/_data$/, '');
75
+ newRow[baseKey] = newRow[key].text;
76
+ }
77
+
78
+ if (key.endsWith('_text') && typeof newRow[key] === 'string') {
79
+ const baseKey = key.replace(/_text$/, '');
80
+ newRow[baseKey] = newRow[key];
81
+ }
82
+ }
83
+
84
+ return newRow;
85
+ });
86
+
87
+ return {
88
+ rows: simplifiedRows,
89
+ data: rows,
90
+ columns: exportable,
91
+ table
92
+ };
93
+ }