@opengis/gis 0.2.10 → 0.2.11

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 (147) hide show
  1. package/README.md +5 -5
  2. package/dist/index.css +1 -1
  3. package/dist/index.js +3348 -3283
  4. package/dist/index.umd.cjs +36 -36
  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/ts.temp_status.json +18 -18
  69. package/module/test/cls/ts.temp_structure.ts_class.json +49 -49
  70. package/module/test/cls/ts.temp_type.json +9 -9
  71. package/module/test/layer/bp.json +59 -59
  72. package/module/test/layer/bp1.yml +33 -33
  73. package/module/test/layer/individual.yml +53 -53
  74. package/module/test/layer/ts.linking_passport.yml +55 -55
  75. package/module/test/layer/ts.temp_structure.yml +50 -50
  76. package/module/test/map/addr.yml +21 -21
  77. package/module/test/map/bp_myo.json +43 -43
  78. package/module/test/map/bpf.json +43 -43
  79. package/module/test/map/main.json +36 -36
  80. package/module/test/map/mbd.json +91 -91
  81. package/module/test/map/ts.json +52 -52
  82. package/module/test/select/address_id.json +2 -2
  83. package/module/test/select/address_id.sql +7 -7
  84. package/module/test/table/data_address.street.table.json +69 -69
  85. package/module/test/table/data_bp_myo.bp.table.json +122 -122
  86. package/package.json +67 -67
  87. package/plugin.js +44 -44
  88. package/server/migrations/ogc.sql +106 -106
  89. package/server/migrations/rasters.sql +263 -263
  90. package/server/migrations/services.sql +247 -247
  91. package/server/migrations/widgets.sql +20 -20
  92. package/server/plugins/crons.js +21 -21
  93. package/server/plugins/mapnik/funcs/createXML.js +72 -72
  94. package/server/plugins/mapnik/funcs/gdalWrapper.js +72 -72
  95. package/server/plugins/mapnik/funcs/map.proto +241 -241
  96. package/server/plugins/mapnik/funcs/mapnik.js +106 -106
  97. package/server/plugins/mapnik/funcs/rasterConfig.js +11 -11
  98. package/server/plugins/mapnik/funcs/rasterExists.js +20 -20
  99. package/server/plugins/mapnik/funcs/rasterInfo.js +109 -109
  100. package/server/plugins/mapnik/funcs/rasterVrt.js +55 -55
  101. package/server/plugins/mapnik/funcs/rasterXML.js +65 -65
  102. package/server/plugins/mapnik/funcs/rootFolder.mjs +8 -8
  103. package/server/plugins/mapnik/utils/map.proto +241 -241
  104. package/server/plugins/vite.js +74 -74
  105. package/server/routes/gis/index.mjs +59 -59
  106. package/server/routes/gis/metadata/metadataXML.js +13 -13
  107. package/server/routes/gis/ogc/map.info.point.js +124 -124
  108. package/server/routes/gis/registers/add.registry.js +35 -35
  109. package/server/routes/gis/registers/del.registry.js +14 -14
  110. package/server/routes/gis/registers/funcs/classifiers.js +100 -100
  111. package/server/routes/gis/registers/funcs/columns.js +4 -4
  112. package/server/routes/gis/registers/funcs/content.type.js +9 -9
  113. package/server/routes/gis/registers/funcs/get.info.js +89 -89
  114. package/server/routes/gis/registers/funcs/handleRegistryRequest.js +122 -122
  115. package/server/routes/gis/registers/gis.export.js +148 -148
  116. package/server/routes/gis/registers/gis.registry.js +38 -38
  117. package/server/routes/gis/registers/gis.registry.list.js +59 -59
  118. package/server/routes/gis/registers/insert.columns.js +107 -107
  119. package/server/routes/gis/registers/insert.filters.js +110 -110
  120. package/server/routes/gis/registers/map.registry.js +79 -79
  121. package/server/routes/gis/services/add.service.js +64 -64
  122. package/server/routes/gis/services/del.service.js +12 -12
  123. package/server/routes/gis/services/get.layer.geom.js +27 -27
  124. package/server/routes/gis/services/get.services.col.js +33 -33
  125. package/server/routes/gis/services/get.services.js +84 -84
  126. package/server/routes/gis/services/legend.auto.js +77 -77
  127. package/server/routes/map/controllers/layerList.js +60 -60
  128. package/server/routes/map/controllers/map.js +123 -123
  129. package/server/routes/map/controllers/mapCatalog.js +72 -72
  130. package/server/routes/map/controllers/mapCatalogAttribute.js +55 -55
  131. package/server/routes/map/controllers/mapFeatures.js +128 -128
  132. package/server/routes/map/controllers/mapFormat.js +83 -83
  133. package/server/routes/map/controllers/mapTiles.js +152 -152
  134. package/server/routes/map/controllers/maps.js +15 -15
  135. package/server/routes/map/controllers/marker_icon.js +43 -43
  136. package/server/routes/map/controllers/rtile.js +134 -134
  137. package/server/routes/map/controllers/vtile.js +172 -172
  138. package/server/routes/map/index.mjs +86 -86
  139. package/server/routes/map/maps/add.map.js +41 -41
  140. package/server/routes/map/maps/del.map.js +18 -18
  141. package/server/routes/map/maps/get.map.js +88 -88
  142. package/server/routes/map/vtile1.js +170 -170
  143. package/server/routes/map/widgets/add.widget.js +38 -38
  144. package/server/routes/map/widgets/del.widget.js +22 -22
  145. package/server/routes/map/widgets/get.widget.js +40 -40
  146. package/server/routes/root.mjs +3 -3
  147. 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
+ }