@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
@@ -10,9 +10,12 @@ import {
10
10
  } from '@opengis/fastify-table/utils.js';
11
11
 
12
12
  import rootFolder from '../../../plugins/mapnik/funcs/rootFolder.mjs';
13
+ import { BadRequestError, NotFoundError } from '@opengis/fastify-table/errors.js';
13
14
 
14
15
  const systemColumns = ['uid', 'cdate', 'editor_id', 'editor_date', 'created_by', 'created_at', 'updated_by', 'updated_at', 'geom'];
15
16
 
17
+ const unittest = process.env.NODE_ENV === 'test' || process.env.VITEST;
18
+
16
19
  /**
17
20
  * Повертає JSON дані для реєстру на основі налаштувань з gis.registers
18
21
  *
@@ -25,19 +28,15 @@ const systemColumns = ['uid', 'cdate', 'editor_id', 'editor_date', 'created_by',
25
28
  * @param {boolean} query.nocache - не використовувати кеш
26
29
  */
27
30
  export default async function jsonData({
28
- pg = pgClients.client, params = {}, query = {}, unittest,
29
- }, reply) {
30
- const { layer } = params;
31
- const {
32
- page = 1,
33
- limit = 100,
34
- where,
35
- sql,
36
- nocache
37
- } = query;
38
-
31
+ layer,
32
+ page = 1,
33
+ limit = 100,
34
+ // where,
35
+ sql,
36
+ nocache
37
+ }, pg = pgClients.client) {
39
38
  if (!layer) {
40
- return reply.status(400).send('not enough params: layer (register_id)');
39
+ throw BadRequestError('not enough params: layer (register_id)');
41
40
  }
42
41
 
43
42
  const registerId = layer.replace('.json', '');
@@ -46,7 +45,7 @@ export default async function jsonData({
46
45
  const offset = (pageNum - 1) * limitNum;
47
46
 
48
47
  if (!pg.pk?.['gis.registers']) {
49
- return reply.status(404).send('registers table not found');
48
+ throw NotFoundError('registers table not found');
50
49
  }
51
50
 
52
51
  const register = await pg.query(
@@ -61,10 +60,10 @@ export default async function jsonData({
61
60
  from gis.registers
62
61
  where register_id = $1 and is_active = true and is_public = true`,
63
62
  [registerId],
64
- ).then(el => el.rows?.[0]);
63
+ ).then(r => r.rows?.[0]);
65
64
 
66
65
  if (!register) {
67
- return reply.status(404).send('register not found or not available');
66
+ throw NotFoundError('register not found or not available');
68
67
  }
69
68
 
70
69
  const {
@@ -76,11 +75,11 @@ export default async function jsonData({
76
75
  } = register;
77
76
 
78
77
  if (!table) {
79
- return reply.status(400).send('invalid register table_name');
78
+ throw BadRequestError('invalid register table_name');
80
79
  }
81
80
 
82
81
  if (!pg.pk?.[table]?.length) {
83
- return reply.status(404).send('table not found');
82
+ throw NotFoundError('table not found');
84
83
  }
85
84
 
86
85
  const meta = await getMeta({ pg, table });
@@ -102,11 +101,11 @@ export default async function jsonData({
102
101
  ).join(', ');
103
102
 
104
103
  if (!props) {
105
- return reply.status(400).send('no columns to select');
104
+ throw BadRequestError('no columns to select');
106
105
  }
107
106
 
108
107
  const cacheHash = createHash('md5')
109
- .update([registerId, where, registerQuery, pageNum, limitNum].filter(el => el).join('-'))
108
+ .update([registerId, /*where,*/ registerQuery, pageNum, limitNum].filter(el => el).join('-'))
110
109
  .digest('hex');
111
110
 
112
111
  const today = new Date().toISOString().split('T')[0];
@@ -120,17 +119,19 @@ export default async function jsonData({
120
119
  const ageInMs = Date.now() - birthtimeMs;
121
120
  if (ageInMs < 86400000) {
122
121
  const content = await readFile(filepath, 'utf8');
123
- return reply
124
- .status(200)
125
- .header('Content-Type', 'application/json')
126
- .header('Cache-Control', 'public, max-age=86400')
127
- .send(content);
122
+ return {
123
+ headers: {
124
+ 'Content-Type': 'application/json',
125
+ 'Cache-Control': 'public, max-age=86400',
126
+ },
127
+ data: content
128
+ }
128
129
  }
129
130
  }
130
131
 
131
132
  const whereConditions = [
132
133
  registerQuery || '1=1',
133
- where || 'true',
134
+ /*where ||*/ 'true',
134
135
  ].join(' AND ');
135
136
 
136
137
  const quotedTable = table.split('.').map(el => `"${el}"`).join('.');
@@ -150,56 +151,56 @@ export default async function jsonData({
150
151
  OFFSET ${offset}
151
152
  `;
152
153
 
153
- if (sql === '1') return { countQuery, dataQuery };
154
- if (sql === '2') return filepath.replace(/\\/g, '/');
155
-
156
- try {
157
- const [countResult, dataResult] = await Promise.all([
158
- pg.query(countQuery),
159
- pg.query(dataQuery),
160
- ]);
161
-
162
- const total = parseInt(countResult.rows[0]?.total || 0, 10);
163
- const rows = dataResult.rows || [];
164
-
165
- // Обробка класифікаторів
166
- if (columns && Array.isArray(columns)) {
167
- const classifiers = columns
168
- .filter(col => col.data && ['select', 'badge', 'tags', 'integer', 'text', 'text[]'].includes(col.format))
169
- .reduce((acc, curr) => ({ ...acc, [curr.name]: curr.data }), {});
170
-
171
- if (Object.keys(classifiers).length > 0) {
172
- await metaFormat({
173
- rows,
174
- table,
175
- cls: classifiers,
176
- suffix: true,
177
- });
178
- }
179
- }
154
+ if (sql === 1) return { countQuery, dataQuery };
155
+ if (sql === 2) return filepath.replace(/\\/g, '/');
156
+
180
157
 
181
- const result = {
182
- register_id: registerId,
183
- total,
184
- page: pageNum,
185
- limit: limitNum,
186
- pages: Math.ceil(total / limitNum),
187
- data: rows,
188
- };
158
+ const [countResult, dataResult] = await Promise.all([
159
+ pg.query(countQuery),
160
+ pg.query(dataQuery),
161
+ ]);
189
162
 
190
- const jsonString = JSON.stringify(result);
163
+ const total = parseInt(countResult.rows[0]?.total || 0, 10);
164
+ const rows = dataResult.rows || [];
191
165
 
192
- if (!nocache && !unittest) {
193
- await mkdir(path.dirname(filepath), { recursive: true });
194
- await writeFile(filepath, jsonString, 'utf8');
166
+ // Обробка класифікаторів
167
+ if (columns && Array.isArray(columns)) {
168
+ const classifiers = columns
169
+ .filter(col => col.data && ['select', 'badge', 'tags', 'integer', 'text', 'text[]'].includes(col.format))
170
+ .reduce((acc, curr) => ({ ...acc, [curr.name]: curr.data }), {});
171
+
172
+ if (Object.keys(classifiers).length > 0) {
173
+ await metaFormat({
174
+ rows,
175
+ table,
176
+ cls: classifiers,
177
+ suffix: true,
178
+ });
195
179
  }
180
+ }
181
+
182
+ const result = {
183
+ register_id: registerId,
184
+ total,
185
+ page: pageNum,
186
+ limit: limitNum,
187
+ pages: Math.ceil(total / limitNum),
188
+ data: rows,
189
+ };
190
+
191
+ const jsonString = JSON.stringify(result);
196
192
 
197
- return reply
198
- .status(200)
199
- .header('Content-Type', 'application/json')
200
- .header('Cache-Control', nocache ? 'no-cache' : 'public, max-age=86400')
201
- .send(jsonString);
202
- } catch (err) {
203
- return reply.status(500).send({ error: err.message });
193
+ if (!nocache && !unittest) {
194
+ await mkdir(path.dirname(filepath), { recursive: true });
195
+ await writeFile(filepath, jsonString, 'utf8');
204
196
  }
197
+
198
+ return {
199
+ headers: {
200
+ 'Content-Type': 'application/json',
201
+ 'Cache-Control': nocache ? 'no-cache' : 'public, max-age=86400',
202
+ },
203
+ data: jsonString
204
+ }
205
+
205
206
  }
@@ -1,12 +1,13 @@
1
1
  import {
2
- config, pgClients, yml2json, getTemplates, getTemplate,
2
+ pgClients, yml2json, getTemplates, getTemplate,
3
3
  } from '@opengis/fastify-table/utils.js';
4
- import getPermissions from '../../permissions/controllers/utils/get.permissions.js';
4
+
5
+ import getPermissions from '../../permissions/functions/get.permissions.js';
5
6
 
6
7
  export default async function layerList({
7
- pg = pgClients.client, query = {}, user = {},
8
- }, reply) {
9
- const { sql } = query;
8
+ sql, uid,
9
+ }, pg = pgClients.client) {
10
+
10
11
  const layers = getTemplates('layer');
11
12
  const files = Promise.all(layers.map(async (el) => {
12
13
  const layer = await getTemplate('layer', el[0]);
@@ -15,25 +16,24 @@ export default async function layerList({
15
16
 
16
17
  if (!pg.pk?.['gis.services'] && !pg.pk?.['gis.ogc_service'] && !pg.pk?.['gis.rasters'] && !pg.pk?.['gis.cartocss']) {
17
18
  return files;
18
- // return reply.status(404).send('services table not found');
19
19
  }
20
20
 
21
- const { all_layers, layer_list } = (user.uid) ? await getPermissions({ pg, uid: user.uid }) : { all_layers: false, layer_list: [] };
21
+ const { all_layers, layer_list } = uid ? await getPermissions({ pg, uid }) : { all_layers: false, layer_list: [] };
22
22
 
23
23
  const whereServices = (all_layers === true) ? '1=1'
24
- : (user.uid && !all_layers) ? '( s.is_public or s.service_id = any($1))'
24
+ : (uid && !all_layers) ? '( s.is_public or s.service_id = any($1))'
25
25
  : 'is_public';
26
26
 
27
27
  const whereOgcServices = (all_layers === true) ? '1=1'
28
- : (user.uid && !all_layers) ? '( s.ispublic or s.ogc_service_id = any($1))'
28
+ : (uid && !all_layers) ? '( s.ispublic or s.ogc_service_id = any($1))'
29
29
  : 'ispublic';
30
30
 
31
31
  const whereRasters = (all_layers === true) ? '1=1'
32
- : (user.uid && !all_layers) ? '(s.is_public or s.raster_id = any($1))'
32
+ : (uid && !all_layers) ? '(s.is_public or s.raster_id = any($1))'
33
33
  : 'is_public';
34
34
 
35
35
  const whereCartocss = (all_layers === true) ? '1=1'
36
- : (user.uid && !all_layers) ? '(s.is_public or s.cartocss_id = any($1))'
36
+ : (uid && !all_layers) ? '(s.is_public or s.cartocss_id = any($1))'
37
37
  : 'is_public';
38
38
  const q = `
39
39
  select * from
@@ -71,20 +71,20 @@ export default async function layerList({
71
71
  )q order by q.name
72
72
  `;
73
73
 
74
- if (user.uid && sql) return q;
74
+ if (uid && sql) return q;
75
75
 
76
- const rows = await pg.query(q, (user.uid && !all_layers) ? [layer_list] : []).then(el => el.rows || []);
76
+ const rows = await pg.query(q, (uid && !all_layers) ? [layer_list] : []).then(r => r.rows || []);
77
77
 
78
78
  const totals = pg.queryCache ? await pg.queryCache('select json_object_agg(oid::regclass, reltuples) from pg_class')
79
- .then(el => el.rows?.[0]?.json_object_agg || {}) : {};
79
+ .then(r => r.rows?.[0]?.json_object_agg || {}) : {};
80
80
  rows.filter(row => row.source_path).forEach(row => Object.assign(row, { count: totals[row.source_path] || 0 }));
81
81
 
82
82
  const groupIds = rows.map(el => el.group_id).filter(Boolean);
83
- const groupNames = groupIds.length ? await pg.query('select json_object_agg(group_id,group_name) from gis.group_list where group_id=any($1)', [groupIds]).then(el => el.rows?.[0]?.json_object_agg || {}) : {};
83
+ const groupNames = groupIds.length ? await pg.query('select json_object_agg(group_id,group_name) from gis.group_list where group_id=any($1)', [groupIds]).then(r => r.rows?.[0]?.json_object_agg || {}) : {};
84
84
  rows.filter(el => el.group_id).forEach(row => Object.assign(row, { group_name: groupNames[row.group_id] }));
85
85
 
86
86
  if (!rows.length) {
87
- return reply.status(200).send([]);
87
+ return [];
88
88
  }
89
89
 
90
90
  // parse service style
@@ -98,5 +98,5 @@ export default async function layerList({
98
98
 
99
99
  // return files;
100
100
 
101
- return reply.status(200).send(rows.concat(files));
101
+ return rows.concat(files);
102
102
  }
@@ -4,6 +4,7 @@ import { fileURLToPath } from 'url';
4
4
  import { createHash } from 'node:crypto';
5
5
 
6
6
  import { config, getMeta, getTemplate, getTemplateSync, pgClients, getSelect, getSelectVal, getTemplatePath } from '@opengis/fastify-table/utils.js';
7
+ import { NotFoundError } from '@opengis/fastify-table/errors.js';
7
8
 
8
9
  const { prefix = '/api' } = config;
9
10
  const dirname = path.dirname(fileURLToPath(import.meta.url));
@@ -13,7 +14,7 @@ const maps = getTemplatePath('map')?.map?.(el => {
13
14
  return { slug: el[0], name };
14
15
  });
15
16
 
16
- async function processObject(loadTemplate, pg = pgClients.client, unittest) {
17
+ async function processObject(loadTemplate, pg = pgClients.client, unittest = process.env.NODE_ENV === 'test' || process.env.VITEST) {
17
18
  // default center for all maps (frontend dependends on it)
18
19
  const { bbox = [], center = [30, 50] } = loadTemplate?.source_path && pg.pk?.[loadTemplate.source_path]
19
20
  ? await pg.query(`select
@@ -96,29 +97,27 @@ async function processObject(loadTemplate, pg = pgClients.client, unittest) {
96
97
  return loadTemplate;
97
98
  }
98
99
 
99
- export default async function map({ pg = pgClients.client, params = {}, unittest }, reply) {
100
- const { slug } = params;
101
-
100
+ export default async function map({ slug }, pg = pgClients.client) {
102
101
  const loadTemplate = await getTemplate('map', slug);
103
102
 
104
103
  if (!loadTemplate) {
105
- return reply.status(404).send('map not found');
104
+ throw NotFoundError('map not found');
106
105
  }
107
106
 
108
107
  if (!Array.isArray(loadTemplate)) {
109
- await processObject(loadTemplate, pg, unittest);
108
+ await processObject(loadTemplate, pg);
110
109
  return { ...loadTemplate, maps };
111
110
  }
112
111
 
113
112
  const index = loadTemplate?.find?.(el => el[0].split('.').shift() === 'index')?.[1];
114
113
 
115
114
  if (!index) {
116
- return reply.status(404).send('map index not found');
115
+ throw NotFoundError('map index not found');
117
116
  }
118
117
 
119
- await processObject(index, pg, unittest);
118
+ await processObject(index, pg);
120
119
 
121
120
  const layers = loadTemplate?.filter?.(el => el[0].split('.').shift() !== 'index')?.map(el => ({ ...el[1], id: el[0].replace('.yml', '').replace('.json', '') }));
122
121
 
123
- return reply.status(200).send({ ...index, layers, maps });
122
+ return { ...index, layers, maps };
124
123
  }
@@ -14,7 +14,7 @@ function getBBox(coordinates) {
14
14
  );
15
15
  }
16
16
 
17
- export default async function mapCatalog({ pg = pgClients.client }, reply) {
17
+ export default async function mapCatalog({ } = {}, pg = pgClients.client) {
18
18
  const { rows: services = [] } = pg.pk?.['gis.services']
19
19
  ? await pg.query(`select
20
20
  service_id as id, name, service_type, service_url as url,
@@ -50,17 +50,17 @@ export default async function mapCatalog({ pg = pgClients.client }, reply) {
50
50
  from gis.rasters where is_active and is_public`
51
51
  )
52
52
  : {};
53
-
54
- const { rows: ogc = [] } = pg.pk?.['gis.ogc_service']
53
+
54
+ const { rows: ogc = [] } = pg.pk?.['gis.ogc_service']
55
55
  ? await pg.query(
56
56
  `select
57
57
  service_id as id, name, 'raster' as source_type, url
58
58
  from gis.ogc_service `
59
59
  )
60
60
  : {};
61
-
62
-
63
-
61
+
62
+
63
+
64
64
  rasters.forEach(el => {
65
65
  el.url = `${prefix}/layer-rtile/${el.id}/{z}/{x}/{y}.png`;
66
66
  });
@@ -69,5 +69,5 @@ export default async function mapCatalog({ pg = pgClients.client }, reply) {
69
69
  el.bbox = getBBox(el.bbox);
70
70
  });
71
71
 
72
- return reply.status(200).send({ services, rasters: rasters.concat(ogc) });
72
+ return { services, rasters: rasters.concat(ogc) };
73
73
  }
@@ -0,0 +1,54 @@
1
+ import { BadRequestError } from "@opengis/fastify-table/errors.js";
2
+ import { pgClients, getMeta, getSelect, getSelectVal } from "@opengis/fastify-table/utils.js";
3
+
4
+ export default async function mapCatalogAttribute({ service, attr, cls: queryCls }, pg = pgClients.client) {
5
+ if (!service) {
6
+ throw BadRequestError('not enough params: service');
7
+ }
8
+
9
+ if (!attr) {
10
+ throw BadRequestError('not enough params: attr');
11
+ }
12
+
13
+ if (!pg.pk?.['gis.services']) {
14
+ throw NotFoundError('services table not found');
15
+ }
16
+
17
+ const source = await pg.query(
18
+ 'select source_path from gis.services where service_id=$1 and is_active and is_public',
19
+ [service]
20
+ ).then(r => r.rows?.[0]?.source_path);
21
+
22
+ if (!source) {
23
+ throw NotFoundError('service not found');
24
+ }
25
+
26
+ const cls = await getSelect(queryCls || attr, pg);
27
+ const colname = queryCls ? attr : attr.split(':').pop();
28
+
29
+ if (!colname) {
30
+ throw BadRequestError('invalid params: attr');
31
+ }
32
+
33
+ const columns = await getMeta({ pg, table: source }).then(r => r.columns || []);
34
+ const { dataTypeID } = columns.find(col => col.name === colname) || {};
35
+
36
+ const q = dataTypeID && pg.pgType[dataTypeID]?.includes('[]')
37
+ ? `select unnest(${colname})::text as id,count(*) from ${source} group by unnest(${colname}) limit 100`
38
+ : `select ${colname}::text as id,count(*) from ${source} group by ${colname} limit 100`;
39
+
40
+ const countArr = await pg.queryCache(q).then(r => r.rows || []);
41
+
42
+ const clsData = await getSelectVal({ pg, values: countArr.map(el => el.id), name: queryCls || attr });
43
+
44
+ const legend = countArr.map(cel => {
45
+ const data = cls?.arr?.find(c => c.id?.toString?.() === cel.id?.toString?.()) || { text: clsData?.[cel.id]?.text || clsData?.[cel.id] };
46
+ return { ...cel, ...data };
47
+ });
48
+
49
+ const { min, max } = await pg.queryCache(
50
+ `select min(${attr}), max(${attr}) from ${source} where 1=1`,
51
+ ).then(r => r.rows?.[0] || {});
52
+
53
+ return { legend, min, max };
54
+ }
@@ -1,23 +1,23 @@
1
- import { getMeta, getFilterSQL, getTemplate, metaFormat, pgClients, yml2json } from '@opengis/fastify-table/utils.js';
1
+ import { BadRequestError, NotFoundError } from '@opengis/fastify-table/errors.js';
2
+ import {
3
+ getMeta, getFilterSQL, getTemplate, metaFormat, pgClients, yml2json,
4
+ } from '@opengis/fastify-table/utils.js';
2
5
 
3
6
  const layerMetaColumns = ['id', 'name', 'label', 'source', 'table', 'pk', 'geomColumn', 'srid', 'cls', 'htmls'];
4
7
 
5
- export default async function mapFeaturesPoint({ pg = pgClients.client, params = {}, query = {} }, reply) {
6
- const { slug, id } = params;
7
- const { x, y, sql } = query;
8
-
8
+ export default async function mapFeaturesPoint({ slug, id, x, y, sql }, pg = pgClients.client) {
9
9
  if (!slug) {
10
- return reply.status(400).send('not enough params: slug');
10
+ throw BadRequestError('not enough params: slug');
11
11
  }
12
12
 
13
13
  if (!(x && y) && !id) {
14
- return reply.status(400).send('not enough params: xy');
14
+ throw BadRequestError('not enough params: xy');
15
15
  }
16
16
 
17
17
  const loadTemplate = await getTemplate('map', slug);
18
18
 
19
19
  if (!loadTemplate) {
20
- return reply.status(404).send('map not found');
20
+ throw NotFoundError('map not found');
21
21
  }
22
22
 
23
23
  const index = loadTemplate?.find?.(el => el[0].split('.').shift() === 'index')?.[1];
@@ -26,21 +26,21 @@ export default async function mapFeaturesPoint({ pg = pgClients.client, params =
26
26
  ? loadTemplate?.layers
27
27
  : loadTemplate?.filter?.(el => el[0].split('.').shift() !== 'index')?.map(el => ({ ...el[1], id: el[0].replace('.yml', '').replace('.json', '') }));
28
28
 
29
- const serviceLayers = await Promise.all(layers1.filter(el => typeof el === 'string').map(async (layer) => {
29
+ const serviceLayers = await Promise.all((layers1 || []).filter(el => typeof el === 'string').map(async (layer) => {
30
30
  const layerData = await getTemplate('layer', layer);
31
31
  const serviceData = layerData || await pg.query('select service_id as id, *, st_asgeojson(bbox)::json as bbox, st_asgeojson(center)::json as center from gis.services where service_id=$1', [layer]).then(el => el.rows?.[0]);
32
32
  serviceData.style = yml2json(serviceData.style);
33
33
  return { ...serviceData, id: layer, visible: true };
34
34
  }));
35
35
 
36
- const layers = layers1.filter(el => el && typeof el === 'object').concat(serviceLayers);
36
+ const layers = (layers1 || []).filter(el => el && typeof el === 'object').concat(serviceLayers);
37
37
 
38
38
  if (!layers?.length) {
39
- return reply.status(404).send('map layers not found');
39
+ throw NotFoundError('map layers not found');
40
40
  }
41
41
 
42
42
  if (!layers.filter(el => el.source_path).length) {
43
- return reply.status(404).send('map layers sources not provided');
43
+ throw NotFoundError('map layers sources not provided');
44
44
  }
45
45
 
46
46
  const point = `srid=4326;point(${x} ${y})`; // 30, 50
@@ -48,7 +48,9 @@ export default async function mapFeaturesPoint({ pg = pgClients.client, params =
48
48
  const { srids } = await pg.queryCache?.('select json_agg(srid) as srids from spatial_ref_sys').then(el => el.rows?.[0] || {}) || {};
49
49
 
50
50
  await Promise.all(layers.map(async (layer, idx) => {
51
- const { source_path: source, srid = 4326, id: layerId, name } = layer;
51
+ const {
52
+ source_path: source, srid = 4326, id: layerId, name,
53
+ } = layer;
52
54
 
53
55
  const loadTable = await getTemplate('table', source);
54
56
  const meta = await getMeta({ pg, table: loadTable?.table || source });
@@ -100,19 +102,21 @@ export default async function mapFeaturesPoint({ pg = pgClients.client, params =
100
102
  where ${where}`;
101
103
  }).join(' union all ').concat(' order by distance');
102
104
 
103
- if (sql === '1') return q;
105
+ if (sql === 1) return q;
104
106
 
105
107
  const { rows: objects = [] } = await pg.query(q);
106
108
 
107
109
  if (!objects.length) {
108
- return reply.status(200).send(`object not found: ${id}`);
110
+ return `object not found: ${id}`;
109
111
  }
110
112
 
111
113
  const layerData = layers.find((el) => (el.id || el.name) === objects[0].layer) || {};
112
114
  const rows = objects.slice(0, 1).map(el => ({ ...el.data, data: undefined }));
113
115
 
114
116
  const { cls, htmls } = layerData;
115
- await metaFormat({ rows, cls, htmls, sufix: false }, pg);
117
+ await metaFormat({
118
+ rows, cls, htmls, sufix: false,
119
+ }, pg);
116
120
 
117
121
  const resp = {
118
122
  meta: {
@@ -125,5 +129,5 @@ export default async function mapFeaturesPoint({ pg = pgClients.client, params =
125
129
  },
126
130
  };
127
131
 
128
- return reply.status(200).send(resp);
129
- }
132
+ return resp;
133
+ }