@opengis/gis 0.2.91 → 0.2.93
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.
- package/README.md +5 -5
- package/dist/index.css +1 -1
- package/dist/index.js +7238 -6834
- package/dist/index.umd.cjs +66 -66
- package/module/cls.json +6 -6
- package/module/gis/card/gis.metadata.table/index.yml +22 -22
- package/module/gis/card/gis.metadata.table/main_info.hbs +20 -20
- package/module/gis/card/gis.metadata.table/metadata_info.hbs +27 -27
- package/module/gis/card/gis.metadata.table/other.hbs +25 -25
- package/module/gis/card/gis.rasters.table/index.yml +11 -11
- package/module/gis/card/gis.rasters.table/main_info.hbs +27 -27
- package/module/gis/card/gis.registers.table/cls.hbs +36 -36
- package/module/gis/card/gis.registers.table/columns.hbs +89 -89
- package/module/gis/card/gis.registers.table/filters.hbs +80 -80
- package/module/gis/card/gis.registers.table/index.yml +23 -23
- package/module/gis/card/gis.registers.table/main_info.hbs +35 -35
- package/module/gis/card/gis.registers.table/source.hbs +45 -45
- package/module/gis/card/gis.services.table/attributes.hbs +91 -91
- package/module/gis/card/gis.services.table/filters.hbs +83 -83
- package/module/gis/card/gis.services.table/index.yml +25 -25
- package/module/gis/card/gis.services.table/main_info.hbs +27 -27
- package/module/gis/card/gis.services.table/source.hbs +25 -25
- package/module/gis/cls/bool.yes_no.json +12 -12
- package/module/gis/cls/encoding.json +14 -14
- package/module/gis/cls/geom_type.json +14 -14
- package/module/gis/cls/gis.column_type.json +34 -34
- package/module/gis/cls/gis.column_view_type.json +26 -26
- package/module/gis/cls/gis.filter_type.json +22 -22
- package/module/gis/cls/language.json +10 -10
- package/module/gis/cls/meta.service_type.json +42 -42
- package/module/gis/cls/ogc.service.json +21 -21
- package/module/gis/cls/service_type.json +42 -42
- package/module/gis/cls/source_type.json +10 -10
- package/module/gis/cls/standarts.json +6 -6
- package/module/gis/cls/topic_category.json +106 -106
- package/module/gis/cls/update_frequency.json +29 -29
- package/module/gis/cls/view.json +21 -21
- package/module/gis/form/gis.cartocss.form.json +39 -39
- package/module/gis/form/gis.group_list.form.json +17 -17
- package/module/gis/form/gis.maps.form.json +61 -61
- package/module/gis/form/gis.metadata.form.json +240 -240
- package/module/gis/form/gis.ogc_service.form.json +45 -45
- package/module/gis/form/gis.rasters.form.json +76 -76
- package/module/gis/form/gis.registers.form.json +124 -124
- package/module/gis/form/gis.registers_column.form.json +84 -84
- package/module/gis/form/gis.registers_filter.form.json +65 -65
- package/module/gis/form/gis.services.form.json +111 -111
- package/module/gis/form/gis.services_attributes.form.json +75 -75
- package/module/gis/form/gis.services_filter.form.json +65 -65
- package/module/gis/menu.json +43 -43
- package/module/gis/select/admin.cls.name.sql +2 -2
- package/module/gis/select/pg.columns.parent.sql +6 -6
- package/module/gis/select/pg.table_name.sql +17 -17
- package/module/gis/select/service_id.sql +1 -1
- package/module/gis/table/gis.cartocss.table.json +74 -74
- package/module/gis/table/gis.group_list.table.json +58 -58
- package/module/gis/table/gis.maps.table.json +111 -111
- package/module/gis/table/gis.metadata.table.json +70 -70
- package/module/gis/table/gis.ogc_service.table.json +100 -100
- package/module/gis/table/gis.rasters.table.json +101 -101
- package/module/gis/table/gis.registers.table.json +144 -144
- package/module/gis/table/gis.services.table.json +121 -121
- package/module/gis/table/site.gis.registers.table.json +88 -88
- package/module/gis/table/site.gis.services.table.json +106 -106
- package/module/gis/templates/ISO19136_2017_gml_template.xml +330 -330
- package/module/gis/tokens.yml +5 -5
- package/module/permissions/form/permissions.users.form.json +151 -151
- package/module/permissions/table/gis.permissions.table.json +98 -98
- package/module/test/cls/bp_build_type.json +37 -37
- package/module/test/cls/doc_status.json +31 -31
- package/module/test/cls/ts.temp_status.json +18 -18
- package/module/test/cls/ts.temp_structure.ts_class.json +49 -49
- package/module/test/cls/ts.temp_type.json +9 -9
- package/module/test/layer/bp.json +59 -59
- package/module/test/layer/bp1.yml +33 -33
- package/module/test/layer/individual.yml +53 -53
- package/module/test/layer/ts.linking_passport.yml +55 -55
- package/module/test/layer/ts.temp_structure.yml +50 -50
- package/module/test/map/addr.yml +21 -21
- package/module/test/map/bp_myo.json +43 -43
- package/module/test/map/bpf.json +43 -43
- package/module/test/map/main.json +36 -36
- package/module/test/map/mbd.json +91 -91
- package/module/test/map/ts.json +52 -52
- package/module/test/select/address_id.json +2 -2
- package/module/test/select/address_id.sql +7 -7
- package/module/test/select/core.user_uid.sql +1 -1
- package/module/test/table/data_address.street.table.json +69 -69
- package/module/test/table/data_bp_myo.bp.table.json +122 -122
- package/package.json +76 -76
- package/plugin.js +49 -49
- package/server/migrations/array_intersect.sql +13 -13
- package/server/migrations/cartocss.sql +25 -25
- package/server/migrations/group_list.sql +74 -74
- package/server/migrations/maps.sql +30 -30
- package/server/migrations/metadata.sql +416 -0
- package/server/migrations/ogc.sql +106 -106
- package/server/migrations/rasters.sql +265 -265
- package/server/migrations/services.sql +247 -247
- package/server/migrations/services_users_rel.sql +22 -22
- package/server/migrations/widgets.sql +20 -20
- package/server/plugins/crons.js +21 -21
- package/server/plugins/mapnik/funcs/checkRasterFile.js +108 -108
- package/server/plugins/mapnik/funcs/mapnik.js +146 -146
- package/server/plugins/mapnik/funcs/rootFolder.mjs +8 -8
- package/server/plugins/mapnik/map.proto +231 -231
- package/server/plugins/vite.js +75 -75
- package/server/routes/gis/cartocss/add.cartocss.js +39 -39
- package/server/routes/gis/cartocss/get.cartocss.js +49 -49
- package/server/routes/gis/checkXML.js +118 -0
- package/server/routes/gis/dashboard.js +29 -29
- package/server/routes/gis/index.mjs +87 -73
- package/server/routes/gis/metadata/editMetadata.js +34 -0
- package/server/routes/gis/metadata/metadataXML.js +13 -13
- package/server/routes/gis/ogc/map.info.point.js +124 -124
- package/server/routes/gis/registers/add.registry.js +35 -35
- package/server/routes/gis/registers/del.registry.js +14 -14
- package/server/routes/gis/registers/funcs/classifiers.js +100 -100
- package/server/routes/gis/registers/funcs/columns.js +4 -4
- package/server/routes/gis/registers/funcs/content.type.js +9 -9
- package/server/routes/gis/registers/funcs/get.info.js +89 -89
- package/server/routes/gis/registers/funcs/handleRegistryRequest.js +146 -146
- package/server/routes/gis/registers/gis.export.js +148 -148
- package/server/routes/gis/registers/gis.registry.js +64 -64
- package/server/routes/gis/registers/gis.registry.list.js +59 -59
- package/server/routes/gis/registers/insert.columns.js +107 -107
- package/server/routes/gis/registers/insert.filters.js +110 -110
- package/server/routes/gis/registers/map.registry.js +79 -79
- package/server/routes/gis/services/add.service.js +64 -64
- package/server/routes/gis/services/del.service.js +12 -12
- package/server/routes/gis/services/get.layer.geom.js +27 -27
- package/server/routes/gis/services/get.services.col.js +33 -33
- package/server/routes/gis/services/get.services.js +84 -84
- package/server/routes/gis/services/legend.auto.js +77 -77
- package/server/routes/map/controllers/geojson.js +187 -187
- package/server/routes/map/controllers/jsonData.js +205 -205
- package/server/routes/map/controllers/layerList.js +103 -103
- package/server/routes/map/controllers/map.js +123 -123
- package/server/routes/map/controllers/mapCatalog.js +72 -72
- package/server/routes/map/controllers/mapCatalogAttribute.js +55 -55
- package/server/routes/map/controllers/mapFeatures.js +128 -128
- package/server/routes/map/controllers/mapFormat.js +225 -222
- package/server/routes/map/controllers/mapTiles.js +152 -152
- package/server/routes/map/controllers/maps.js +15 -15
- package/server/routes/map/controllers/marker_icon.js +43 -43
- package/server/routes/map/controllers/vtile.js +172 -172
- package/server/routes/map/index.mjs +142 -142
- package/server/routes/map/maps/add.map.js +43 -43
- package/server/routes/map/maps/del.map.js +18 -18
- package/server/routes/map/maps/get.map.js +112 -112
- package/server/routes/map/vtile1.js +176 -176
- package/server/routes/map/widgets/add.widget.js +38 -38
- package/server/routes/map/widgets/del.widget.js +22 -22
- package/server/routes/map/widgets/get.widget.js +40 -40
- package/server/routes/mapnik/controllers/clearTiles.js +94 -94
- package/server/routes/mapnik/controllers/createXml.js +66 -66
- package/server/routes/mapnik/controllers/createXmlMulti.js +75 -75
- package/server/routes/mapnik/controllers/fileSearch.js +34 -34
- package/server/routes/mapnik/controllers/fileStat.js +27 -27
- package/server/routes/mapnik/controllers/mapnikLogger.js +29 -29
- package/server/routes/mapnik/controllers/mapnikStat.js +20 -20
- package/server/routes/mapnik/controllers/rasterInfo.js +50 -50
- package/server/routes/mapnik/controllers/readDir.js +19 -19
- package/server/routes/mapnik/controllers/rtile.js +122 -122
- package/server/routes/mapnik/controllers/uploadRaster.js +157 -157
- package/server/routes/mapnik/functions/cartoBounds.js +23 -23
- package/server/routes/mapnik/functions/uploadXML.js +110 -110
- package/server/routes/mapnik/index.js +28 -28
- package/server/routes/permissions/controllers/catalog.permissions.edit.js +22 -22
- package/server/routes/permissions/controllers/catalog.permissions.js +7 -7
- package/server/routes/permissions/controllers/gis.catalog.js +80 -80
- package/server/routes/permissions/controllers/utils/get.permissions.js +43 -43
- package/server/routes/permissions/index.mjs +18 -18
- package/server/routes/root.mjs +3 -3
- package/utils.js +13 -13
|
@@ -1,124 +1,124 @@
|
|
|
1
|
-
import {
|
|
2
|
-
pgClients, handlebars, getMeta, getTemplate, getFilterSQL,
|
|
3
|
-
} from '@opengis/fastify-table/utils.js';
|
|
4
|
-
|
|
5
|
-
const columnType = {
|
|
6
|
-
text: 'text',
|
|
7
|
-
date: 'date',
|
|
8
|
-
bool: 'yes/no',
|
|
9
|
-
numeric: 'number',
|
|
10
|
-
integer: 'number',
|
|
11
|
-
'timestamp without time zone': 'date',
|
|
12
|
-
'timestamp with time zone': 'date',
|
|
13
|
-
};
|
|
14
|
-
|
|
15
|
-
export default async function mapInfoPoint(req, reply) {
|
|
16
|
-
const { pg = pgClients.client, query = {} } = req;
|
|
17
|
-
const {
|
|
18
|
-
x, y, layers, index = 0,
|
|
19
|
-
} = query;
|
|
20
|
-
const time = Date.now();
|
|
21
|
-
|
|
22
|
-
if (!x || !y || !layers) {
|
|
23
|
-
return reply.status(400).send('not enough query params: x, y, layers are required');
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const rows = pg?.pk?.['gis.ogc_service'] ? await pg.query('select * from gis.ogc_service WHERE enabled and table_name is not null and ogc_service_id = any($1)', [layers.split(',')]).then(el => el.rows || []) : [];
|
|
27
|
-
|
|
28
|
-
if (!rows.length) {
|
|
29
|
-
return reply.status(404).send('layers not found');
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const point = `srid=4326;point(${x} ${y})`; // 30, 50
|
|
33
|
-
|
|
34
|
-
const srids = pg.queryCache ? await pg.queryCache('select json_agg(srid) as srids from spatial_ref_sys').then(el => el.rows?.[0]?.srids || {}) : {};
|
|
35
|
-
|
|
36
|
-
await Promise.all(rows.map(async (layer, idx) => {
|
|
37
|
-
const { table_name: source, ogc_service_id: layerId } = layer;
|
|
38
|
-
const loadTable = await getTemplate('table', source);
|
|
39
|
-
const meta = await getMeta({ pg, table: loadTable?.table || source });
|
|
40
|
-
const { geom = 'geom' } = meta || {};
|
|
41
|
-
const { table = source, columns = meta?.columns } = loadTable || {};
|
|
42
|
-
const { srid, x } = await pg.query(`select st_srid(${geom}) as srid, st_x(st_pointonsurface(${geom})) as x from ${table} where geom is not null limit 1`).then(el => el.rows?.[0] || {});
|
|
43
|
-
|
|
44
|
-
const cls = columns
|
|
45
|
-
?.filter(el => el.name && el.data)
|
|
46
|
-
?.reduce?.((acc, curr) => ({ ...acc, [curr.name]: curr.data }), {});
|
|
47
|
-
|
|
48
|
-
const pk = pg.pk?.[table] || loadTable?.key;
|
|
49
|
-
|
|
50
|
-
const { optimizedSQL } = await getFilterSQL({ pg, table: source, query: layer?.query });
|
|
51
|
-
|
|
52
|
-
Object.assign(layer, {
|
|
53
|
-
layer: (layerId || idx.toString())?.replace?.(/'/g, "''"),
|
|
54
|
-
table,
|
|
55
|
-
pk,
|
|
56
|
-
cls,
|
|
57
|
-
geomColumn: srid === 4326 ? geom : `st_transform(${geom},4326)`,
|
|
58
|
-
optimizedSQL,
|
|
59
|
-
srid,
|
|
60
|
-
step: srids?.includes?.(srid - 0) && srid !== 4326 && x > 100 ? 10 : 0.0002,
|
|
61
|
-
});
|
|
62
|
-
}));
|
|
63
|
-
|
|
64
|
-
const unique = rows.filter((el, idx, arr) => el.table && arr.map((item) => item.table).indexOf(el.table) === idx);
|
|
65
|
-
|
|
66
|
-
const qList = unique.map((el) => ({
|
|
67
|
-
query: `select ${el.pk}::text as pk, '${el.layer}' as layer, '${el.table}' as table,
|
|
68
|
-
row_to_json(t) as data,
|
|
69
|
-
st_distance(${el.geomColumn},'${point.replace(/'/g, "''")}') as distance,
|
|
70
|
-
st_asgeojson(${el.geomColumn})::json as geom from (${el.optimizedSQL}) t
|
|
71
|
-
where 1=1`,
|
|
72
|
-
queryCount: `select 1 from (${el.optimizedSQL})t where 1=1`,
|
|
73
|
-
/* where: `case
|
|
74
|
-
when ST_GeometryType(${el.geomColumn}) in ('ST_Polygon','ST_MultiPolygon')
|
|
75
|
-
then st_intersects(${el.geomColumn},st_buffer('${point.replace(/'/g, "''")}',${el.step}))
|
|
76
|
-
|
|
77
|
-
when ST_GeometryType(${el.geomColumn}) in ('ST_Line','ST_MultiLineString', 'ST_MultiPoint', 'ST_Point')
|
|
78
|
-
then st_distance(${el.geomColumn},'${point.replace(/'/g, "''")}') < ${el.step}
|
|
79
|
-
else false
|
|
80
|
-
end`, */
|
|
81
|
-
where: `${el.geomColumn} && '${point.replace(/'/g, "''")}'`,
|
|
82
|
-
}));
|
|
83
|
-
|
|
84
|
-
const q = qList.map(el => `${el.query} and ${el.where}`).join(' union all ').concat(` order by distance limit 1 offset ${Math.max(+index || 0, 0)}`);
|
|
85
|
-
|
|
86
|
-
const qCount = qList.map(el => `${el.queryCount} and ${el.where}`).join(' union all ');
|
|
87
|
-
|
|
88
|
-
if (query.sql === '1') return q;
|
|
89
|
-
if (query.sql === '2') return qCount;
|
|
90
|
-
|
|
91
|
-
const count = await pg.query(qCount).then(el => el.rowCount);
|
|
92
|
-
|
|
93
|
-
const row = await pg.query(q).then(el => el.rows?.[0]);
|
|
94
|
-
|
|
95
|
-
if (!row) {
|
|
96
|
-
return reply.status(404).send('object not found');
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const { columns = [] } = await getMeta({ pg, table: row.table }) || {};
|
|
100
|
-
const fields = columns.map(({ name, dataTypeID, title }) => ({ name, type: columnType[pg.pgType?.[dataTypeID] || 'text'], label: title || name }));
|
|
101
|
-
|
|
102
|
-
const htmlTemplate = pg?.pk?.['admin.templates'] && row.layer && false
|
|
103
|
-
? await pg.query('select body from admin.templates where name=$1 limit 1', [row.layer]).then(el => el.rows?.[0]?.body)
|
|
104
|
-
: rows.find(el => el.ogc_service_id === row.layer)?.html;
|
|
105
|
-
|
|
106
|
-
const html = await handlebars.compile(htmlTemplate || 'template not found')(row.data);
|
|
107
|
-
|
|
108
|
-
const res = {
|
|
109
|
-
time: Date.now() - time,
|
|
110
|
-
index,
|
|
111
|
-
count,
|
|
112
|
-
data: {
|
|
113
|
-
layer: row.layer,
|
|
114
|
-
geom: row.geom,
|
|
115
|
-
id: row.pk,
|
|
116
|
-
distance: row.distance,
|
|
117
|
-
data: row.data,
|
|
118
|
-
},
|
|
119
|
-
fields,
|
|
120
|
-
html,
|
|
121
|
-
};
|
|
122
|
-
|
|
123
|
-
return res;
|
|
124
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
pgClients, handlebars, getMeta, getTemplate, getFilterSQL,
|
|
3
|
+
} from '@opengis/fastify-table/utils.js';
|
|
4
|
+
|
|
5
|
+
const columnType = {
|
|
6
|
+
text: 'text',
|
|
7
|
+
date: 'date',
|
|
8
|
+
bool: 'yes/no',
|
|
9
|
+
numeric: 'number',
|
|
10
|
+
integer: 'number',
|
|
11
|
+
'timestamp without time zone': 'date',
|
|
12
|
+
'timestamp with time zone': 'date',
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export default async function mapInfoPoint(req, reply) {
|
|
16
|
+
const { pg = pgClients.client, query = {} } = req;
|
|
17
|
+
const {
|
|
18
|
+
x, y, layers, index = 0,
|
|
19
|
+
} = query;
|
|
20
|
+
const time = Date.now();
|
|
21
|
+
|
|
22
|
+
if (!x || !y || !layers) {
|
|
23
|
+
return reply.status(400).send('not enough query params: x, y, layers are required');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const rows = pg?.pk?.['gis.ogc_service'] ? await pg.query('select * from gis.ogc_service WHERE enabled and table_name is not null and ogc_service_id = any($1)', [layers.split(',')]).then(el => el.rows || []) : [];
|
|
27
|
+
|
|
28
|
+
if (!rows.length) {
|
|
29
|
+
return reply.status(404).send('layers not found');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const point = `srid=4326;point(${x} ${y})`; // 30, 50
|
|
33
|
+
|
|
34
|
+
const srids = pg.queryCache ? await pg.queryCache('select json_agg(srid) as srids from spatial_ref_sys').then(el => el.rows?.[0]?.srids || {}) : {};
|
|
35
|
+
|
|
36
|
+
await Promise.all(rows.map(async (layer, idx) => {
|
|
37
|
+
const { table_name: source, ogc_service_id: layerId } = layer;
|
|
38
|
+
const loadTable = await getTemplate('table', source);
|
|
39
|
+
const meta = await getMeta({ pg, table: loadTable?.table || source });
|
|
40
|
+
const { geom = 'geom' } = meta || {};
|
|
41
|
+
const { table = source, columns = meta?.columns } = loadTable || {};
|
|
42
|
+
const { srid, x } = await pg.query(`select st_srid(${geom}) as srid, st_x(st_pointonsurface(${geom})) as x from ${table} where geom is not null limit 1`).then(el => el.rows?.[0] || {});
|
|
43
|
+
|
|
44
|
+
const cls = columns
|
|
45
|
+
?.filter(el => el.name && el.data)
|
|
46
|
+
?.reduce?.((acc, curr) => ({ ...acc, [curr.name]: curr.data }), {});
|
|
47
|
+
|
|
48
|
+
const pk = pg.pk?.[table] || loadTable?.key;
|
|
49
|
+
|
|
50
|
+
const { optimizedSQL } = await getFilterSQL({ pg, table: source, query: layer?.query });
|
|
51
|
+
|
|
52
|
+
Object.assign(layer, {
|
|
53
|
+
layer: (layerId || idx.toString())?.replace?.(/'/g, "''"),
|
|
54
|
+
table,
|
|
55
|
+
pk,
|
|
56
|
+
cls,
|
|
57
|
+
geomColumn: srid === 4326 ? geom : `st_transform(${geom},4326)`,
|
|
58
|
+
optimizedSQL,
|
|
59
|
+
srid,
|
|
60
|
+
step: srids?.includes?.(srid - 0) && srid !== 4326 && x > 100 ? 10 : 0.0002,
|
|
61
|
+
});
|
|
62
|
+
}));
|
|
63
|
+
|
|
64
|
+
const unique = rows.filter((el, idx, arr) => el.table && arr.map((item) => item.table).indexOf(el.table) === idx);
|
|
65
|
+
|
|
66
|
+
const qList = unique.map((el) => ({
|
|
67
|
+
query: `select ${el.pk}::text as pk, '${el.layer}' as layer, '${el.table}' as table,
|
|
68
|
+
row_to_json(t) as data,
|
|
69
|
+
st_distance(${el.geomColumn},'${point.replace(/'/g, "''")}') as distance,
|
|
70
|
+
st_asgeojson(${el.geomColumn})::json as geom from (${el.optimizedSQL}) t
|
|
71
|
+
where 1=1`,
|
|
72
|
+
queryCount: `select 1 from (${el.optimizedSQL})t where 1=1`,
|
|
73
|
+
/* where: `case
|
|
74
|
+
when ST_GeometryType(${el.geomColumn}) in ('ST_Polygon','ST_MultiPolygon')
|
|
75
|
+
then st_intersects(${el.geomColumn},st_buffer('${point.replace(/'/g, "''")}',${el.step}))
|
|
76
|
+
|
|
77
|
+
when ST_GeometryType(${el.geomColumn}) in ('ST_Line','ST_MultiLineString', 'ST_MultiPoint', 'ST_Point')
|
|
78
|
+
then st_distance(${el.geomColumn},'${point.replace(/'/g, "''")}') < ${el.step}
|
|
79
|
+
else false
|
|
80
|
+
end`, */
|
|
81
|
+
where: `${el.geomColumn} && '${point.replace(/'/g, "''")}'`,
|
|
82
|
+
}));
|
|
83
|
+
|
|
84
|
+
const q = qList.map(el => `${el.query} and ${el.where}`).join(' union all ').concat(` order by distance limit 1 offset ${Math.max(+index || 0, 0)}`);
|
|
85
|
+
|
|
86
|
+
const qCount = qList.map(el => `${el.queryCount} and ${el.where}`).join(' union all ');
|
|
87
|
+
|
|
88
|
+
if (query.sql === '1') return q;
|
|
89
|
+
if (query.sql === '2') return qCount;
|
|
90
|
+
|
|
91
|
+
const count = await pg.query(qCount).then(el => el.rowCount);
|
|
92
|
+
|
|
93
|
+
const row = await pg.query(q).then(el => el.rows?.[0]);
|
|
94
|
+
|
|
95
|
+
if (!row) {
|
|
96
|
+
return reply.status(404).send('object not found');
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const { columns = [] } = await getMeta({ pg, table: row.table }) || {};
|
|
100
|
+
const fields = columns.map(({ name, dataTypeID, title }) => ({ name, type: columnType[pg.pgType?.[dataTypeID] || 'text'], label: title || name }));
|
|
101
|
+
|
|
102
|
+
const htmlTemplate = pg?.pk?.['admin.templates'] && row.layer && false
|
|
103
|
+
? await pg.query('select body from admin.templates where name=$1 limit 1', [row.layer]).then(el => el.rows?.[0]?.body)
|
|
104
|
+
: rows.find(el => el.ogc_service_id === row.layer)?.html;
|
|
105
|
+
|
|
106
|
+
const html = await handlebars.compile(htmlTemplate || 'template not found')(row.data);
|
|
107
|
+
|
|
108
|
+
const res = {
|
|
109
|
+
time: Date.now() - time,
|
|
110
|
+
index,
|
|
111
|
+
count,
|
|
112
|
+
data: {
|
|
113
|
+
layer: row.layer,
|
|
114
|
+
geom: row.geom,
|
|
115
|
+
id: row.pk,
|
|
116
|
+
distance: row.distance,
|
|
117
|
+
data: row.data,
|
|
118
|
+
},
|
|
119
|
+
fields,
|
|
120
|
+
html,
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
return res;
|
|
124
|
+
}
|
|
@@ -1,36 +1,36 @@
|
|
|
1
|
-
import { dataInsert, dataUpdate, pgClients } from "@opengis/fastify-table/utils.js";
|
|
2
|
-
|
|
3
|
-
export default async function addGisRegistry({
|
|
4
|
-
method, params = {}, body, pg = pgClients.client, user = {},
|
|
5
|
-
}, reply) {
|
|
6
|
-
if (method === 'POST') {
|
|
7
|
-
|
|
8
|
-
if (!body?.register_key) {
|
|
9
|
-
return reply.status(400).send('not enough body params: register_key');
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
const { rows = [] } = await dataInsert({
|
|
13
|
-
pg,
|
|
14
|
-
table: 'gis.registers',
|
|
15
|
-
data: body,
|
|
16
|
-
uid: user?.uid,
|
|
17
|
-
});
|
|
18
|
-
return reply.status(200).send(rows[0]);
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
if (!params.slug) {
|
|
22
|
-
return reply.status(400).send('not enough params: slug');
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const id = await pg.query('select register_id from gis.registers where register_key=$1', [params.slug]).then(el => el.rows?.[0]?.register_id) || params.slug;
|
|
26
|
-
|
|
27
|
-
const row = await dataUpdate({
|
|
28
|
-
pg,
|
|
29
|
-
id,
|
|
30
|
-
table: 'gis.registers',
|
|
31
|
-
data: body,
|
|
32
|
-
uid: user?.uid,
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
return reply.status(200).send(row);
|
|
1
|
+
import { dataInsert, dataUpdate, pgClients } from "@opengis/fastify-table/utils.js";
|
|
2
|
+
|
|
3
|
+
export default async function addGisRegistry({
|
|
4
|
+
method, params = {}, body, pg = pgClients.client, user = {},
|
|
5
|
+
}, reply) {
|
|
6
|
+
if (method === 'POST') {
|
|
7
|
+
|
|
8
|
+
if (!body?.register_key) {
|
|
9
|
+
return reply.status(400).send('not enough body params: register_key');
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
const { rows = [] } = await dataInsert({
|
|
13
|
+
pg,
|
|
14
|
+
table: 'gis.registers',
|
|
15
|
+
data: body,
|
|
16
|
+
uid: user?.uid,
|
|
17
|
+
});
|
|
18
|
+
return reply.status(200).send(rows[0]);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (!params.slug) {
|
|
22
|
+
return reply.status(400).send('not enough params: slug');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const id = await pg.query('select register_id from gis.registers where register_key=$1', [params.slug]).then(el => el.rows?.[0]?.register_id) || params.slug;
|
|
26
|
+
|
|
27
|
+
const row = await dataUpdate({
|
|
28
|
+
pg,
|
|
29
|
+
id,
|
|
30
|
+
table: 'gis.registers',
|
|
31
|
+
data: body,
|
|
32
|
+
uid: user?.uid,
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
return reply.status(200).send(row);
|
|
36
36
|
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { dataDelete, pgClients } from "@opengis/fastify-table/utils.js";
|
|
2
|
-
|
|
3
|
-
export default async function deleteGisRegistry({
|
|
4
|
-
params = {}, pg = pgClients.client, user = {},
|
|
5
|
-
}, reply) {
|
|
6
|
-
const id = await pg.query('select register_id from gis.registers where register_key=$1', [params.slug]).then(el => el.rows?.[0]?.register_id) || params.slug;
|
|
7
|
-
|
|
8
|
-
const row = await dataDelete({
|
|
9
|
-
pg,
|
|
10
|
-
id,
|
|
11
|
-
table: 'gis.registers',
|
|
12
|
-
uid: user?.uid,
|
|
13
|
-
});
|
|
14
|
-
return reply.status(200).send(row);
|
|
1
|
+
import { dataDelete, pgClients } from "@opengis/fastify-table/utils.js";
|
|
2
|
+
|
|
3
|
+
export default async function deleteGisRegistry({
|
|
4
|
+
params = {}, pg = pgClients.client, user = {},
|
|
5
|
+
}, reply) {
|
|
6
|
+
const id = await pg.query('select register_id from gis.registers where register_key=$1', [params.slug]).then(el => el.rows?.[0]?.register_id) || params.slug;
|
|
7
|
+
|
|
8
|
+
const row = await dataDelete({
|
|
9
|
+
pg,
|
|
10
|
+
id,
|
|
11
|
+
table: 'gis.registers',
|
|
12
|
+
uid: user?.uid,
|
|
13
|
+
});
|
|
14
|
+
return reply.status(200).send(row);
|
|
15
15
|
}
|
|
@@ -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 }) {
|
|
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, { 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 }) {
|
|
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, { 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,5 +1,5 @@
|
|
|
1
|
-
export function extractVisibleColumns(columns, mode = "table") {
|
|
2
|
-
return columns.filter((col) =>
|
|
3
|
-
mode === "card" ? col.hidden_card !== true : col.hidden_register !== true
|
|
4
|
-
);
|
|
1
|
+
export function extractVisibleColumns(columns, mode = "table") {
|
|
2
|
+
return columns.filter((col) =>
|
|
3
|
+
mode === "card" ? col.hidden_card !== true : col.hidden_register !== true
|
|
4
|
+
);
|
|
5
5
|
}
|
|
@@ -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;
|