@opengis/gis 0.2.13 → 0.2.15

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 (149) hide show
  1. package/README.md +5 -5
  2. package/dist/index.css +1 -1
  3. package/dist/index.js +498 -499
  4. package/dist/index.umd.cjs +9 -9
  5. package/module/cls.json +6 -6
  6. package/module/gis/card/gis.maps.table/index.yml +14 -14
  7. package/module/gis/card/gis.maps.table/main_info.hbs +25 -25
  8. package/module/gis/card/gis.maps.table/maps_layers.hbs +19 -19
  9. package/module/gis/card/gis.metadata.table/index.yml +22 -22
  10. package/module/gis/card/gis.metadata.table/main_info.hbs +20 -20
  11. package/module/gis/card/gis.metadata.table/metadata_info.hbs +27 -27
  12. package/module/gis/card/gis.metadata.table/other.hbs +25 -25
  13. package/module/gis/card/gis.rasters.table/index.yml +11 -11
  14. package/module/gis/card/gis.rasters.table/main_info.hbs +27 -27
  15. package/module/gis/card/gis.registers.table/cls.hbs +36 -36
  16. package/module/gis/card/gis.registers.table/columns.hbs +89 -89
  17. package/module/gis/card/gis.registers.table/filters.hbs +80 -80
  18. package/module/gis/card/gis.registers.table/index.yml +23 -23
  19. package/module/gis/card/gis.registers.table/main_info.hbs +35 -35
  20. package/module/gis/card/gis.registers.table/source.hbs +45 -45
  21. package/module/gis/card/gis.services.table/attributes.hbs +91 -91
  22. package/module/gis/card/gis.services.table/filters.hbs +83 -83
  23. package/module/gis/card/gis.services.table/index.yml +25 -25
  24. package/module/gis/card/gis.services.table/main_info.hbs +27 -27
  25. package/module/gis/card/gis.services.table/source.hbs +25 -25
  26. package/module/gis/cls/bool.yes_no.json +12 -12
  27. package/module/gis/cls/encoding.json +14 -14
  28. package/module/gis/cls/geom_type.json +14 -14
  29. package/module/gis/cls/gis.column_type.json +34 -34
  30. package/module/gis/cls/gis.column_view_type.json +26 -26
  31. package/module/gis/cls/gis.filter_type.json +22 -22
  32. package/module/gis/cls/language.json +10 -10
  33. package/module/gis/cls/meta.service_type.json +42 -42
  34. package/module/gis/cls/ogc.service.json +21 -21
  35. package/module/gis/cls/service_type.json +42 -42
  36. package/module/gis/cls/source_type.json +10 -10
  37. package/module/gis/cls/standarts.json +6 -6
  38. package/module/gis/cls/topic_category.json +106 -106
  39. package/module/gis/cls/update_frequency.json +29 -29
  40. package/module/gis/cls/view.json +21 -21
  41. package/module/gis/form/gis.group_list.form.json +17 -17
  42. package/module/gis/form/gis.maps.form.json +64 -64
  43. package/module/gis/form/gis.metadata.form.json +240 -240
  44. package/module/gis/form/gis.ogc_service.form.json +40 -40
  45. package/module/gis/form/gis.rasters.form.json +99 -99
  46. package/module/gis/form/gis.registers.form.json +110 -110
  47. package/module/gis/form/gis.registers_column.form.json +84 -84
  48. package/module/gis/form/gis.registers_filter.form.json +65 -65
  49. package/module/gis/form/gis.services.form.json +120 -120
  50. package/module/gis/form/gis.services_attributes.form.json +75 -75
  51. package/module/gis/form/gis.services_filter.form.json +65 -65
  52. package/module/gis/menu.json +43 -43
  53. package/module/gis/select/pg.columns.parent.sql +6 -6
  54. package/module/gis/select/pg.table_name.sql +17 -17
  55. package/module/gis/select/service_id.sql +1 -1
  56. package/module/gis/table/gis.group_list.table.json +35 -35
  57. package/module/gis/table/gis.maps.table.json +69 -69
  58. package/module/gis/table/gis.metadata.table.json +70 -70
  59. package/module/gis/table/gis.ogc_service.table.json +91 -91
  60. package/module/gis/table/gis.rasters.table.json +97 -97
  61. package/module/gis/table/gis.registers.table.json +79 -79
  62. package/module/gis/table/gis.services.table.json +99 -99
  63. package/module/gis/table/site.gis.registers.table.json +88 -88
  64. package/module/gis/table/site.gis.services.table.json +106 -106
  65. package/module/gis/templates/ISO19136_2017_gml_template.xml +330 -330
  66. package/module/gis/tokens.yml +5 -5
  67. package/module/test/cls/bp_build_type.json +37 -37
  68. package/module/test/cls/doc_status.json +31 -31
  69. package/module/test/cls/ts.temp_status.json +18 -18
  70. package/module/test/cls/ts.temp_structure.ts_class.json +49 -49
  71. package/module/test/cls/ts.temp_type.json +9 -9
  72. package/module/test/layer/bp.json +59 -59
  73. package/module/test/layer/bp1.yml +33 -33
  74. package/module/test/layer/individual.yml +53 -53
  75. package/module/test/layer/ts.linking_passport.yml +55 -55
  76. package/module/test/layer/ts.temp_structure.yml +50 -50
  77. package/module/test/map/addr.yml +21 -21
  78. package/module/test/map/bp_myo.json +43 -43
  79. package/module/test/map/bpf.json +43 -43
  80. package/module/test/map/main.json +36 -36
  81. package/module/test/map/mbd.json +91 -91
  82. package/module/test/map/ts.json +52 -52
  83. package/module/test/select/address_id.json +2 -2
  84. package/module/test/select/address_id.sql +7 -7
  85. package/module/test/select/core.user_uid.sql +1 -1
  86. package/module/test/table/data_address.street.table.json +69 -69
  87. package/module/test/table/data_bp_myo.bp.table.json +122 -122
  88. package/package.json +67 -67
  89. package/plugin.js +44 -44
  90. package/server/migrations/ogc.sql +106 -106
  91. package/server/migrations/rasters.sql +263 -263
  92. package/server/migrations/services.sql +247 -247
  93. package/server/migrations/widgets.sql +20 -20
  94. package/server/plugins/crons.js +21 -21
  95. package/server/plugins/mapnik/funcs/createXML.js +72 -72
  96. package/server/plugins/mapnik/funcs/gdalWrapper.js +72 -72
  97. package/server/plugins/mapnik/funcs/map.proto +241 -241
  98. package/server/plugins/mapnik/funcs/mapnik.js +106 -106
  99. package/server/plugins/mapnik/funcs/rasterConfig.js +11 -11
  100. package/server/plugins/mapnik/funcs/rasterExists.js +20 -20
  101. package/server/plugins/mapnik/funcs/rasterInfo.js +109 -109
  102. package/server/plugins/mapnik/funcs/rasterVrt.js +55 -55
  103. package/server/plugins/mapnik/funcs/rasterXML.js +65 -65
  104. package/server/plugins/mapnik/funcs/rootFolder.mjs +8 -8
  105. package/server/plugins/mapnik/utils/map.proto +241 -241
  106. package/server/plugins/vite.js +74 -74
  107. package/server/routes/gis/index.mjs +59 -59
  108. package/server/routes/gis/metadata/metadataXML.js +13 -13
  109. package/server/routes/gis/ogc/map.info.point.js +124 -124
  110. package/server/routes/gis/registers/add.registry.js +35 -35
  111. package/server/routes/gis/registers/del.registry.js +14 -14
  112. package/server/routes/gis/registers/funcs/classifiers.js +100 -100
  113. package/server/routes/gis/registers/funcs/columns.js +4 -4
  114. package/server/routes/gis/registers/funcs/content.type.js +9 -9
  115. package/server/routes/gis/registers/funcs/get.info.js +89 -89
  116. package/server/routes/gis/registers/funcs/handleRegistryRequest.js +122 -122
  117. package/server/routes/gis/registers/gis.export.js +148 -148
  118. package/server/routes/gis/registers/gis.registry.js +38 -38
  119. package/server/routes/gis/registers/gis.registry.list.js +59 -59
  120. package/server/routes/gis/registers/insert.columns.js +107 -107
  121. package/server/routes/gis/registers/insert.filters.js +110 -110
  122. package/server/routes/gis/registers/map.registry.js +79 -79
  123. package/server/routes/gis/services/add.service.js +64 -64
  124. package/server/routes/gis/services/del.service.js +12 -12
  125. package/server/routes/gis/services/get.layer.geom.js +27 -27
  126. package/server/routes/gis/services/get.services.col.js +33 -33
  127. package/server/routes/gis/services/get.services.js +84 -84
  128. package/server/routes/gis/services/legend.auto.js +77 -77
  129. package/server/routes/map/controllers/layerList.js +60 -60
  130. package/server/routes/map/controllers/map.js +123 -123
  131. package/server/routes/map/controllers/mapCatalog.js +72 -72
  132. package/server/routes/map/controllers/mapCatalogAttribute.js +55 -55
  133. package/server/routes/map/controllers/mapFeatures.js +128 -128
  134. package/server/routes/map/controllers/mapFormat.js +83 -83
  135. package/server/routes/map/controllers/mapTiles.js +152 -152
  136. package/server/routes/map/controllers/maps.js +15 -15
  137. package/server/routes/map/controllers/marker_icon.js +43 -43
  138. package/server/routes/map/controllers/rtile.js +134 -134
  139. package/server/routes/map/controllers/vtile.js +172 -172
  140. package/server/routes/map/index.mjs +129 -86
  141. package/server/routes/map/maps/add.map.js +41 -41
  142. package/server/routes/map/maps/del.map.js +18 -18
  143. package/server/routes/map/maps/get.map.js +88 -88
  144. package/server/routes/map/vtile1.js +170 -170
  145. package/server/routes/map/widgets/add.widget.js +38 -38
  146. package/server/routes/map/widgets/del.widget.js +22 -22
  147. package/server/routes/map/widgets/get.widget.js +40 -40
  148. package/server/routes/root.mjs +3 -3
  149. package/utils.js +11 -11
@@ -1,149 +1,149 @@
1
- import { createReadStream } from 'node:fs';
2
- import { mkdir, writeFile } from 'node:fs/promises';
3
- import path from 'node:path';
4
- import { grpc, config, getMeta, getFolder, jsonToCsv } from '@opengis/fastify-table/utils.js';
5
-
6
- import getInfo from './funcs/get.info.js';
7
- import ContentType from './funcs/content.type.js';
8
-
9
- const { jsonToXls, geojsonToShp } = grpc();
10
- const rootDir = getFolder(config, 'local');
11
-
12
- /**
13
- * Експорт даних реєстру
14
- * @param {Object} query - Об'єкт запиту з форматом.
15
- * @param {Object} params - Об'єкт параметрів з slug та type.
16
- * @param {Function} reply
17
- * @returns {boolean} File
18
- */
19
-
20
- export default async function gisExport({ pg, query = {}, params = {} }, reply) {
21
- const { format } = query;
22
- const { slug, type } = params;
23
- if (!['csv', 'xlsx', 'shp', 'geojson'].includes(format)) {
24
- return reply.code(401).send({ message: 'Param format is invalid. Allowed: csv, xlsx, shp, geojson', status: 404 });
25
- }
26
- if (!slug) return reply.code(401).send({ message: 'slug is not defined', status: 404 });
27
- if (!type) return reply.code(401).send({ message: 'type is not defined', status: 404 });
28
-
29
- let registerInfo;
30
- let serviceInfo;
31
-
32
- if (type === 'register') {
33
- registerInfo = await pg.query(
34
- `SELECT table_name, columns, query
35
- FROM gis.registers
36
- WHERE register_key = $1`,
37
- [slug]
38
- );
39
- }
40
- if (type === 'service') {
41
- serviceInfo = await pg.query(
42
- `SELECT source_path as table_name, attributes as columns, query
43
- FROM gis.services
44
- WHERE service_key = $1`,
45
- [slug]
46
- );
47
- }
48
- const finalInfo = registerInfo?.rows[0] || serviceInfo?.rows[0];
49
-
50
- const exportable = finalInfo?.columns?.filter(c => c.is_export);
51
- const colmodel = exportable.map(col => ({
52
- name: col.name,
53
- title: col.ua || col.name
54
- }));
55
- const { rows, table, srid, sqlList } = await getInfo({ finalInfo, format }, reply);
56
- let filePath = ['csv', 'geojson', 'xlsx'].includes(format) ? path.join(rootDir, `/files/tmp/export_${table}_${Date.now()}.${format}`) : path.join(rootDir, `/files/tmp/export_${table}_${Date.now()}.zip`);
57
- const ext = path.extname(filePath);
58
- const filePathJSON = ['csv', 'geojson', 'shp'].includes(format) ? filePath.replace(ext, '.json') : filePath;
59
- let exportedZipPaths = [];
60
-
61
- const meta = await getMeta({ pg, table: table });
62
- if ((format === 'geojson' || format === 'shp') && !meta?.geom) {
63
- return reply.status(400).send('Ця таблиця не містить полів геометрії. Виберіть тип, який не потребує геометрії для вивантаження');
64
- }
65
-
66
- if (format === 'xlsx') {
67
- if (!jsonToXls) {
68
- const message = 'Сервіс конвертації jsonToXls тимчасово недоступний. Спробуйте експортувати дані у іншому форматі...';
69
- const error = new Error(message);
70
- error.status = 503;
71
-
72
- throw error;
73
- }
74
- const { result } = await jsonToXls({
75
- json: JSON.stringify(rows),
76
- colmodel: JSON.stringify(colmodel),
77
- });
78
-
79
- await mkdir(path.dirname(filePath), { recursive: true });
80
- await writeFile(filePath, result, 'base64');
81
- }
82
-
83
- if (format === 'csv') {
84
- await mkdir(path.dirname(filePathJSON), { recursive: true });
85
- await writeFile(filePathJSON, JSON.stringify(rows));
86
-
87
- await jsonToCsv({
88
- filePath: filePathJSON, colmodel, columnList: colmodel.map(c => c.name),
89
- });
90
- }
91
-
92
- if (['shp', 'geojson'].includes(format)) {
93
- if (format === 'geojson') {
94
- const geojson = {
95
- type: 'FeatureCollection',
96
- features: rows.map((row) => ({
97
- type: 'Feature',
98
- geometry: row.geom,
99
- properties: Object.fromEntries(Object.entries(row).filter(([key]) => key !== 'geom')),
100
- })),
101
- };
102
- filePath = filePathJSON.replace('.json', '.geojson');
103
- await mkdir(path.dirname(filePath), { recursive: true });
104
- await writeFile(filePath, JSON.stringify(geojson));
105
- }
106
-
107
- if (format === 'shp') {
108
- const proj = `EPSG:${srid || 4326}`;
109
- for (const { type, query } of sqlList) {
110
- const { rows } = await pg.query(query);
111
- if (!rows.length) continue;
112
-
113
- const geojson = {
114
- type: 'FeatureCollection',
115
- features: rows.map(row => ({
116
- type: 'Feature',
117
- geometry: row.geom,
118
- properties: Object.fromEntries(Object.entries(row).filter(([k]) => k !== 'geom')),
119
- })),
120
- };
121
- const geomShort = type.toLowerCase().replace('st_', '');
122
- const typedPath = filePath.replace('.zip', `_${geomShort}.zip`);
123
-
124
- const filePathTyped = filePath.replace('.zip', `_${type.toLowerCase().replace('st_', '')}.zip`);
125
- const { result: shpZipBuffer } = await geojsonToShp({
126
- geojson: JSON.stringify(geojson),
127
- proj,
128
- });
129
-
130
- await mkdir(path.dirname(filePathTyped), { recursive: true });
131
- await writeFile(filePathTyped, Buffer.from(shpZipBuffer, 'base64'));
132
-
133
- exportedZipPaths.push(typedPath);
134
- }
135
- }
136
- }
137
-
138
- let exportFilePath = filePath;
139
-
140
- if (format === 'shp' && exportedZipPaths?.length > 0) {
141
- exportFilePath = exportedZipPaths[0];
142
- }
143
-
144
- reply.header('Content-Disposition', `attachment; filename=${encodeURIComponent(path.basename(exportFilePath))}`);
145
- reply.header('Content-Type', ContentType[format]);
146
-
147
- const fileStream = createReadStream(exportFilePath);
148
- return reply.send(fileStream);
1
+ import { createReadStream } from 'node:fs';
2
+ import { mkdir, writeFile } from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { grpc, config, getMeta, getFolder, jsonToCsv } from '@opengis/fastify-table/utils.js';
5
+
6
+ import getInfo from './funcs/get.info.js';
7
+ import ContentType from './funcs/content.type.js';
8
+
9
+ const { jsonToXls, geojsonToShp } = grpc();
10
+ const rootDir = getFolder(config, 'local');
11
+
12
+ /**
13
+ * Експорт даних реєстру
14
+ * @param {Object} query - Об'єкт запиту з форматом.
15
+ * @param {Object} params - Об'єкт параметрів з slug та type.
16
+ * @param {Function} reply
17
+ * @returns {boolean} File
18
+ */
19
+
20
+ export default async function gisExport({ pg, query = {}, params = {} }, reply) {
21
+ const { format } = query;
22
+ const { slug, type } = params;
23
+ if (!['csv', 'xlsx', 'shp', 'geojson'].includes(format)) {
24
+ return reply.code(401).send({ message: 'Param format is invalid. Allowed: csv, xlsx, shp, geojson', status: 404 });
25
+ }
26
+ if (!slug) return reply.code(401).send({ message: 'slug is not defined', status: 404 });
27
+ if (!type) return reply.code(401).send({ message: 'type is not defined', status: 404 });
28
+
29
+ let registerInfo;
30
+ let serviceInfo;
31
+
32
+ if (type === 'register') {
33
+ registerInfo = await pg.query(
34
+ `SELECT table_name, columns, query
35
+ FROM gis.registers
36
+ WHERE register_key = $1`,
37
+ [slug]
38
+ );
39
+ }
40
+ if (type === 'service') {
41
+ serviceInfo = await pg.query(
42
+ `SELECT source_path as table_name, attributes as columns, query
43
+ FROM gis.services
44
+ WHERE service_key = $1`,
45
+ [slug]
46
+ );
47
+ }
48
+ const finalInfo = registerInfo?.rows[0] || serviceInfo?.rows[0];
49
+
50
+ const exportable = finalInfo?.columns?.filter(c => c.is_export);
51
+ const colmodel = exportable.map(col => ({
52
+ name: col.name,
53
+ title: col.ua || col.name
54
+ }));
55
+ const { rows, table, srid, sqlList } = await getInfo({ finalInfo, format }, reply);
56
+ let filePath = ['csv', 'geojson', 'xlsx'].includes(format) ? path.join(rootDir, `/files/tmp/export_${table}_${Date.now()}.${format}`) : path.join(rootDir, `/files/tmp/export_${table}_${Date.now()}.zip`);
57
+ const ext = path.extname(filePath);
58
+ const filePathJSON = ['csv', 'geojson', 'shp'].includes(format) ? filePath.replace(ext, '.json') : filePath;
59
+ let exportedZipPaths = [];
60
+
61
+ const meta = await getMeta({ pg, table: table });
62
+ if ((format === 'geojson' || format === 'shp') && !meta?.geom) {
63
+ return reply.status(400).send('Ця таблиця не містить полів геометрії. Виберіть тип, який не потребує геометрії для вивантаження');
64
+ }
65
+
66
+ if (format === 'xlsx') {
67
+ if (!jsonToXls) {
68
+ const message = 'Сервіс конвертації jsonToXls тимчасово недоступний. Спробуйте експортувати дані у іншому форматі...';
69
+ const error = new Error(message);
70
+ error.status = 503;
71
+
72
+ throw error;
73
+ }
74
+ const { result } = await jsonToXls({
75
+ json: JSON.stringify(rows),
76
+ colmodel: JSON.stringify(colmodel),
77
+ });
78
+
79
+ await mkdir(path.dirname(filePath), { recursive: true });
80
+ await writeFile(filePath, result, 'base64');
81
+ }
82
+
83
+ if (format === 'csv') {
84
+ await mkdir(path.dirname(filePathJSON), { recursive: true });
85
+ await writeFile(filePathJSON, JSON.stringify(rows));
86
+
87
+ await jsonToCsv({
88
+ filePath: filePathJSON, colmodel, columnList: colmodel.map(c => c.name),
89
+ });
90
+ }
91
+
92
+ if (['shp', 'geojson'].includes(format)) {
93
+ if (format === 'geojson') {
94
+ const geojson = {
95
+ type: 'FeatureCollection',
96
+ features: rows.map((row) => ({
97
+ type: 'Feature',
98
+ geometry: row.geom,
99
+ properties: Object.fromEntries(Object.entries(row).filter(([key]) => key !== 'geom')),
100
+ })),
101
+ };
102
+ filePath = filePathJSON.replace('.json', '.geojson');
103
+ await mkdir(path.dirname(filePath), { recursive: true });
104
+ await writeFile(filePath, JSON.stringify(geojson));
105
+ }
106
+
107
+ if (format === 'shp') {
108
+ const proj = `EPSG:${srid || 4326}`;
109
+ for (const { type, query } of sqlList) {
110
+ const { rows } = await pg.query(query);
111
+ if (!rows.length) continue;
112
+
113
+ const geojson = {
114
+ type: 'FeatureCollection',
115
+ features: rows.map(row => ({
116
+ type: 'Feature',
117
+ geometry: row.geom,
118
+ properties: Object.fromEntries(Object.entries(row).filter(([k]) => k !== 'geom')),
119
+ })),
120
+ };
121
+ const geomShort = type.toLowerCase().replace('st_', '');
122
+ const typedPath = filePath.replace('.zip', `_${geomShort}.zip`);
123
+
124
+ const filePathTyped = filePath.replace('.zip', `_${type.toLowerCase().replace('st_', '')}.zip`);
125
+ const { result: shpZipBuffer } = await geojsonToShp({
126
+ geojson: JSON.stringify(geojson),
127
+ proj,
128
+ });
129
+
130
+ await mkdir(path.dirname(filePathTyped), { recursive: true });
131
+ await writeFile(filePathTyped, Buffer.from(shpZipBuffer, 'base64'));
132
+
133
+ exportedZipPaths.push(typedPath);
134
+ }
135
+ }
136
+ }
137
+
138
+ let exportFilePath = filePath;
139
+
140
+ if (format === 'shp' && exportedZipPaths?.length > 0) {
141
+ exportFilePath = exportedZipPaths[0];
142
+ }
143
+
144
+ reply.header('Content-Disposition', `attachment; filename=${encodeURIComponent(path.basename(exportFilePath))}`);
145
+ reply.header('Content-Type', ContentType[format]);
146
+
147
+ const fileStream = createReadStream(exportFilePath);
148
+ return reply.send(fileStream);
149
149
  }
@@ -1,38 +1,38 @@
1
- import { pgClients, getTemplate } from "@opengis/fastify-table/utils.js";
2
-
3
- import { handleRegistryRequest } from './funcs/handleRegistryRequest.js';
4
-
5
- const maxLimit = 100;
6
- const defaultLimit = 9;
7
-
8
- export default async function gisRegistry({
9
- pg = pgClients.client, params = {}, query = {},
10
- }) {
11
- const { slug, objectId } = params;
12
- const { sql } = query;
13
-
14
- const limit = Math.min(query.limit || defaultLimit, maxLimit);
15
- const offset = query.page && query.page > 0 && !objectId ? (query.page - 1) * limit : 0;
16
-
17
- //if (!slug) return reply.code(404).send({ message: 'Params slug is required', status: 404 });
18
- if (!slug) throw new Error('Params slug is required');
19
-
20
- const {
21
- rows: [registry],
22
- } = await pg.query(
23
- `SELECT register_id, name, description, card, table_name, columns, filters, query, "order", pk, register_key, is_files, view
24
- FROM gis.registers
25
- WHERE $1 in (register_key,register_id)`,
26
- [slug]
27
- );
28
-
29
- if (registry) {
30
- return handleRegistryRequest({ settings: registry, query, object_id: objectId, offset, limit, page: query.page, pg, sql });
31
- }
32
-
33
- const registryTemplate = await getTemplate('registry', slug);
34
- //if (!registryTemplate) return reply.code(404).send({ message: 'Template not found', status: 404 });
35
- if (!registryTemplate) throw new Error('Template not found');
36
-
37
- return handleRegistryRequest({ settings: registryTemplate, query, object_id: objectId, offset, limit, page: query.page, pg, sql });
38
- }
1
+ import { pgClients, getTemplate } from "@opengis/fastify-table/utils.js";
2
+
3
+ import { handleRegistryRequest } from './funcs/handleRegistryRequest.js';
4
+
5
+ const maxLimit = 100;
6
+ const defaultLimit = 9;
7
+
8
+ export default async function gisRegistry({
9
+ pg = pgClients.client, params = {}, query = {},
10
+ }) {
11
+ const { slug, objectId } = params;
12
+ const { sql } = query;
13
+
14
+ const limit = Math.min(query.limit || defaultLimit, maxLimit);
15
+ const offset = query.page && query.page > 0 && !objectId ? (query.page - 1) * limit : 0;
16
+
17
+ //if (!slug) return reply.code(404).send({ message: 'Params slug is required', status: 404 });
18
+ if (!slug) throw new Error('Params slug is required');
19
+
20
+ const {
21
+ rows: [registry],
22
+ } = await pg.query(
23
+ `SELECT register_id, name, description, card, table_name, columns, filters, query, "order", pk, register_key, is_files, view
24
+ FROM gis.registers
25
+ WHERE $1 in (register_key,register_id)`,
26
+ [slug]
27
+ );
28
+
29
+ if (registry) {
30
+ return handleRegistryRequest({ settings: registry, query, object_id: objectId, offset, limit, page: query.page, pg, sql });
31
+ }
32
+
33
+ const registryTemplate = await getTemplate('registry', slug);
34
+ //if (!registryTemplate) return reply.code(404).send({ message: 'Template not found', status: 404 });
35
+ if (!registryTemplate) throw new Error('Template not found');
36
+
37
+ return handleRegistryRequest({ settings: registryTemplate, query, object_id: objectId, offset, limit, page: query.page, pg, sql });
38
+ }
@@ -1,59 +1,59 @@
1
- import { pgClients, getTemplatePath, getTemplate } from "@opengis/fastify-table/utils.js";
2
- const pg = pgClients.client;
3
-
4
- export default async function gisRegistryList(req = {}) {
5
- const { query = {} } = req;
6
- const { page = 1, limit = 9, search = '' } = query;
7
- const offset = limit * (page - 1);
8
-
9
- const dbResult = await pg.query(
10
- `SELECT register_key, name, description, keywords
11
- FROM gis.registers
12
- WHERE is_public = true AND is_active = true`
13
- );
14
-
15
- let templates = dbResult?.rows;
16
- let fromDatabase = true;
17
-
18
- if (!templates?.length) {
19
- fromDatabase = false;
20
-
21
- const registryListTemplate = await getTemplatePath('registry');
22
- if (!registryListTemplate?.length) throw new Error('Templates not found');
23
-
24
- templates = ( await Promise.all(
25
- registryListTemplate.map(async ([slug]) => {
26
- try {
27
- const tpl = await getTemplate('registry', slug);
28
- if (tpl?.visible === false) return null;
29
-
30
- const { register_key, name, description, keywords } = tpl;
31
- return { register_key, name, description, keywords };
32
- } catch {
33
- return null;
34
- }
35
- })
36
- ));
37
- }
38
-
39
- const filteredBySearch = search
40
- ? templates.filter(tpl => {
41
- const q = search.toLowerCase();
42
- return (
43
- tpl.name?.toLowerCase().includes(q) ||
44
- tpl.description?.toLowerCase().includes(q) ||
45
- tpl.keywords?.join(' ').toLowerCase().includes(q)
46
- );
47
- })
48
- : templates;
49
-
50
- const paged = filteredBySearch.slice(offset, offset + limit);
51
-
52
- return {
53
- rows: paged,
54
- total: filteredBySearch.length,
55
- page: parseInt(page, 10),
56
- limit: parseInt(limit, 10),
57
- offset
58
- };
59
- }
1
+ import { pgClients, getTemplatePath, getTemplate } from "@opengis/fastify-table/utils.js";
2
+ const pg = pgClients.client;
3
+
4
+ export default async function gisRegistryList(req = {}) {
5
+ const { query = {} } = req;
6
+ const { page = 1, limit = 9, search = '' } = query;
7
+ const offset = limit * (page - 1);
8
+
9
+ const dbResult = await pg.query(
10
+ `SELECT register_key, name, description, keywords
11
+ FROM gis.registers
12
+ WHERE is_public = true AND is_active = true`
13
+ );
14
+
15
+ let templates = dbResult?.rows;
16
+ let fromDatabase = true;
17
+
18
+ if (!templates?.length) {
19
+ fromDatabase = false;
20
+
21
+ const registryListTemplate = await getTemplatePath('registry');
22
+ if (!registryListTemplate?.length) throw new Error('Templates not found');
23
+
24
+ templates = ( await Promise.all(
25
+ registryListTemplate.map(async ([slug]) => {
26
+ try {
27
+ const tpl = await getTemplate('registry', slug);
28
+ if (tpl?.visible === false) return null;
29
+
30
+ const { register_key, name, description, keywords } = tpl;
31
+ return { register_key, name, description, keywords };
32
+ } catch {
33
+ return null;
34
+ }
35
+ })
36
+ ));
37
+ }
38
+
39
+ const filteredBySearch = search
40
+ ? templates.filter(tpl => {
41
+ const q = search.toLowerCase();
42
+ return (
43
+ tpl.name?.toLowerCase().includes(q) ||
44
+ tpl.description?.toLowerCase().includes(q) ||
45
+ tpl.keywords?.join(' ').toLowerCase().includes(q)
46
+ );
47
+ })
48
+ : templates;
49
+
50
+ const paged = filteredBySearch.slice(offset, offset + limit);
51
+
52
+ return {
53
+ rows: paged,
54
+ total: filteredBySearch.length,
55
+ page: parseInt(page, 10),
56
+ limit: parseInt(limit, 10),
57
+ offset
58
+ };
59
+ }