@opengis/gis 0.2.18 → 0.2.20

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