@opengis/fastify-table 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/Changelog.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # fastify-table
2
2
 
3
+ ## 1.0.4 - 20.04.2024
4
+
5
+ - data api - order
6
+ - suggest api - db support
7
+ - del api fix
8
+
3
9
  ## 1.0.3 - 17.04.2024
4
10
 
5
11
  - fix unit test
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengis/fastify-table",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "type": "module",
5
5
  "description": "core-plugins",
6
6
  "main": "index.js",
@@ -9,12 +9,13 @@ export default async function suggest(req) {
9
9
 
10
10
  const lang = query.lang || 'ua';
11
11
  const time = Date.now();
12
+ const parent = query.parent || '';
12
13
 
13
14
  const selectName = query.sel || query.name || params.data;
14
15
  if (!selectName) return { headers, status: 400, message: 'name is required' };
15
16
 
16
17
  const meta = await getSelectMeta({ name: selectName });
17
- const pg = meta.db ? getPG(meta.db) : pg1;
18
+ const pg = meta.db ? getPG({ db: meta.db }) : pg1;
18
19
  if (!meta) return { headers, status: 404, message: 'Not found query select ' };
19
20
 
20
21
  const { arr, searchQuery } = meta;
@@ -36,7 +37,7 @@ export default async function suggest(req) {
36
37
  const pk = meta.originalCols.split(',')[0];
37
38
  const val = query.val ? ` ${pk}=any('{${query.val.replace(/'/g, "''")}}')` : '';
38
39
 
39
- const sqlSuggest = `with rows(id,text) as (${meta.original} where ${[search, val].filter((el) => el).join(' and ') || 'true'}) select * from rows limit ${limit}`;
40
+ const sqlSuggest = `with rows(id,text) as (${meta.original.replace(/{{parent}}/gi, parent)} where ${[search, val].filter((el) => el).join(' and ') || 'true'}) select * from rows limit ${limit}`;
40
41
  if (query.sql) return sqlSuggest;
41
42
 
42
43
  // query
@@ -39,7 +39,7 @@ export default async function getSelectMeta({ name, pg: pg1 }) {
39
39
 
40
40
  // column name
41
41
  const cols = dataOrigin.fields.map((el) => el.name);
42
- const type = dataOrigin.fields.map((el) => pg.pgType[el.dataTypeID]);
42
+ const type = dataOrigin.fields.map((el) => pg.pgType?.[el.dataTypeID] || 'text');
43
43
 
44
44
  const searchColumn = cls?.searchColumn || (
45
45
  dataOrigin.fields.find((el) => el.name === 'search') ? 'search' : dataOrigin1.fields[1].name);
@@ -52,7 +52,7 @@ export default async function getSelectMeta({ name, pg: pg1 }) {
52
52
  cols: cols.join(','),
53
53
  originalCols: dataOrigin1.fields.map((el) => el.name).join(','),
54
54
  db: cls.db,
55
- original,
55
+ original: original?.includes('where') ? `select * from (${original})q` : original,
56
56
  sql,
57
57
  count,
58
58
  searchQuery,
@@ -11,13 +11,38 @@ test('api crud', async (t) => {
11
11
  const res = await app.inject({
12
12
  method: 'POST',
13
13
  url: '/api/crud/gis.dataset',
14
- body: { dataset_name: '111' },
14
+ body: { dataset_name: '111', dataset_id: '5400000' },
15
15
  });
16
16
 
17
17
  const rep = JSON.parse(res?.body);
18
18
  // rep.dataset_id
19
- // console.log(rep.total);
20
- pgClients.client.query('delete from gis.dataset where dataset_id=$1', [rep.dataset_id]);
19
+ // console.log(rep);
20
+ // pgClients.client.query('delete from gis.dataset where dataset_id=$1', [rep.dataset_id]);
21
21
  assert.ok(rep.dataset_id);
22
22
  });
23
+
24
+ await t.test('PUT /update', async () => {
25
+ const res = await app.inject({
26
+ method: 'PUT',
27
+ url: '/api/crud/gis.dataset/5400000',
28
+ body: { editor_id: '11' },
29
+ });
30
+
31
+ const rep = JSON.parse(res?.body);
32
+ // rep.dataset_id
33
+ // console.log(rep);
34
+ assert.equal(rep.editor_id, '11')
35
+ });
36
+
37
+ await t.test('DELETE /delete', async () => {
38
+ const res = await app.inject({
39
+ method: 'DELETE',
40
+ url: '/api/crud/gis.dataset/5400000',
41
+ });
42
+
43
+ const rep = JSON.parse(res?.body);
44
+ // rep.dataset_id
45
+ // console.log(rep);
46
+ assert.ok(rep);
47
+ });
23
48
  });
@@ -26,4 +26,24 @@ test('api table', async (t) => {
26
26
  // console.log(rep.total);
27
27
  assert.ok(rep.total);
28
28
  });
29
+ await t.test('GET /form', async () => {
30
+ const res = await app.inject({
31
+ method: 'GET',
32
+ url: '/api/form/cp_building.form',
33
+ });
34
+ // console.log(res);
35
+ const rep = JSON.parse(res?.body);
36
+ // console.log(rep.total);
37
+ assert.ok(rep);
38
+ });
39
+ await t.test('GET /filter', async () => {
40
+ const res = await app.inject({
41
+ method: 'GET',
42
+ url: '/api/filter/gis.dataset.table',
43
+ });
44
+ // console.log(res);
45
+ const rep = JSON.parse(res?.body);
46
+ // console.log(rep.total);
47
+ assert.ok(rep);
48
+ });
29
49
  });
@@ -7,17 +7,21 @@ import rclient from '../../redis/client.js';
7
7
 
8
8
  import dataInsert from '../../crud/funcs/dataInsert.js';
9
9
  import dataUpdate from '../../crud/funcs/dataUpdate.js';
10
+ import dataDelete from '../../crud/funcs/dataDelete.js';
11
+ import isFileExists from '../../crud/funcs/isFileExists.js';
10
12
 
11
13
  import getOpt from '../../crud/funcs/getOpt.js';
12
14
  import setOpt from '../../crud/funcs/setOpt.js';
13
15
 
14
- test('fucns crud', async (t) => {
16
+ test('funcs crud', async (t) => {
17
+
15
18
  await t.test('getOpt/setOpt', async () => {
16
19
  const opt = await setOpt({ table: 'gis.dataset' });
17
20
  const data = await getOpt(opt);
18
21
  // console.log(data);
19
22
  assert.equal(data.table, 'gis.dataset');
20
23
  });
24
+
21
25
  const id = (Math.random() * 10000).toFixed();
22
26
  await t.test('dataInsert', async () => {
23
27
  const data = await dataInsert({ table: 'gis.dataset', data: { dataset_id: id, dataset_name: '222' } });
@@ -29,7 +33,17 @@ test('fucns crud', async (t) => {
29
33
  assert.equal(data.dataset_name, '22211');
30
34
  });
31
35
 
32
- pgClients.client.query('delete from gis.dataset where dataset_id=$1', [id]);
36
+ await t.test('dataDelete', async () => {
37
+ const data = await dataDelete({ table: 'gis.dataset', id });
38
+ assert.ok(data);
39
+ });
40
+
41
+ await t.test('isFileExists', async () => {
42
+ const data = await isFileExists({filepath: '../../crud/funcs/isFileExists.js'});
43
+ assert.equal(data, false);
44
+ });
45
+
46
+ // pgClients.client.query('delete from gis.dataset where dataset_id=$1', [id]);
33
47
  t.after(() => {
34
48
  pgClients.client?.end();
35
49
  rclient.quit();
@@ -7,6 +7,7 @@ import getMeta from '../../pg/funcs/getMeta.js';
7
7
  import autoIndex from '../../pg/funcs/autoIndex.js';
8
8
  import pgClients from '../../pg/pgClients.js';
9
9
  import rclient from '../../redis/client.js';
10
+ import getPG from '../../pg/funcs/getPG.js'
10
11
 
11
12
  test('funcs pg', async (t) => {
12
13
  await t.test('getMeta', async () => {
@@ -15,6 +16,11 @@ test('funcs pg', async (t) => {
15
16
  assert.ok(columns);
16
17
  });
17
18
 
19
+ await t.test('getPG', async (t) => {
20
+ const data = await getPG({});
21
+ assert.ok(data);
22
+ });
23
+
18
24
  await t.test('autoIndex', async () => {
19
25
  await autoIndex({ table: 'gis.dataset', columns: ['service_type'] });
20
26
  assert.ok(1);
@@ -4,6 +4,11 @@ import '../config.js';
4
4
  import pgClients from '../../pg/pgClients.js';
5
5
  import rclient from '../../redis/client.js';
6
6
  import getFilterSQL from '../../table/funcs/getFilterSQL/index.js';
7
+ import getTableSql from '../../table/funcs/getFilterSQL/index.js';
8
+ import getCustomQuery from '../../table/funcs/getFilterSQL/index.js';
9
+ import getFilterQuery from '../../table/funcs/getFilterSQL/index.js';
10
+ import formatValue from '../../table/funcs/getFilterSQL/index.js';
11
+ import getOptimizedQuery from '../../table/funcs/getFilterSQL/index.js';
7
12
 
8
13
  test('fucns table', async (t) => {
9
14
  await t.test('getMeta', async () => {
@@ -11,7 +16,31 @@ test('fucns table', async (t) => {
11
16
  // console.log(data);
12
17
  assert.ok(data.q);
13
18
  });
14
-
19
+
20
+ await t.test('formatValue', async (t) => {
21
+ const data = await formatValue( {table: 'gis.dataset'} );
22
+ assert.ok(data);
23
+ });
24
+
25
+ await t.test('getCustomQuery', async (t) => {
26
+ const data = await getCustomQuery( {table: 'gis.dataset'} );
27
+ assert.ok(data);
28
+ });
29
+
30
+ await t.test('getFilterQuery', async (t) => {
31
+ const data = await getFilterQuery( {table: 'gis.dataset'} );
32
+ assert.ok(data);
33
+ });
34
+
35
+ await t.test('getOptimizedQuery', async (t) => {
36
+ const data = await getOptimizedQuery( {table: 'gis.dataset'} );
37
+ assert.ok(data);
38
+ });
39
+
40
+ await t.test('getTableSql', async (t) => {
41
+ const data = await getTableSql( {table: 'gis.dataset'} );
42
+ assert.ok(data);
43
+ });
15
44
  t.after(() => {
16
45
  pgClients.client.end();
17
46
  rclient.quit();
@@ -0,0 +1,4 @@
1
+ {
2
+ "db": "geo_atu",
3
+ "searchColumn": "name_ua"
4
+ }
@@ -0,0 +1,11 @@
1
+ /*db:geo_atu*/
2
+ SELECT a.codifier, a.name_ua ||' '||case when b.ato_type_old in (1,2, 4) then '' else b.prefix_ua end ||' '|| coalesce(a.codifier, '')||
3
+ case when b.ato_type_old in (5,6) then coalesce(' (' || a3.name_ua ||' область'||')' ,'')
4
+ else coalesce(' (' || a3.name_ua ||' область, ' || a2.name_ua ||' '||b2.prefix_ua ||' )','') end as name, b.ato_level + 1 as ato_level, st_asgeojson(a.geom::box2d::geometry)::json as geom,
5
+ case when a.object_type in ('O','A','K') then 'regional' when a.object_type in ('B','X','C','T','M','P','H') then 'local' end as resource_level, a.name_ua
6
+ FROM ato_new.ato_new_all a
7
+ left join ato_new.ato_settings_city_and_terrytory b on b.ato_type=a.object_type
8
+ left join ato_new.ato_new_all a2 on a2.region_id=a.parent_level2
9
+ left join ato_new.ato_new_all a3 on a3.region_id=a.parent_level1
10
+ left join ato_new.ato_settings_city_and_terrytory b2 on b2.ato_type=a2.object_type
11
+ where a.object_status <> '3' and a.codifier is not null