@opengis/gis 0.2.172 → 0.2.174

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 (27) hide show
  1. package/dist/{CardIcon-DrNd-2PW.js → CardIcon-Cg8bUM4G.js} +1 -1
  2. package/dist/{EntityTablePage-CERD3KWs.js → EntityTablePage-DHQGlLRk.js} +1 -1
  3. package/dist/{ExtentOutlineLayer.vue_vue_type_script_setup_true_lang-3IWWtgKt.js → ExtentOutlineLayer.vue_vue_type_script_setup_true_lang-BIL1ocLY.js} +1 -1
  4. package/dist/{HeaderActions.vue_vue_type_script_setup_true_lang-D_BESZDN.js → HeaderActions.vue_vue_type_script_setup_true_lang-Buff9gTO.js} +1 -1
  5. package/dist/{MapSettings-Dlo25naH.js → MapSettings-De-z7r5t.js} +1 -1
  6. package/dist/{RastersTablePage-BB5DAQ9o.js → RastersTablePage-Cdgkri9K.js} +1 -1
  7. package/dist/{cartocss-DmNfkX6X.js → cartocss-BT50SVhy.js} +5 -5
  8. package/dist/{import-utils-Dp6H-Ajf.js → import-utils-CMWiuRPp.js} +1 -1
  9. package/dist/{index-BaB3A3Tb.js → index-CHFLgCGW.js} +688 -678
  10. package/dist/index.css +1 -1
  11. package/dist/index.js +1 -1
  12. package/dist/index.umd.cjs +19 -19
  13. package/dist/{raster-GtCFqtk-.js → raster-dSEb1SIG.js} +3 -3
  14. package/dist/{register-BQEx0elz.js → register-D7Puupgo.js} +3 -3
  15. package/dist/{service-CgO3RsDo.js → service-Cz6T0O3Z.js} +5 -5
  16. package/dist/{vs-datatable-B3hGBtGc.js → vs-datatable-DqVncrSg.js} +1 -1
  17. package/package.json +1 -1
  18. package/server/routes/cartocss/cartocss.schema.js +3 -3
  19. package/server/routes/map/map.schema.js +1 -1
  20. package/server/routes/mapnik/functions/createXml.js +20 -8
  21. package/server/routes/mapnik/mapnik.route.js +1 -1
  22. package/server/routes/mapnik/mapnik.schema.mjs +12 -7
  23. package/server/routes/maps/maps.schema.js +1 -1
  24. package/server/routes/metadata/metadata.schema.js +2 -2
  25. package/server/routes/permissions/permissions.schema.js +3 -3
  26. package/server/routes/registers/registers.schema.js +7 -7
  27. package/server/routes/services/services.schema.js +7 -7
@@ -1,9 +1,9 @@
1
1
  import { defineComponent as te, resolveDirective as We, openBlock as u, createElementBlock as m, createElementVNode as n, Fragment as W, renderList as X, toDisplayString as d, withDirectives as we, createTextVNode as Xe, normalizeClass as ae, ref as $, watch as S, computed as h, vModelText as Ke, onMounted as Ye, onBeforeUnmount as Ze, createCommentVNode as q, createVNode as B, withCtx as He, createBlock as F, resolveDynamicComponent as Je } from "vue";
2
2
  import { useRouter as et, useRoute as tt } from "vue-router";
3
3
  import { TooltipDirective as st, notify as M } from "@opengis/core";
4
- import { _ as nt, u as lt, f as rt, M as ot, i as it, j as be, F as at } from "./index-BaB3A3Tb.js";
5
- import { _ as ut, a as ct, b as dt, c as ft } from "./HeaderActions.vue_vue_type_script_setup_true_lang-D_BESZDN.js";
6
- import { _ as he } from "./ExtentOutlineLayer.vue_vue_type_script_setup_true_lang-3IWWtgKt.js";
4
+ import { _ as nt, u as lt, f as rt, M as ot, i as it, j as be, F as at } from "./index-CHFLgCGW.js";
5
+ import { _ as ut, a as ct, b as dt, c as ft } from "./HeaderActions.vue_vue_type_script_setup_true_lang-Buff9gTO.js";
6
+ import { _ as he } from "./ExtentOutlineLayer.vue_vue_type_script_setup_true_lang-BIL1ocLY.js";
7
7
  const mt = { class: "flex-1 overflow-y-auto p-4 sm:p-6" }, pt = { class: "space-y-3" }, gt = { class: "bg-white p-3 rounded-xl border border-gray-200 shadow-sm" }, yt = { class: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2" }, vt = { class: "text-xs text-gray-500 mb-1" }, xt = {
8
8
  key: 0,
9
9
  class: "text-base text-md font-semibold text-gray-900"
@@ -2,9 +2,9 @@ import { defineComponent as B, mergeModels as j, useModel as S, computed as h, d
2
2
  import { useRoute as Z, useRouter as ee } from "vue-router";
3
3
  import { notify as F } from "@opengis/core";
4
4
  import { _ as te } from "./TableFormHeader.vue_vue_type_script_setup_true_lang-Mci_tseM.js";
5
- import { V as N } from "./vs-datatable-B3hGBtGc.js";
6
- import { _ as z, n as R, m as E, r as H } from "./import-utils-Dp6H-Ajf.js";
7
- import { a as ae, b as le, c as se, d as oe, e as ie } from "./index-BaB3A3Tb.js";
5
+ import { V as N } from "./vs-datatable-DqVncrSg.js";
6
+ import { _ as z, n as R, m as E, r as H } from "./import-utils-CMWiuRPp.js";
7
+ import { a as ae, b as le, c as se, d as oe, e as ie } from "./index-CHFLgCGW.js";
8
8
  import { LucideChevronRight as re } from "lucide-vue-next";
9
9
  import { _ as ne } from "./MapSettingsTabs.vue_vue_type_script_setup_true_lang-CKCK3NqY.js";
10
10
  const ue = { class: "vs-form" }, de = { class: "vs-form__body auto-rows-max container" }, ce = { class: "flex flex-wrap" }, me = { class: "h-fit w-full mb-6 bg-white border border-gray-200 rounded-lg p-6" }, ve = { class: "h-fit w-full flex flex-wrap" }, pe = { class: "w-full" }, fe = /* @__PURE__ */ B({
@@ -4,12 +4,12 @@ var L = (e, n, t) => pi(e, typeof n != "symbol" ? n + "" : n, t);
4
4
  import { openBlock as _, createElementBlock as M, createElementVNode as g, defineComponent as ae, ref as E, watch as $, createTextVNode as mi, createVNode as D, createBlock as P, createCommentVNode as W, defineAsyncComponent as hi, unref as ze, withCtx as bn, withDirectives as fn, vModelText as dn, normalizeClass as _e, Fragment as kt, renderList as At, toDisplayString as fe, getCurrentInstance as Ct, onBeforeUnmount as wt, toRef as gi, computed as ve, onMounted as yi, resolveDynamicComponent as vi } from "vue";
5
5
  import { useRoute as bi, useRouter as xi } from "vue-router";
6
6
  import { notify as X } from "@opengis/core";
7
- import { _ as Xe, u as Ge, f as Si, M as ki, g as Ai, h as Ci, i as wi, j as tt, k as Ti, l as _i, m as Ei, s as it, n as Ii } from "./index-BaB3A3Tb.js";
8
- import { _ as Ni, a as $i, b as Li, c as Fi } from "./HeaderActions.vue_vue_type_script_setup_true_lang-D_BESZDN.js";
9
- import { S as Oi, C as Ri } from "./CardIcon-DrNd-2PW.js";
7
+ import { _ as Xe, u as Ge, f as Si, M as ki, g as Ai, h as Ci, i as wi, j as tt, k as Ti, l as _i, m as Ei, s as it, n as Ii } from "./index-CHFLgCGW.js";
8
+ import { _ as Ni, a as $i, b as Li, c as Fi } from "./HeaderActions.vue_vue_type_script_setup_true_lang-Buff9gTO.js";
9
+ import { S as Oi, C as Ri } from "./CardIcon-Cg8bUM4G.js";
10
10
  import { _ as Tt } from "./MonacoEditor.vue_vue_type_script_setup_true_lang-D3ZPeXMw.js";
11
- import { V as Ze } from "./vs-datatable-B3hGBtGc.js";
12
- import { _ as Nn, m as $n, r as $e } from "./import-utils-Dp6H-Ajf.js";
11
+ import { V as Ze } from "./vs-datatable-DqVncrSg.js";
12
+ import { _ as Nn, m as $n, r as $e } from "./import-utils-CMWiuRPp.js";
13
13
  /*! js-yaml 5.2.1 https://github.com/nodeca/js-yaml @license MIT */
14
14
  var T = Symbol("NOT_RESOLVED"), Ln = Symbol("MERGE_KEY");
15
15
  function U(e, n) {
@@ -1,7 +1,7 @@
1
1
  import { defineComponent as F, mergeModels as O, defineAsyncComponent as I, useModel as R, ref as y, watch as K, openBlock as o, createElementBlock as s, createElementVNode as e, createVNode as $, unref as x, withCtx as S, createStaticVNode as V, useSlots as P, computed as H, Fragment as b, createTextVNode as U, createCommentVNode as N, renderList as A, normalizeStyle as Q, toDisplayString as M, normalizeClass as z, withModifiers as X, createBlock as Y, resolveDynamicComponent as ee, withDirectives as te, renderSlot as ne } from "vue";
2
2
  import { notify as E } from "@opengis/core";
3
3
  import { Edit as le, Trash as oe } from "lucide-vue-next";
4
- import { _ as u } from "./index-BaB3A3Tb.js";
4
+ import { _ as u } from "./index-CHFLgCGW.js";
5
5
  const se = { class: "flex items-center justify-center col-span-3 gap-2" }, re = { class: "flex justify-end p-[20px] gap-[10px] border-t w-full" }, ie = /* @__PURE__ */ F({
6
6
  __name: "vs-datatable-controls",
7
7
  props: /* @__PURE__ */ O({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengis/gis",
3
- "version": "0.2.172",
3
+ "version": "0.2.174",
4
4
  "type": "module",
5
5
  "author": "Softpro",
6
6
  "main": "./dist/index.js",
@@ -25,7 +25,7 @@ const cssBodySchema = {
25
25
  additionalProperties: true,
26
26
 
27
27
  properties: {
28
- id: { type: "string", pattern: '^([\\d\\w]+)$' },
28
+ id: { type: "string", pattern: '^([\\d\\w._-]+)$' },
29
29
  name: { type: "string" },
30
30
  group_id: { type: "string" },
31
31
  cartocss_key: { type: "string" },
@@ -46,7 +46,7 @@ export const getCartocssSchema = {
46
46
  type: 'object',
47
47
  required: ['id'],
48
48
  properties: {
49
- id: { type: 'string', pattern: '^([\\d\\w]+)$' }
49
+ id: { type: 'string', pattern: '^([\\d\\w._-]+)$' }
50
50
  }
51
51
  },
52
52
  querystring: {
@@ -64,7 +64,7 @@ export const addCartocssSchema = {
64
64
  type: 'object',
65
65
  required: ['id'],
66
66
  properties: {
67
- id: { type: 'string', pattern: '^([\\d\\w]+)$' }
67
+ id: { type: 'string', pattern: '^([\\d\\w._-]+)$' }
68
68
  }
69
69
  },
70
70
  body: cssBodySchema,
@@ -259,7 +259,7 @@ export const clearTilesSchema = {
259
259
  type: 'object',
260
260
  properties: {
261
261
  id: {
262
- type: 'string', pattern: '^([\\d\\w]+)$'
262
+ type: 'string', pattern: '^([\\d\\w._-]+)$'
263
263
  },
264
264
  },
265
265
  },
@@ -1,14 +1,14 @@
1
1
  import path from 'node:path';
2
2
 
3
3
  import { config, pgClients } from '@opengis/fastify-table/utils.js';
4
+ import { BadRequestError, NotImplementedError } from '@opengis/fastify-table/errors.js';
4
5
 
5
6
  import mapnik from '../../../plugins/mapnik/funcs/mapnik.js';
6
- import { BadRequestError, NotFoundError, NotImplementedError } from '@opengis/fastify-table/errors.js';
7
7
 
8
8
  const { GetRasterStatus, CreateXML } = mapnik();
9
9
 
10
10
  export default async function createXml({
11
- id, vrt, debug, nocache, callback = () => { },
11
+ id, vrt, srid, proj4: queryProj4, debug, nocache, callback = () => { },
12
12
  }, pg = pgClients.client) {
13
13
  if (!GetRasterStatus || !CreateXML) {
14
14
  throw NotImplementedError('mapnik server address needed');
@@ -24,18 +24,30 @@ export default async function createXml({
24
24
  : null;
25
25
 
26
26
  if (!data?.id) {
27
- throw NotFoundError('raster not found')
27
+ // throw NotFoundError('raster not found');
28
28
  }
29
29
 
30
- if (!data.source_path) {
30
+ if (data && !data?.source_path) {
31
31
  throw BadRequestError('raster source_path not set');
32
32
  }
33
33
 
34
+ const sourcePath = data?.id ? data.source_path : Buffer.from(id, "base64").toString("utf-8");
35
+
36
+ const extension = path.extname(sourcePath)?.toLowerCase();
37
+
38
+ if (!data && (!extension || !extension.match(/^(\.tif|\.tiff)$/i))) {
39
+ throw BadRequestError('invalid params: id');
40
+ }
41
+
42
+ if (!data && !(srid || queryProj4)) {
43
+ // throw BadRequestError('not enough query params: srid/proj4');
44
+ }
45
+
34
46
  // const relpath = `/map/raster/${data.source_path}`;
35
- const relpath = ['raster', config.mapnik?.folder, data.source_path].filter(Boolean).join('/');
47
+ const relpath = ['raster', config.mapnik?.folder, sourcePath].filter(Boolean).join('/');
36
48
 
37
49
  // check raster upload status, skip for directories
38
- const uploadStatus = path.extname(data.source_path) ? await GetRasterStatus({ path: relpath }) : {};
50
+ const uploadStatus = extension ? await GetRasterStatus({ path: relpath }) : {};
39
51
 
40
52
  if (uploadStatus.exists === false) {
41
53
  throw BadRequestError('raster not uploaded');
@@ -45,13 +57,13 @@ export default async function createXml({
45
57
  throw BadRequestError('upload not finished');
46
58
  }
47
59
 
48
- const proj4 = data.srid && pg.pk?.['public.spatial_ref_sys'] ? await pg.query('select proj4text from public.spatial_ref_sys where srid=$1', [data.srid]).then(r => r.rows?.[0]?.proj4text) : undefined;
60
+ const proj4 = queryProj4 || (data?.srid && pg.pk?.['public.spatial_ref_sys'] ? await pg.query('select proj4text from public.spatial_ref_sys where srid=$1', [srid || data?.srid]).then(r => r.rows?.[0]?.proj4text) : undefined);
49
61
 
50
62
  // create at xml/:id with name only, always - by path
51
63
  const resp = await CreateXML({
52
64
  path: relpath,
53
65
  name: [config.mapnik?.folder, id].filter(Boolean).join('/'), // create additional xml named as primary key at xml directory
54
- previewZoom: data.raster_zoom, // preview<=>detailed, default = 16 if file size > 1GB
66
+ previewZoom: data?.raster_zoom, // preview<=>detailed, default = 16 if file size > 1GB
55
67
  // srid: data.srid, // auto detected if not supplied
56
68
  proj4,
57
69
  vrt, // force vrt even if relpath leads to single raster file
@@ -38,7 +38,7 @@ export default function route(app) {
38
38
  });
39
39
  app.get('/gis-xml/:id', { ...publicParams, schema: gisXmlSchema }, async ({ params, query }, reply) => {
40
40
  const callback = process.env.NODE_ENV === 'test' || process.env.VITEST ? console.log : eventStream(reply);
41
- const result = await createXml({ id: params.id, vrt: query.vrt, debug: query.debug, nocache: query.nocache, callback }).catch(err => ({ error: err.toString() }));
41
+ const result = await createXml({ id: params.id, srid: query.srid, proj4: query.proj4, vrt: query.vrt, debug: query.debug, nocache: query.nocache, callback }).catch(err => ({ error: err.toString() }));
42
42
  callback(result?.error || 'finish', true);
43
43
  return result;
44
44
  });
@@ -10,7 +10,7 @@ export const pretileSchema = {
10
10
  params: {
11
11
  type: "object",
12
12
  properties: {
13
- id: { type: "string", pattern: '^([\\d\\w]+)$', },
13
+ id: { type: "string", pattern: '^([\\d\\w._-]+)$', },
14
14
  },
15
15
  required: ["id"],
16
16
  },
@@ -29,7 +29,7 @@ export const uploadRasterSchema = {
29
29
  params: {
30
30
  type: "object",
31
31
  properties: {
32
- id: { type: "string", pattern: '^([\\d\\w]+)$', },
32
+ id: { type: "string", pattern: '^([\\d\\w._-]+)$', },
33
33
  },
34
34
  required: ["id"],
35
35
  },
@@ -39,7 +39,7 @@ export const gisXmlSchema = {
39
39
  params: {
40
40
  type: "object",
41
41
  properties: {
42
- id: { type: "string", pattern: '^([\\d\\w]+)$', },
42
+ id: { type: "string", pattern: '^([\\d\\w._-]+)$', },
43
43
  },
44
44
  required: ["id"],
45
45
  },
@@ -51,6 +51,11 @@ export const gisXmlSchema = {
51
51
  nocache: { type: "string", enum: ['true', '1'] },
52
52
  vrt: { type: "string", enum: ['true', '1'] },
53
53
  debug: { type: "number", minimum: 1, maximum: 10 },
54
+ srid: { type: "number", minimum: 1, maximum: 1000000 },
55
+ proj4: {
56
+ type: "string", minLength: 1,
57
+ maxLength: 4096
58
+ },
54
59
  },
55
60
  },
56
61
  };
@@ -59,7 +64,7 @@ export const gisRtileSchema = {
59
64
  params: {
60
65
  type: "object",
61
66
  properties: {
62
- id: { type: "string", pattern: '^([\\d\\w]+)$', },
67
+ id: { type: "string", pattern: '^([\\d\\w._-]+)$', },
63
68
  z: {
64
69
  type: 'number',
65
70
  },
@@ -98,7 +103,7 @@ export const gisRasterSchema = {
98
103
  params: {
99
104
  type: "object",
100
105
  properties: {
101
- id: { type: "string", pattern: '^([\\d\\w]+)$', },
106
+ id: { type: "string", pattern: '^([\\d\\w._-]+)$', },
102
107
  },
103
108
  required: ["id"],
104
109
  },
@@ -115,7 +120,7 @@ export const createXmlMultiSchema = {
115
120
  params: {
116
121
  type: "object",
117
122
  properties: {
118
- id: { type: "string", pattern: '^([\\d\\w]+)$', },
123
+ id: { type: "string", pattern: '^([\\d\\w._-]+)$', },
119
124
  },
120
125
  },
121
126
  querystring: {
@@ -175,7 +180,7 @@ export const clearTilesSchema = {
175
180
  params: {
176
181
  type: "object",
177
182
  properties: {
178
- id: { type: "string", pattern: '^([\\d\\w]+)$', },
183
+ id: { type: "string", pattern: '^([\\d\\w._-]+)$', },
179
184
  },
180
185
  },
181
186
  querystring: {
@@ -2,7 +2,7 @@ export const schemaInfo = {
2
2
  params: {
3
3
  type: 'object',
4
4
  properties: {
5
- id: { type: "string", pattern: '^([\\d\\w]+)$' },
5
+ id: { type: "string", pattern: '^([\\d\\w._-]+)$' },
6
6
  },
7
7
  },
8
8
  };
@@ -4,7 +4,7 @@ export const editMetadataSchema = {
4
4
  required: ['type', 'id'],
5
5
  properties: {
6
6
  type: { type: 'string', enum: ['raster', 'css', 'dataset', 'service'] },
7
- id: { type: 'string', pattern: '^([\\d\\w]+)$' },
7
+ id: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
8
8
  },
9
9
  },
10
10
  body: {
@@ -45,7 +45,7 @@ export const metadataXMLSchema = {
45
45
  type: 'object',
46
46
  required: ['id'],
47
47
  properties: {
48
- id: { type: 'string', pattern: '^([\\d\\w]+)$' },
48
+ id: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
49
49
  },
50
50
  },
51
51
  };
@@ -4,7 +4,7 @@ export const getCatalogPermissionsSchema = {
4
4
  required: ['uid'],
5
5
  properties: {
6
6
  uid: {
7
- type: 'string', pattern: '^([\\d\\w]+)$'
7
+ type: 'string', pattern: '^([\\d\\w._-]+)$'
8
8
  },
9
9
  },
10
10
  },
@@ -16,7 +16,7 @@ export const editCatalogPermissionsSchema = {
16
16
  required: ['uid'],
17
17
  properties: {
18
18
  uid: {
19
- type: 'string', pattern: '^([\\d\\w]+)$'
19
+ type: 'string', pattern: '^([\\d\\w._-]+)$'
20
20
  },
21
21
  },
22
22
  },
@@ -27,7 +27,7 @@ export const editCatalogPermissionsSchema = {
27
27
  required: ['service_id', 'actions'],
28
28
  properties: {
29
29
  service_id: {
30
- type: 'string', pattern: '^([\\d\\w]+)$'
30
+ type: 'string', pattern: '^([\\d\\w._-]+)$'
31
31
  },
32
32
  actions: {
33
33
  type: 'array',
@@ -5,9 +5,9 @@ const registerSchema = {
5
5
  type: 'object',
6
6
  additionalProperties: false,
7
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]+)$' },
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
11
 
12
12
  name: { type: 'string' },
13
13
  description: { type: ['string', 'null'] },
@@ -105,7 +105,7 @@ const registerSchema = {
105
105
  additionalProperties: false,
106
106
  required: ['id', 'text'],
107
107
  properties: {
108
- id: { type: 'string', pattern: '^([\\d\\w]+)$' },
108
+ id: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
109
109
  text: { type: 'string' },
110
110
  icon: { type: ['string', 'null'] },
111
111
  color: { type: 'string' },
@@ -119,7 +119,7 @@ const registerSchema = {
119
119
  additionalProperties: false,
120
120
  required: ['id', 'text'],
121
121
  properties: {
122
- id: { type: 'string', pattern: '^([\\d\\w]+)$' },
122
+ id: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
123
123
  text: { type: 'string' },
124
124
  icon: { type: ['string', 'null'] },
125
125
  color: { type: 'string' },
@@ -131,7 +131,7 @@ const registerSchema = {
131
131
  additionalProperties: false,
132
132
  required: ['id', 'text'],
133
133
  properties: {
134
- id: { type: 'string', pattern: '^([\\d\\w]+)$' },
134
+ id: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
135
135
  text: { type: 'string' },
136
136
  icon: { type: ['string', 'null'] },
137
137
  color: { type: 'string' },
@@ -156,7 +156,7 @@ export const gisRegistrySchema = {
156
156
  required: ['slug'],
157
157
  properties: {
158
158
  slug: { type: 'string' },
159
- objectId: { type: 'string', pattern: '^([\\d\\w]+)$' },
159
+ objectId: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
160
160
  },
161
161
  },
162
162
  querystring: {
@@ -4,7 +4,7 @@ const serviceBodySchema = {
4
4
  type: 'object',
5
5
  additionalProperties: false,
6
6
  properties: {
7
- service_id: { type: 'string', pattern: '^([\\d\\w]+)$' },
7
+ service_id: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
8
8
  service_key: { type: 'string' },
9
9
  name: { type: 'string' },
10
10
  description: { type: ['string', 'null'] },
@@ -188,7 +188,7 @@ export const getServicesSchema = {
188
188
  params: {
189
189
  type: 'object',
190
190
  properties: {
191
- id: { type: 'string', pattern: '^([\\d\\w]+)$' },
191
+ id: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
192
192
  },
193
193
  },
194
194
  };
@@ -198,7 +198,7 @@ export const getServicesColSchema = {
198
198
  type: 'object',
199
199
  required: ['id', 'col'],
200
200
  properties: {
201
- id: { type: 'string', pattern: '^([\\d\\w]+)$' },
201
+ id: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
202
202
  col: { type: 'string', pattern: '^([\\d\\w_]+)$' },
203
203
  },
204
204
  },
@@ -207,7 +207,7 @@ export const addServiceSchema = {
207
207
  params: {
208
208
  type: 'object',
209
209
  properties: {
210
- id: { type: 'string', pattern: '^([\\d\\w]+)$' },
210
+ id: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
211
211
  },
212
212
  },
213
213
  body: { ...serviceBodySchema, required: ['name', 'service_type'] }
@@ -217,7 +217,7 @@ export const editServiceSchema = {
217
217
  type: 'object',
218
218
  required: ['id'],
219
219
  properties: {
220
- id: { type: 'string', pattern: '^([\\d\\w]+)$' },
220
+ id: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
221
221
  },
222
222
  },
223
223
  body: serviceBodySchema
@@ -227,7 +227,7 @@ export const deleteServiceSchema = {
227
227
  type: 'object',
228
228
  required: ['id'],
229
229
  properties: {
230
- id: { type: 'string', pattern: '^([\\d\\w]+)$' },
230
+ id: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
231
231
  },
232
232
  },
233
233
  };
@@ -236,7 +236,7 @@ export const getServiceUsersSchema = {
236
236
  params: {
237
237
  type: 'object',
238
238
  properties: {
239
- id: { type: 'string', pattern: '^([\\d\\w]+)$' },
239
+ id: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
240
240
  },
241
241
  },
242
242
  querystring: {