@opengis/gis 0.2.167 → 0.2.169

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 (249) hide show
  1. package/dist/{CardIcon-golqfa-Y.js → CardIcon-xkRDr3_E.js} +1 -1
  2. package/dist/{EntityTablePage-BhmxePgR.js → EntityTablePage-D1IR5Bmq.js} +1 -1
  3. package/dist/{ExtentOutlineLayer.vue_vue_type_script_setup_true_lang-BFa27smR.js → ExtentOutlineLayer.vue_vue_type_script_setup_true_lang-BJKIgAkD.js} +1 -1
  4. package/dist/{HeaderActions.vue_vue_type_script_setup_true_lang-Dp0MjgnU.js → HeaderActions.vue_vue_type_script_setup_true_lang-BU8__ouG.js} +1 -1
  5. package/dist/{MapSettings-F_DT3xKl.js → MapSettings-DIOlNpt6.js} +1 -1
  6. package/dist/{RastersTablePage-3rXQ0baG.js → RastersTablePage-OD1VqHP8.js} +1 -1
  7. package/dist/{cartocss-CN-UrS7V.js → cartocss-BiamDcNB.js} +5 -5
  8. package/dist/{import-utils-F5ErbNz1.js → import-utils-CvUG1jV0.js} +1 -1
  9. package/dist/{index-CdB0VXro.js → index-C6W8IkTm.js} +1224 -1221
  10. package/dist/index.css +1 -1
  11. package/dist/index.js +1 -1
  12. package/dist/index.umd.cjs +53 -40
  13. package/dist/{raster-DWmiWlf7.js → raster-BbIiZGoX.js} +3 -3
  14. package/dist/{register-D1jLD0hK.js → register-Dt2QoLZ3.js} +3 -3
  15. package/dist/service-CdUYntMi.js +3472 -0
  16. package/dist/{vs-datatable-BWItxbtK.js → vs-datatable-BELnJrfM.js} +2 -3
  17. package/module/gis/card/gis.metadata.table/index.yml +22 -22
  18. package/module/gis/card/gis.rasters.table/index.yml +11 -11
  19. package/module/gis/card/gis.registers.table/index.yml +23 -23
  20. package/module/gis/card/gis.services.table/index.yml +25 -25
  21. package/module/gis/cls/bool.yes_no.json +12 -12
  22. package/module/gis/cls/encoding.json +14 -14
  23. package/module/gis/cls/geom_type.json +14 -14
  24. package/module/gis/cls/gis.column_type.json +34 -34
  25. package/module/gis/cls/gis.column_view_type.json +26 -26
  26. package/module/gis/cls/gis.filter_type.json +22 -22
  27. package/module/gis/cls/language.json +10 -10
  28. package/module/gis/cls/meta.service_type.json +42 -42
  29. package/module/gis/cls/ogc.service.json +21 -21
  30. package/module/gis/cls/source_type.json +10 -10
  31. package/module/gis/cls/standarts.json +6 -6
  32. package/module/gis/cls/topic_category.json +106 -106
  33. package/module/gis/cls/update_frequency.json +29 -29
  34. package/module/gis/cls/view.json +21 -21
  35. package/module/gis/form/feedback.answer.form.json +10 -10
  36. package/module/gis/form/gis.cartocss.form.json +64 -64
  37. package/module/gis/form/gis.group_list.form.json +17 -17
  38. package/module/gis/form/gis.maps.form.json +61 -61
  39. package/module/gis/form/gis.metadata.form.json +240 -240
  40. package/module/gis/form/gis.metadata_new.form.json +195 -195
  41. package/module/gis/form/gis.ogc_service.form.json +51 -51
  42. package/module/gis/form/gis.rasters.form.json +76 -76
  43. package/module/gis/form/gis.registers.form.json +124 -124
  44. package/module/gis/form/gis.registers_column.form.json +84 -84
  45. package/module/gis/form/gis.registers_filter.form.json +65 -65
  46. package/module/gis/form/gis.services.form.json +111 -111
  47. package/module/gis/form/gis.services_attributes.form.json +75 -75
  48. package/module/gis/form/gis.services_filter.form.json +65 -65
  49. package/module/gis/menu.json +43 -43
  50. package/module/gis/select/admin.cls.name.sql +9 -9
  51. package/module/gis/select/layer_list.sql +7 -7
  52. package/module/gis/select/layer_list_text.sql +7 -7
  53. package/module/gis/select/pg.column_name.geometry.sql +12 -12
  54. package/module/gis/select/pg.columns.parent.sql +6 -6
  55. package/module/gis/select/pg.table_name.sql +17 -17
  56. package/module/gis/select/service_id.sql +1 -1
  57. package/module/gis/select/srid.sql +7 -7
  58. package/module/gis/table/gis.cartocss.table.json +74 -74
  59. package/module/gis/table/gis.group_list.table.json +58 -58
  60. package/module/gis/table/gis.maps.table.json +110 -110
  61. package/module/gis/table/gis.metadata.table.json +70 -70
  62. package/module/gis/table/gis.metadata_new.table.json +137 -137
  63. package/module/gis/table/gis.ogc_service.table.json +100 -100
  64. package/module/gis/table/gis.rasters.table.json +113 -113
  65. package/module/gis/table/gis.registers.table.json +143 -143
  66. package/module/gis/table/gis.services.table.json +120 -120
  67. package/module/gis/table/site.gis.registers.table.json +88 -88
  68. package/module/gis/table/site.gis.services.table.json +106 -106
  69. package/module/gis/templates/ISO19136_2017_gml_template.xml +330 -330
  70. package/module/gis/tokens.yml +5 -5
  71. package/module/permissions/form/permissions.users.form.json +151 -151
  72. package/module/permissions/table/gis.permissions.table.json +97 -97
  73. package/module/test/map/addr.json +303 -0
  74. package/module/test/map/{addr.yml → addr1.yml} +3 -1
  75. package/module/test/select/address.str_id.sql +3 -0
  76. package/package.json +10 -10
  77. package/plugin.js +21 -12
  78. package/server/plugins/mapnik/funcs/checkRasterFile.js +1 -3
  79. package/server/routes/cartocss/cartocss.route.js +31 -0
  80. package/server/routes/cartocss/cartocss.route.test.js +79 -0
  81. package/server/routes/cartocss/cartocss.schema.js +73 -0
  82. package/server/routes/{gis/cartocss → cartocss/functions}/add.cartocss.js +8 -11
  83. package/server/routes/{gis/cartocss → cartocss/functions}/get.cartocss.js +11 -13
  84. package/server/routes/gis/functions/checkXML.js +107 -0
  85. package/server/routes/gis/functions/dashboard.js +24 -0
  86. package/server/routes/gis/gis.route.js +26 -0
  87. package/server/routes/gis/gis.route.test.js +34 -0
  88. package/server/routes/gis/gis.schema.js +1 -0
  89. package/server/routes/map/{controllers → functions}/clearTiles.js +9 -8
  90. package/server/routes/map/{controllers → functions}/geojson.js +43 -43
  91. package/server/routes/map/{controllers → functions}/gis.convert.js +15 -23
  92. package/server/routes/map/{controllers → functions}/gis.icon.js +23 -10
  93. package/server/routes/map/{controllers → functions}/jsonData.js +72 -71
  94. package/server/routes/map/{controllers → functions}/layerList.js +17 -17
  95. package/server/routes/map/{controllers → functions}/map.js +8 -9
  96. package/server/routes/map/{controllers → functions}/mapCatalog.js +7 -7
  97. package/server/routes/map/functions/mapCatalogAttribute.js +54 -0
  98. package/server/routes/map/{controllers → functions}/mapFeatures.js +22 -18
  99. package/server/routes/map/{controllers → functions}/mapFormat.js +25 -28
  100. package/server/routes/map/{controllers → functions}/mapTiles.js +39 -30
  101. package/server/routes/map/{controllers → functions}/maps.js +3 -3
  102. package/server/routes/map/{controllers → functions}/marker_icon.js +1 -1
  103. package/server/routes/map/{controllers → functions}/parseGeoFile.js +10 -11
  104. package/server/routes/map/{controllers → functions}/pointHeight.js +3 -7
  105. package/server/routes/map/{controllers → functions}/vtile.js +5 -3
  106. package/server/routes/map/{vtile1.js → functions/vtile1.js} +39 -33
  107. package/server/routes/map/map.route.js +280 -0
  108. package/server/routes/map/map.route.test.js +503 -0
  109. package/server/routes/map/map.schema.js +356 -0
  110. package/server/routes/mapnik/{controllers → functions}/clearTiles.js +26 -29
  111. package/server/routes/mapnik/{controllers → functions}/createXml.js +17 -20
  112. package/server/routes/mapnik/{controllers → functions}/createXmlMulti.js +11 -15
  113. package/server/routes/mapnik/{controllers → functions}/fileSearch.js +6 -9
  114. package/server/routes/mapnik/functions/fileStat.js +28 -0
  115. package/server/routes/mapnik/{controllers → functions}/pretile.js +29 -35
  116. package/server/routes/mapnik/{controllers → functions}/rasterInfo.js +19 -10
  117. package/server/routes/mapnik/{controllers → functions}/readDir.js +4 -4
  118. package/server/routes/mapnik/functions/rtile.js +164 -0
  119. package/server/routes/mapnik/{controllers → functions}/uploadRaster.js +19 -24
  120. package/server/routes/mapnik/functions/uploadXML.js +27 -0
  121. package/server/routes/mapnik/mapnik.route.js +102 -0
  122. package/server/routes/mapnik/mapnik.route.test.js +371 -0
  123. package/server/routes/mapnik/mapnik.schema.mjs +190 -0
  124. package/server/routes/mapnik.prefixless/functions/mapnikLogger.js +31 -0
  125. package/server/routes/{mapnik/controllers → mapnik.prefixless/functions}/mapnikStat.js +7 -5
  126. package/server/routes/mapnik.prefixless/mapnik.prefixless.route.js +20 -0
  127. package/server/routes/mapnik.prefixless/mapnik.prefixless.route.test.js +91 -0
  128. package/server/routes/mapnik.prefixless/mapnik.prefixless.schema.mjs +27 -0
  129. package/server/routes/maps/functions/add.map.js +42 -0
  130. package/server/routes/{map/maps → maps/functions}/del.map.js +6 -7
  131. package/server/routes/{map/maps → maps/functions}/get.map.js +12 -11
  132. package/server/routes/maps/maps.route.js +58 -0
  133. package/server/routes/maps/maps.route.test.js +231 -0
  134. package/server/routes/maps/maps.schema.js +10 -0
  135. package/server/routes/metadata/functions/editMetadata.js +35 -0
  136. package/server/routes/metadata/functions/metadataXML.js +19 -0
  137. package/server/routes/metadata/metadata.route.js +26 -0
  138. package/server/routes/metadata/metadata.route.test.js +47 -0
  139. package/server/routes/metadata/metadata.schema.js +53 -0
  140. package/server/routes/{gis/ogc → ogc/functions}/map.info.point.js +22 -29
  141. package/server/routes/ogc/ogc.route.js +21 -0
  142. package/server/routes/ogc/ogc.route.test.js +54 -0
  143. package/server/routes/ogc/ogc.schema.js +16 -0
  144. package/server/routes/permissions/functions/catalog.permissions.edit.js +20 -0
  145. package/server/routes/permissions/functions/catalog.permissions.js +13 -0
  146. package/server/routes/permissions/{controllers → functions}/gis.catalog.js +10 -10
  147. package/server/routes/permissions/permissions.route.js +35 -0
  148. package/server/routes/permissions/permissions.route.test.js +35 -0
  149. package/server/routes/permissions/permissions.schema.js +44 -0
  150. package/server/routes/registers/functions/add.registry.js +37 -0
  151. package/server/routes/{gis/registers/funcs → registers/functions}/classifiers.js +2 -2
  152. package/server/routes/{gis/registers → registers/functions}/del.registry.js +5 -5
  153. package/server/routes/{gis/registers/funcs → registers/functions}/get.info.js +9 -5
  154. package/server/routes/{gis/registers → registers/functions}/gis.export.js +27 -21
  155. package/server/routes/{gis/registers → registers/functions}/gis.registry.js +22 -15
  156. package/server/routes/{gis/registers → registers/functions}/gis.registry.list.js +12 -10
  157. package/server/routes/{gis/registers/funcs → registers/functions}/handleRegistryRequest.js +12 -11
  158. package/server/routes/registers/registers.route.js +80 -0
  159. package/server/routes/registers/registers.route.test.js +145 -0
  160. package/server/routes/registers/registers.schema.js +246 -0
  161. package/server/routes/{gis/services → services/functions}/add.service.js +14 -16
  162. package/server/routes/services/functions/create.route.js +93 -0
  163. package/server/routes/{gis/services → services/functions}/del.service.js +5 -5
  164. package/server/routes/{gis/services → services/functions}/get.service.users.js +15 -13
  165. package/server/routes/services/functions/get.services.col.js +34 -0
  166. package/server/routes/{gis/services → services/functions}/get.services.js +21 -16
  167. package/server/routes/services/services.route.js +76 -0
  168. package/server/routes/services/services.route.test.js +168 -0
  169. package/server/routes/services/services.schema.js +278 -0
  170. package/server/routes/widgets/functions/add.widget.js +39 -0
  171. package/server/routes/widgets/functions/del.widget.js +18 -0
  172. package/server/routes/{map/widgets → widgets/functions}/get.widget.js +12 -11
  173. package/server/routes/widgets/widgets.route.js +61 -0
  174. package/server/routes/widgets/widgets.route.test.js +144 -0
  175. package/server/routes/widgets/widgets.schema.js +25 -0
  176. package/dist/service-JGNtth-y.js +0 -2593
  177. package/module/cls.json +0 -7
  178. package/module/gis/card/gis.metadata.table/main_info.hbs +0 -21
  179. package/module/gis/card/gis.metadata.table/metadata_info.hbs +0 -28
  180. package/module/gis/card/gis.metadata.table/other.hbs +0 -26
  181. package/module/gis/card/gis.rasters.table/main_info.hbs +0 -27
  182. package/module/gis/card/gis.registers.table/cls.hbs +0 -36
  183. package/module/gis/card/gis.registers.table/columns.hbs +0 -89
  184. package/module/gis/card/gis.registers.table/filters.hbs +0 -80
  185. package/module/gis/card/gis.registers.table/main_info.hbs +0 -35
  186. package/module/gis/card/gis.registers.table/source.hbs +0 -45
  187. package/module/gis/card/gis.services.table/attributes.hbs +0 -91
  188. package/module/gis/card/gis.services.table/filters.hbs +0 -83
  189. package/module/gis/card/gis.services.table/main_info.hbs +0 -27
  190. package/module/gis/card/gis.services.table/source.hbs +0 -26
  191. package/module/test/cls/bp_build_type.json +0 -37
  192. package/module/test/cls/doc_status.json +0 -32
  193. package/module/test/cls/ts.temp_status.json +0 -18
  194. package/module/test/cls/ts.temp_structure.ts_class.json +0 -50
  195. package/module/test/cls/ts.temp_type.json +0 -10
  196. package/module/test/layer/bp.json +0 -60
  197. package/module/test/layer/bp1.yml +0 -33
  198. package/module/test/layer/individual.yml +0 -54
  199. package/module/test/layer/ts.linking_passport.yml +0 -56
  200. package/module/test/layer/ts.temp_structure.yml +0 -51
  201. package/module/test/map/bp_myo.json +0 -44
  202. package/module/test/map/bpf.json +0 -44
  203. package/module/test/map/main.json +0 -39
  204. package/module/test/map/mbd.json +0 -92
  205. package/module/test/map/ts.json +0 -53
  206. package/module/test/select/address_id.json +0 -3
  207. package/module/test/select/address_id.sql +0 -8
  208. package/module/test/select/core.user_uid.sql +0 -1
  209. package/module/test/table/data_address.street.table.json +0 -70
  210. package/module/test/table/data_bp_myo.bp.table.json +0 -123
  211. package/server/routes/gis/checkXML.js +0 -117
  212. package/server/routes/gis/dashboard.js +0 -29
  213. package/server/routes/gis/index.mjs +0 -92
  214. package/server/routes/gis/metadata/editMetadata.js +0 -34
  215. package/server/routes/gis/metadata/metadataXML.js +0 -13
  216. package/server/routes/gis/registers/add.registry.js +0 -35
  217. package/server/routes/gis/registers/insert.columns.js +0 -107
  218. package/server/routes/gis/registers/insert.filters.js +0 -110
  219. package/server/routes/gis/services/create.route.js +0 -96
  220. package/server/routes/gis/services/get.services.col.js +0 -33
  221. package/server/routes/map/controllers/mapCatalogAttribute.js +0 -56
  222. package/server/routes/map/index.mjs +0 -259
  223. package/server/routes/map/maps/add.map.js +0 -43
  224. package/server/routes/map/widgets/add.widget.js +0 -39
  225. package/server/routes/map/widgets/del.widget.js +0 -23
  226. package/server/routes/mapnik/controllers/fileStat.js +0 -28
  227. package/server/routes/mapnik/controllers/mapnikLogger.js +0 -29
  228. package/server/routes/mapnik/controllers/rtile.js +0 -167
  229. package/server/routes/mapnik/index.js +0 -40
  230. package/server/routes/permissions/controllers/catalog.permissions.edit.js +0 -22
  231. package/server/routes/permissions/controllers/catalog.permissions.js +0 -8
  232. package/server/routes/permissions/index.mjs +0 -18
  233. /package/server/routes/map/{controllers/pin → pin}/circle1.svg +0 -0
  234. /package/server/routes/map/{controllers/pin → pin}/circle2.svg +0 -0
  235. /package/server/routes/map/{controllers/pin → pin}/none.svg +0 -0
  236. /package/server/routes/map/{controllers/pin → pin}/pin.svg +0 -0
  237. /package/server/routes/map/{controllers/pin → pin}/pin1.svg +0 -0
  238. /package/server/routes/map/{controllers/pin → pin}/pin2.svg +0 -0
  239. /package/server/routes/map/{controllers/pin → pin}/pin3.svg +0 -0
  240. /package/server/routes/map/{controllers/pin → pin}/pin4.svg +0 -0
  241. /package/server/routes/map/{controllers/pin → pin}/pin5.svg +0 -0
  242. /package/server/routes/map/{controllers/pin → pin}/pin6.svg +0 -0
  243. /package/server/routes/map/{controllers/pin → pin}/pin7.svg +0 -0
  244. /package/server/routes/permissions/{controllers/utils → functions}/get.permissions.js +0 -0
  245. /package/server/routes/{gis/registers/funcs → registers/functions}/columns.js +0 -0
  246. /package/server/routes/{gis/registers/funcs → registers/functions}/content.type.js +0 -0
  247. /package/server/routes/{gis/registers → registers/functions}/map.registry.js +0 -0
  248. /package/server/routes/{gis/services → services/functions}/get.layer.geom.js +0 -0
  249. /package/server/routes/{gis/services → services/functions}/legend.auto.js +0 -0
@@ -1,21 +1,26 @@
1
1
  import { pgClients, getTemplate } from "@opengis/fastify-table/utils.js";
2
+ import { BadRequestError, ConflictError, NotFoundError } from "@opengis/fastify-table/errors.js";
2
3
 
3
- import { handleRegistryRequest } from './funcs/handleRegistryRequest.js';
4
+ import { handleRegistryRequest } from './handleRegistryRequest.js';
4
5
 
5
6
  const maxLimit = 100;
6
7
  const defaultLimit = 9;
7
8
 
8
9
  export default async function gisRegistry({
9
- pg = pgClients.client, params = {}, query = {},
10
- }) {
11
- const { slug, objectId } = params;
12
- const { sql } = query;
10
+ slug, objectId, search, filter, sql, page, limit: queryLimit,
11
+ }, pg = pgClients.client) {
13
12
 
14
- const limit = Math.min(query.limit || defaultLimit, maxLimit);
15
- const offset = query.page && query.page > 0 && !objectId ? (query.page - 1) * limit : 0;
13
+ if (sql && process.platform !== 'win32') {
14
+ throw ConflictError('query.sql is not allowed');
15
+ }
16
+
17
+ const limit = Math.min(queryLimit || defaultLimit, maxLimit);
18
+
19
+ const offset = page && page > 0 && !objectId ? (page - 1) * limit : 0;
16
20
 
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');
21
+ if (!slug) {
22
+ throw BadRequestError('Params slug is required');
23
+ }
19
24
 
20
25
  const {
21
26
  rows: [registry],
@@ -31,23 +36,25 @@ export default async function gisRegistry({
31
36
  if (registry) {
32
37
  return handleRegistryRequest({
33
38
  settings: registry,
34
- query,
39
+ query: { search, filter },
35
40
  object_id: objectId,
36
41
  offset,
37
42
  limit,
38
- page: query.page,
43
+ page,
39
44
  pg,
40
45
  sql,
41
46
  });
42
47
  }
43
48
 
44
49
  const registryTemplate = await getTemplate('registry', slug);
45
- // if (!registryTemplate) return reply.code(404).send({ message: 'Template not found', status: 404 });
46
- if (!registryTemplate) throw new Error('Template not found');
50
+
51
+ if (!registryTemplate) {
52
+ throw NotFoundError('Template not found: ' + slug);
53
+ }
47
54
 
48
55
  return handleRegistryRequest({
49
56
  settings: registryTemplate,
50
- query,
57
+ query: { search, filter },
51
58
  object_id: objectId,
52
59
  register_key: registry.register_key,
53
60
  is_downloadable: registry?.is_downloadable || registryTemplate?.is_downloadable,
@@ -57,7 +64,7 @@ export default async function gisRegistry({
57
64
  service_id: registryTemplate.service_id,
58
65
  offset,
59
66
  limit,
60
- page: query.page,
67
+ page,
61
68
  pg,
62
69
  sql,
63
70
  });
@@ -1,9 +1,8 @@
1
+ import { NotFoundError } from "@opengis/fastify-table/errors.js";
1
2
  import { pgClients, getTemplatePath, getTemplate } from "@opengis/fastify-table/utils.js";
2
- const pg = pgClients.client;
3
3
 
4
- export default async function gisRegistryList(req = {}) {
5
- const { query = {} } = req;
6
- const { page = 1, limit = 9, search = '' } = query;
4
+ export default async function gisRegistryList({ page = 1, limit = 9, search = '' }, pg = pgClients.client) {
5
+
7
6
  const offset = limit * (page - 1);
8
7
 
9
8
  const dbResult = await pg.query(
@@ -14,14 +13,17 @@ export default async function gisRegistryList(req = {}) {
14
13
 
15
14
  let templates = dbResult?.rows;
16
15
  let fromDatabase = true;
17
-
16
+
18
17
  if (!templates?.length) {
19
18
  fromDatabase = false;
20
19
 
21
- const registryListTemplate = await getTemplatePath('registry');
22
- if (!registryListTemplate?.length) throw new Error('Templates not found');
20
+ const registryListTemplate = getTemplatePath('registry');
21
+
22
+ if (!registryListTemplate?.length) {
23
+ throw NotFoundError('Templates not found');
24
+ }
23
25
 
24
- templates = ( await Promise.all(
26
+ templates = (await Promise.all(
25
27
  registryListTemplate.map(async ([slug]) => {
26
28
  try {
27
29
  const tpl = await getTemplate('registry', slug);
@@ -52,8 +54,8 @@ export default async function gisRegistryList(req = {}) {
52
54
  return {
53
55
  rows: paged,
54
56
  total: filteredBySearch.length,
55
- page: parseInt(page, 10),
56
- limit: parseInt(limit, 10),
57
+ page,
58
+ limit,
57
59
  offset
58
60
  };
59
61
  }
@@ -1,6 +1,6 @@
1
- import { getMeta, getFilterSQL, metaFormat } from "@opengis/fastify-table/utils.js";
1
+ import { getMeta, getFilterSQL, metaFormat, getFilterSQLParametrized } from "@opengis/fastify-table/utils.js";
2
2
  import { populateFilterOptions } from './classifiers.js';
3
- import { extractVisibleColumns } from './columns.js';
3
+ import { extractVisibleColumns } from './columns.js';
4
4
 
5
5
  const columnType = {
6
6
  text: 'text',
@@ -75,28 +75,28 @@ export async function handleRegistryRequest({
75
75
  }
76
76
 
77
77
  const { search, filter } = query || {};
78
- const { q: sqlFilter } = (filter || search)
79
- ? await getFilterSQL({
78
+ const { q: sqlFilter, args = [] } = (filter || search)
79
+ ? await getFilterSQLParametrized({
80
80
  table: table_name,
81
81
  search,
82
82
  filter,
83
83
  filterList: activeFilters,
84
84
  })
85
- : { q: '1=1' };
85
+ : { q: '1=1', args: [] };
86
86
 
87
87
  const whereConditions = [whereQuery, sqlFilter].filter(Boolean).join(' AND ');
88
88
 
89
89
  const sqlBase = `FROM ${table_name} WHERE ${whereConditions || 'true'}`;
90
90
  const sqlOrder = order ? `ORDER BY ${order}` : "";
91
- const sqlLimit = `LIMIT $1 OFFSET $2`;
91
+ const sqlLimit = `LIMIT $${args.length + 1}::bigint OFFSET $${args.length + 2}::bigint`;
92
92
 
93
93
  const sqlSelect = `SELECT "${pk}" as id ${selectColumns.length ? `, ${selectColumns.join(", ")}` : ''} ${geom ? `, st_asgeojson(${geom})::json as geom` : ''} ${sqlBase}`;
94
94
  const dataQuery = `${sqlSelect} ${sqlOrder} ${sqlLimit}`;
95
95
 
96
96
  if (sql) return dataQuery;
97
97
 
98
- const rows = await pg.query(dataQuery, [limit, offset]).then(el => el.rows || []);
99
- const total = await pg.query(`SELECT COUNT(*) ${sqlBase}`).then(el => +(el.rows[0]?.count || 0));
98
+ const rows = await pg.query(dataQuery, args.concat([limit, offset])).then(el => el.rows || []);
99
+ const total = await pg.query(`SELECT COUNT(*) ${sqlBase}`, args).then(el => +(el.rows[0]?.count || 0));
100
100
 
101
101
  await metaFormat({
102
102
  rows, table: table_name, cls: classifiers, sufix: true,
@@ -117,9 +117,13 @@ export async function handleRegistryRequest({
117
117
  filters: activeFilters,
118
118
  columns,
119
119
  whereConditions,
120
+ args
120
121
  });
121
122
 
122
123
  return {
124
+ total,
125
+ limit,
126
+ page,
123
127
  register_id,
124
128
  name,
125
129
  card,
@@ -127,13 +131,10 @@ export async function handleRegistryRequest({
127
131
  register_key,
128
132
  description,
129
133
  rows,
130
- total,
131
134
  service_id,
132
135
  columns: visibleColumns,
133
136
  filters: activeFilters,
134
137
  fields,
135
- limit,
136
- page,
137
138
  view,
138
139
  is_downloadable,
139
140
  is_map,
@@ -0,0 +1,80 @@
1
+ import gisRegistry from './functions/gis.registry.js';
2
+ import gisRegistryList from './functions/gis.registry.list.js';
3
+ // import mapRegistry from './functions/map.registry.js';
4
+ import gisExport from './functions/gis.export.js';
5
+ import addGisRegistry from './functions/add.registry.js';
6
+ import deleteGisRegistry from './functions/del.registry.js';
7
+
8
+ import {
9
+ gisRegistrySchema,
10
+ gisRegistryListSchema,
11
+ addGisRegistrySchema,
12
+ editGisRegistrySchema,
13
+ deleteGisRegistrySchema,
14
+ gisExportSchema,
15
+ } from './registers.schema.js';
16
+
17
+ const publicParams = { config: { policy: 'L0', package: 'gis' } };
18
+
19
+ async function route(app) {
20
+ app.get('/gis-registry/:slug', { ...publicParams, schema: gisRegistrySchema }, async ({ params, query, pg }) => {
21
+ const result = await gisRegistry({
22
+ slug: params.slug,
23
+ search: query.search,
24
+ filter: query.filter,
25
+ page: query.page,
26
+ limit: query.limit,
27
+ sql: query.sql,
28
+ }, pg);
29
+ return result;
30
+ });
31
+ app.get('/gis-registry/:slug/:objectId', { ...publicParams, schema: gisRegistrySchema }, async ({ params, query, pg }) => {
32
+ const result = await gisRegistry({
33
+ slug: params.slug,
34
+ objectId: params.objectId,
35
+ search: query.search,
36
+ filter: query.filter,
37
+ page: query.page,
38
+ limit: query.limit,
39
+ sql: query.sql,
40
+ }, pg);
41
+ return result;
42
+ });
43
+ app.get('/gis-registry', { ...publicParams, schema: gisRegistryListSchema }, async ({ query, pg }) => {
44
+ const result = await gisRegistryList({
45
+ page: query.page,
46
+ limit: query.limit,
47
+ search: query.search,
48
+ }, pg);
49
+ return result;
50
+ });
51
+ app.post('/gis-registry/:slug?', { ...publicParams, schema: addGisRegistrySchema }, async ({ method, params, body, user, pg }) => {
52
+ const result = await addGisRegistry({
53
+ method, slug: params.slug, body, uid: user?.uid,
54
+ }, pg);
55
+ return result;
56
+ });
57
+ app.put('/gis-registry/:slug', { ...publicParams, schema: editGisRegistrySchema }, async ({ method, params, body, user, pg }) => {
58
+ const result = await addGisRegistry({
59
+ method, slug: params.slug, body, uid: user?.uid,
60
+ }, pg);
61
+ return result;
62
+ });
63
+ app.delete('/gis-registry/:slug', { ...publicParams, schema: deleteGisRegistrySchema }, async ({ params, user, pg }) => {
64
+ const result = await deleteGisRegistry({
65
+ slug: params.slug,
66
+ uid: user?.uid,
67
+ }, pg);
68
+ return result;
69
+ });
70
+ // app.get('/map-registry/:slug/:id', { ...publicParams, schema: mapRegistrySchema }, mapRegistry);
71
+ app.get('/gis-export/:type/:slug', { ...publicParams, schema: gisExportSchema }, async ({ params, query, pg }, reply) => {
72
+ const result = await gisExport({
73
+ slug: params.slug,
74
+ type: params.type,
75
+ format: query.format,
76
+ }, pg);
77
+ return reply.headers(result.headers).send(result.data);
78
+ });
79
+ }
80
+ export default route;
@@ -0,0 +1,145 @@
1
+ import { afterAll, beforeAll, describe, expect, test } from 'vitest';
2
+
3
+ import { getPGAsync } from '@opengis/fastify-table/utils.js';
4
+
5
+ import { build, injectWithHeaders } from '../../../test/helper.js';
6
+
7
+ let pg;
8
+
9
+ beforeAll(async () => {
10
+ await build();
11
+
12
+ pg = await getPGAsync();
13
+
14
+ await cleanUp('before');
15
+ });
16
+
17
+ afterAll(async () => {
18
+ await cleanUp('after');
19
+ });
20
+
21
+ const testId = 'testRegister';
22
+
23
+ const cleanUp = async (when) => {
24
+ if (!pg) return;
25
+ const rowCount2 = await pg.query('delete from gis.registers where register_id=$1', [testId]).then(r => r.rowCount || 0);
26
+ console.log(`clean up finished: ${when}`, rowCount2);
27
+ };
28
+
29
+ describe('GIS routes', () => {
30
+ test('GET /gis-registry/:slug returns 200', async () => {
31
+ const { slug, table } = await pg.query('SELECT register_id as slug, table_name as table FROM gis.registers where table_name is not null limit 1').then(r => r.rows[0]) || {};
32
+ const pkey = pg.pk?.[table];
33
+ expect(pkey).toBeDefined();
34
+
35
+ const res = await injectWithHeaders({
36
+ url: `/api/gis-registry/${slug}`,
37
+ });
38
+
39
+ expect(res.statusCode).toBe(200);
40
+ [
41
+ "total", "limit", "page", "register_id", "name", "card", "table_name", "register_key", "description",
42
+ "rows", "service_id", "columns", "filters", "fields", "view", "is_downloadable", "is_map", "is_register",
43
+ "is_files", "config"
44
+ ].forEach(key => expect(res.body).toHaveProperty(key));
45
+ });
46
+
47
+ test('GET /gis-registry/:slug/:objectId returns 200', async () => {
48
+ const { slug, table } = await pg.query('SELECT register_id as slug, table_name as table FROM gis.registers where table_name is not null limit 1').then(r => r.rows[0]) || {};
49
+ const pkey = pg.pk?.[table];
50
+ expect(pkey).toBeDefined();
51
+
52
+ const objectId = await pg.query(`select ${pkey} from ${table} limit 1`).then(r => r.rows?.[0]?.[pkey]);
53
+ expect(objectId).toBeDefined();
54
+
55
+ const url = `/api/gis-registry/${slug}/${objectId}`;
56
+ const res = await injectWithHeaders({
57
+ url,
58
+ });
59
+
60
+ expect(res.statusCode, url).toBe(200);
61
+ [
62
+ "row", "card", "d", "columns", "is_downloadable", "register_key", "register_id", "service_id",
63
+ "name", "is_files", "is_map", "is_register"
64
+ ].forEach(key => expect(res.body).toHaveProperty(key));
65
+ });
66
+
67
+ test('GET /gis-registry returns 200', async () => {
68
+ const res = await injectWithHeaders({
69
+ url: '/api/gis-registry',
70
+ });
71
+
72
+ expect(res.statusCode).toBe(200);
73
+ ["rows", "total", "page", "limit", "offset"].forEach(key => expect(res.body).toHaveProperty(key));
74
+ });
75
+
76
+ test('POST /gis-registry returns 200', async () => {
77
+ const table = pg.tlist.find(el => el.includes('parcel') || el.includes('address') || el.includes('street')) || pg.tlist[0];
78
+ await pg.query('delete from gis.registers where register_id=$1', [testId]);
79
+
80
+ const payload = {
81
+ register_key: 'unit-test',
82
+ name: 'unit-test',
83
+ table_name: table
84
+ };
85
+
86
+ const res = await injectWithHeaders({
87
+ method: 'POST',
88
+ url: `/api/gis-registry/${testId}`,
89
+ payload
90
+ });
91
+
92
+ expect(res.statusCode).toBe(200);
93
+ expect(res.body).toHaveProperty('register_id');
94
+ expect(res.body).toHaveProperty('register_key');
95
+ expect(res.body).toHaveProperty('name');
96
+ expect(res.body.name).toBe(payload.name);
97
+ expect(res.body).toHaveProperty('table_name');
98
+ });
99
+
100
+ test('PUT /gis-registry/:slug returns 200', async () => {
101
+ const payload = {
102
+ name: 'unit-test edited',
103
+ };
104
+ const res = await injectWithHeaders({
105
+ method: 'PUT',
106
+ url: `/api/gis-registry/${testId}`,
107
+ payload
108
+ });
109
+
110
+ expect(res.statusCode).toBe(200);
111
+ expect(res.body).toHaveProperty('register_id');
112
+ expect(res.body).toHaveProperty('register_key');
113
+ expect(res.body).toHaveProperty('name');
114
+ expect(res.body.name).toBe(payload.name);
115
+ expect(res.body).toHaveProperty('table_name');
116
+ });
117
+
118
+ // ! before delete
119
+ test('GET /gis-export/:type/:slug returns 200', async () => {
120
+ const res = await injectWithHeaders({
121
+ url: `/api/gis-export/register/${testId}`,
122
+ format: 'csv'
123
+ });
124
+
125
+ expect(res.statusCode).toBe(200);
126
+ expect(res.headers).toHaveProperty('content-type');
127
+ expect(res.headers['content-type']).toBe('text/csv');
128
+ expect(res.headers).toHaveProperty('content-disposition');
129
+ expect(res.headers['content-disposition']).toMatch('attachment; filename=');
130
+ expect(res.body.length).toBeGreaterThan(0);
131
+ });
132
+
133
+ test('DELETE /gis-registry/:slug returns 200', async () => {
134
+ const res = await injectWithHeaders({
135
+ method: 'DELETE',
136
+ url: `/api/gis-registry/${testId}`,
137
+ });
138
+
139
+ expect(res.statusCode).toBe(200);
140
+ expect(res.body).toHaveProperty('register_id');
141
+ expect(res.body).toHaveProperty('register_key');
142
+ expect(res.body).toHaveProperty('name');
143
+ expect(res.body).toHaveProperty('table_name');
144
+ });
145
+ });
@@ -0,0 +1,246 @@
1
+ const queryFilterSchema = { type: 'string', pattern: '^([\\w\\d_-]+)=([А-Яа-яҐґЄєІіЇї\\d\\w\\s\\/\\[\\]\\(\\)\\{\\}\\|,.!?;:—_=-@%#$&^*+=`~]+)$' };
2
+ const querySearchSchema = { type: 'string', pattern: '^([А-Яа-яҐґЄєІіЇї\\d\\w\\s\\/\\[\\]\\(\\)\\{\\}\\|,.!?;:—_=-@%#$&^*+=`~]+)$' };
3
+
4
+ const registerSchema = {
5
+ type: 'object',
6
+ additionalProperties: false,
7
+ properties: {
8
+ id: { type: 'string', pattern: '^([\\d\\w]+)$' },
9
+ register_id: { type: 'string', pattern: '^([\\d\\w]+)$' },
10
+ service_id: { type: ['string', 'null'], pattern: '^([\\d\\w]+)$' },
11
+
12
+ name: { type: 'string' },
13
+ description: { type: ['string', 'null'] },
14
+ keywords: { type: ['array', 'string', 'null'] },
15
+ holder: { type: ['string', 'null'] },
16
+
17
+ table_name: { type: 'string' },
18
+ pk: { type: 'string' },
19
+ query: { type: ['string', 'null'] },
20
+ geometry_column: { type: ['string', 'null'] },
21
+ sql_list: { type: ['array', 'string', 'null'] },
22
+
23
+ is_active: { type: 'boolean' },
24
+ is_public: { type: 'boolean' },
25
+
26
+ filters: {
27
+ type: 'array',
28
+ items: {
29
+ type: 'object',
30
+ additionalProperties: false,
31
+ // ? ua / label
32
+ required: ['name', 'type'],
33
+ properties: {
34
+ ua: { type: 'string' },
35
+ data: { type: 'string' },
36
+ name: { type: 'string' },
37
+ type: { type: 'string' },
38
+ label: { type: 'string' },
39
+ },
40
+ },
41
+ },
42
+
43
+ columns: {
44
+ type: 'array',
45
+ items: {
46
+ type: 'object',
47
+ },
48
+ },
49
+
50
+ metadata: {
51
+ type: ['object', 'null'],
52
+ },
53
+
54
+ created_at: { type: 'string' },
55
+ created_by: { type: 'string' },
56
+ updated_by: { type: 'string' },
57
+ updated_at: { type: 'string' },
58
+
59
+ image: { type: ['string', 'null'] },
60
+ order: { type: ['string', 'null'] },
61
+ register_key: { type: ['string', 'null'] },
62
+
63
+ is_files: { type: 'boolean' },
64
+ view: { type: 'string' },
65
+
66
+ card: {
67
+ type: 'array',
68
+ items: {
69
+ type: 'object',
70
+ additionalProperties: false,
71
+ // ? ua / title / label
72
+ // ? format / type
73
+ required: ['name'],
74
+ properties: {
75
+ name: { type: 'string' },
76
+ title: { type: 'string' },
77
+ type: { type: 'string' },
78
+ label: { type: 'string' },
79
+ format: { type: 'string' },
80
+ meta: { type: 'string' },
81
+
82
+ ua: { type: 'string' },
83
+ data: { type: 'string' },
84
+ },
85
+ },
86
+ },
87
+
88
+ is_downloadable: { type: 'boolean' },
89
+ is_map: { type: 'boolean' },
90
+ is_register: { type: 'boolean' },
91
+
92
+ group_id: { type: ['string', 'null'] },
93
+
94
+ geom_type: { type: 'string' },
95
+
96
+ // This is a JSON string containing a GeoJSON Polygon
97
+ bbox: { type: 'string' },
98
+
99
+ keywords_text: { type: ['string', 'null'] },
100
+
101
+ token: { type: 'string' },
102
+
103
+ is_public_data: {
104
+ type: 'object',
105
+ additionalProperties: false,
106
+ required: ['id', 'text'],
107
+ properties: {
108
+ id: { type: 'string', pattern: '^([\\d\\w]+)$' },
109
+ text: { type: 'string' },
110
+ icon: { type: ['string', 'null'] },
111
+ color: { type: 'string' },
112
+ },
113
+ },
114
+
115
+ view_text: { type: 'string' },
116
+
117
+ is_active_data: {
118
+ type: 'object',
119
+ additionalProperties: false,
120
+ required: ['id', 'text'],
121
+ properties: {
122
+ id: { type: 'string', pattern: '^([\\d\\w]+)$' },
123
+ text: { type: 'string' },
124
+ icon: { type: ['string', 'null'] },
125
+ color: { type: 'string' },
126
+ },
127
+ },
128
+
129
+ is_downloadable_data: {
130
+ type: 'object',
131
+ additionalProperties: false,
132
+ required: ['id', 'text'],
133
+ properties: {
134
+ id: { type: 'string', pattern: '^([\\d\\w]+)$' },
135
+ text: { type: 'string' },
136
+ icon: { type: ['string', 'null'] },
137
+ color: { type: 'string' },
138
+ },
139
+ },
140
+
141
+ service_id_text: { type: 'string' },
142
+ geom_type_text: { type: 'string' },
143
+
144
+ tableData: {
145
+ type: 'array',
146
+ items: {
147
+ type: 'object',
148
+ },
149
+ },
150
+ },
151
+ };
152
+
153
+ export const gisRegistrySchema = {
154
+ params: {
155
+ type: 'object',
156
+ required: ['slug'],
157
+ properties: {
158
+ slug: { type: 'string' },
159
+ objectId: { type: 'string', pattern: '^([\\d\\w]+)$' },
160
+ },
161
+ },
162
+ querystring: {
163
+ type: 'object',
164
+ additionalProperties: false,
165
+ properties: {
166
+ filter: queryFilterSchema,
167
+ search: querySearchSchema,
168
+ limit: {
169
+ type: 'number',
170
+ minimum: 1,
171
+ },
172
+ page: {
173
+ type: 'number',
174
+ minimum: 1,
175
+ },
176
+ sql: {
177
+ type: 'string',
178
+ pattern: "^(\\d)$"
179
+ }
180
+ },
181
+ },
182
+ };
183
+
184
+ export const gisRegistryListSchema = {
185
+ querystring: {
186
+ type: 'object',
187
+ additionalProperties: false,
188
+ properties: {
189
+ search: querySearchSchema,
190
+ limit: {
191
+ type: 'number',
192
+ minimum: 1,
193
+ },
194
+ page: {
195
+ type: 'number',
196
+ minimum: 1,
197
+ },
198
+ },
199
+ },
200
+ };
201
+
202
+ export const addGisRegistrySchema = {
203
+ body: { ...registerSchema, required: ['name', 'register_key', 'table_name'] },
204
+ };
205
+
206
+ export const editGisRegistrySchema = {
207
+ params: {
208
+ type: 'object',
209
+ required: ['slug'],
210
+ properties: {
211
+ slug: { type: 'string' },
212
+ },
213
+ },
214
+ body: registerSchema
215
+ };
216
+
217
+ export const deleteGisRegistrySchema = {
218
+ params: {
219
+ type: 'object',
220
+ required: ['slug'],
221
+ properties: {
222
+ slug: { type: 'string' },
223
+ },
224
+ },
225
+ };
226
+
227
+ export const mapRegistrySchema = {};
228
+
229
+ export const gisExportSchema = {
230
+ params: {
231
+ type: 'object',
232
+ required: ['slug'],
233
+ properties: {
234
+ slug: { type: 'string' },
235
+ type: { type: 'string', enum: ['register', 'service'] },
236
+ },
237
+ },
238
+ querystring: {
239
+ type: 'object',
240
+ properties: {
241
+ format: { type: 'string', enum: ['csv', 'xlsx', 'shp', 'geojson'], default: 'csv' },
242
+ },
243
+ },
244
+ };
245
+
246
+ export default null;