@opengis/fastify-table 1.0.2 → 1.0.3
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/.eslintrc.cjs +42 -42
- package/Changelog.md +20 -12
- package/README.md +26 -26
- package/config.js +3 -3
- package/crud/controllers/deleteCrud.js +10 -10
- package/crud/controllers/insert.js +9 -9
- package/crud/controllers/update.js +10 -10
- package/crud/funcs/dataInsert.js +24 -24
- package/crud/funcs/dataUpdate.js +20 -20
- package/crud/funcs/getOpt.js +2 -2
- package/crud/funcs/isFileExists.js +13 -13
- package/crud/funcs/setOpt.js +1 -1
- package/crud/index.js +29 -29
- package/helper.js +28 -28
- package/index.js +22 -22
- package/package.json +22 -22
- package/pg/funcs/autoIndex.js +89 -89
- package/pg/funcs/getMeta.js +27 -27
- package/pg/funcs/getPG.js +2 -1
- package/pg/funcs/init.js +42 -42
- package/pg/funcs/pgClients.js +2 -2
- package/pg/index.js +35 -35
- package/pg/pgClients.js +17 -17
- package/redis/client.js +8 -8
- package/redis/funcs/getRedis.js +2 -1
- package/redis/funcs/redisClients.js +2 -2
- package/redis/index.js +18 -18
- package/table/controllers/data.js +48 -48
- package/table/controllers/filter.js +17 -17
- package/table/controllers/form.js +10 -10
- package/table/controllers/suggest.js +56 -56
- package/table/controllers/utils/getSelect.js +20 -20
- package/table/controllers/utils/getSelectMeta.js +65 -65
- package/table/controllers/utils/getTemplate.js +24 -24
- package/table/funcs/getFilterSQL/index.js +75 -75
- package/table/funcs/getFilterSQL/util/formatValue.js +142 -142
- package/table/funcs/getFilterSQL/util/getCustomQuery.js +13 -13
- package/table/funcs/getFilterSQL/util/getFilterQuery.js +73 -73
- package/table/funcs/getFilterSQL/util/getOptimizedQuery.js +12 -12
- package/table/funcs/getFilterSQL/util/getTableSql.js +34 -34
- package/table/index.js +14 -14
- package/test/api/crud.test.js +23 -23
- package/test/api/table.test.js +29 -29
- package/test/config.example +18 -18
- package/test/funcs/crud.test.js +37 -37
- package/test/funcs/pg.test.js +26 -26
- package/test/funcs/redis.test.js +19 -19
- package/test/funcs/table.test.js +19 -19
- package/test/templates/cls/test.json +9 -9
- package/test/templates/form/cp_building.form.json +32 -32
- package/test/templates/select/storage.data.json +2 -2
- package/test/templates/table/gis.dataset.table.json +42 -42
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import getTemplate from './utils/getTemplate.js';
|
|
2
|
-
|
|
3
|
-
export default async function formFunction(req) {
|
|
4
|
-
const time = Date.now();
|
|
5
|
-
const { params } = req;
|
|
6
|
-
const form = await getTemplate('form', params.form);
|
|
7
|
-
if (!form) { return { status: 404, message: 'not found' }; }
|
|
8
|
-
|
|
9
|
-
return { time: Date.now() - time, form };
|
|
10
|
-
}
|
|
1
|
+
import getTemplate from './utils/getTemplate.js';
|
|
2
|
+
|
|
3
|
+
export default async function formFunction(req) {
|
|
4
|
+
const time = Date.now();
|
|
5
|
+
const { params } = req;
|
|
6
|
+
const form = await getTemplate('form', params.form);
|
|
7
|
+
if (!form) { return { status: 404, message: 'not found' }; }
|
|
8
|
+
|
|
9
|
+
return { time: Date.now() - time, form };
|
|
10
|
+
}
|
|
@@ -1,56 +1,56 @@
|
|
|
1
|
-
import getSelectMeta from './utils/getSelectMeta.js';
|
|
2
|
-
|
|
3
|
-
const limit = 50;
|
|
4
|
-
const headers = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET', 'Cache-Control': 'no-cache' };
|
|
5
|
-
|
|
6
|
-
export default async function suggest(req) {
|
|
7
|
-
const { params, query, pg } = req;
|
|
8
|
-
|
|
9
|
-
const lang = query.lang || 'ua';
|
|
10
|
-
const time = Date.now();
|
|
11
|
-
|
|
12
|
-
const selectName = query.sel || query.name || params.data;
|
|
13
|
-
if (!selectName) return { headers, status: 400, message: 'name is required' };
|
|
14
|
-
|
|
15
|
-
const meta = await getSelectMeta({ name: selectName });
|
|
16
|
-
if (!meta) return { headers, status: 404, message: 'Not found query select ' };
|
|
17
|
-
|
|
18
|
-
const { arr, searchQuery } = meta;
|
|
19
|
-
|
|
20
|
-
if (arr) {
|
|
21
|
-
const lower = query.key?.toLowerCase();
|
|
22
|
-
const data = query.key || query.val
|
|
23
|
-
? arr?.filter((el) => !lower || (el[lang] || el.text)?.toLowerCase()?.indexOf(lower) !== -1)?.filter((el) => !query.val || el.id === query.val)
|
|
24
|
-
: arr;
|
|
25
|
-
return {
|
|
26
|
-
limit, count: data.length, mode: 'array', time: Date.now() - time, data,
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
// search
|
|
31
|
-
const search = query.key ? searchQuery : null;
|
|
32
|
-
|
|
33
|
-
// val
|
|
34
|
-
const pk = meta.originalCols.split(',')[0];
|
|
35
|
-
const val = query.val ? ` ${pk}=any('{${query.val.replace(/'/g, "''")}}')` : '';
|
|
36
|
-
|
|
37
|
-
const sqlSuggest = `with rows(id,text) as (${meta.original} where ${[search, val].filter((el) => el).join(' and ') || 'true'}) select * from rows limit ${limit}`;
|
|
38
|
-
if (query.sql) return sqlSuggest;
|
|
39
|
-
|
|
40
|
-
// query
|
|
41
|
-
const { rows: dataNew } = meta.searchColumn ? { rows: [] } : await pg.query(sqlSuggest, query.key ? [`${query.key}%`] : []);
|
|
42
|
-
const { rows: dataNew1 } = dataNew.length < limit ? await pg.query(sqlSuggest, query.key ? [`%${query.key}%`] : []) : {};
|
|
43
|
-
const ids = dataNew.map((el) => el.id);
|
|
44
|
-
const data = dataNew.concat((dataNew1 || []).filter((el) => !ids?.includes(el.id)));
|
|
45
|
-
|
|
46
|
-
const message = {
|
|
47
|
-
time: Date.now() - time,
|
|
48
|
-
count: data.length,
|
|
49
|
-
total: meta.count - 0,
|
|
50
|
-
mode: 'sql',
|
|
51
|
-
sql: sqlSuggest,
|
|
52
|
-
data,
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
return message;
|
|
56
|
-
}
|
|
1
|
+
import getSelectMeta from './utils/getSelectMeta.js';
|
|
2
|
+
|
|
3
|
+
const limit = 50;
|
|
4
|
+
const headers = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'GET', 'Cache-Control': 'no-cache' };
|
|
5
|
+
|
|
6
|
+
export default async function suggest(req) {
|
|
7
|
+
const { params, query, pg } = req;
|
|
8
|
+
|
|
9
|
+
const lang = query.lang || 'ua';
|
|
10
|
+
const time = Date.now();
|
|
11
|
+
|
|
12
|
+
const selectName = query.sel || query.name || params.data;
|
|
13
|
+
if (!selectName) return { headers, status: 400, message: 'name is required' };
|
|
14
|
+
|
|
15
|
+
const meta = await getSelectMeta({ name: selectName });
|
|
16
|
+
if (!meta) return { headers, status: 404, message: 'Not found query select ' };
|
|
17
|
+
|
|
18
|
+
const { arr, searchQuery } = meta;
|
|
19
|
+
|
|
20
|
+
if (arr) {
|
|
21
|
+
const lower = query.key?.toLowerCase();
|
|
22
|
+
const data = query.key || query.val
|
|
23
|
+
? arr?.filter((el) => !lower || (el[lang] || el.text)?.toLowerCase()?.indexOf(lower) !== -1)?.filter((el) => !query.val || el.id === query.val)
|
|
24
|
+
: arr;
|
|
25
|
+
return {
|
|
26
|
+
limit, count: data.length, mode: 'array', time: Date.now() - time, data,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// search
|
|
31
|
+
const search = query.key ? searchQuery : null;
|
|
32
|
+
|
|
33
|
+
// val
|
|
34
|
+
const pk = meta.originalCols.split(',')[0];
|
|
35
|
+
const val = query.val ? ` ${pk}=any('{${query.val.replace(/'/g, "''")}}')` : '';
|
|
36
|
+
|
|
37
|
+
const sqlSuggest = `with rows(id,text) as (${meta.original} where ${[search, val].filter((el) => el).join(' and ') || 'true'}) select * from rows limit ${limit}`;
|
|
38
|
+
if (query.sql) return sqlSuggest;
|
|
39
|
+
|
|
40
|
+
// query
|
|
41
|
+
const { rows: dataNew } = meta.searchColumn ? { rows: [] } : await pg.query(sqlSuggest, query.key ? [`${query.key}%`] : []);
|
|
42
|
+
const { rows: dataNew1 } = dataNew.length < limit ? await pg.query(sqlSuggest, query.key ? [`%${query.key}%`] : []) : {};
|
|
43
|
+
const ids = dataNew.map((el) => el.id);
|
|
44
|
+
const data = dataNew.concat((dataNew1 || []).filter((el) => !ids?.includes(el.id)));
|
|
45
|
+
|
|
46
|
+
const message = {
|
|
47
|
+
time: Date.now() - time,
|
|
48
|
+
count: data.length,
|
|
49
|
+
total: meta.count - 0,
|
|
50
|
+
mode: 'sql',
|
|
51
|
+
sql: sqlSuggest,
|
|
52
|
+
data,
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
return message;
|
|
56
|
+
}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import getTemplate from './getTemplate.js';
|
|
2
|
-
|
|
3
|
-
const loadCls = {};
|
|
4
|
-
|
|
5
|
-
export default async function getTable(name) {
|
|
6
|
-
if (loadCls[name]) return loadCls[name];
|
|
7
|
-
|
|
8
|
-
const clsData = await getTemplate('cls', name);
|
|
9
|
-
|
|
10
|
-
if (clsData) {
|
|
11
|
-
loadCls[name] = { arr: clsData };
|
|
12
|
-
return loadCls[name];
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
const selectData = await getTemplate('select', name);
|
|
16
|
-
if (!selectData) { return null; }
|
|
17
|
-
|
|
18
|
-
loadCls[name] = selectData;
|
|
19
|
-
return loadCls[name];
|
|
20
|
-
}
|
|
1
|
+
import getTemplate from './getTemplate.js';
|
|
2
|
+
|
|
3
|
+
const loadCls = {};
|
|
4
|
+
|
|
5
|
+
export default async function getTable(name) {
|
|
6
|
+
if (loadCls[name]) return loadCls[name];
|
|
7
|
+
|
|
8
|
+
const clsData = await getTemplate('cls', name);
|
|
9
|
+
|
|
10
|
+
if (clsData) {
|
|
11
|
+
loadCls[name] = { arr: clsData };
|
|
12
|
+
return loadCls[name];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const selectData = await getTemplate('select', name);
|
|
16
|
+
if (!selectData) { return null; }
|
|
17
|
+
|
|
18
|
+
loadCls[name] = selectData;
|
|
19
|
+
return loadCls[name];
|
|
20
|
+
}
|
|
@@ -1,65 +1,65 @@
|
|
|
1
|
-
// import pgClients from '../../../pg/pgClients.js';
|
|
2
|
-
import getPG from '../../../pg/funcs/getPG.js';
|
|
3
|
-
|
|
4
|
-
import getSelect from './getSelect.js';
|
|
5
|
-
/*
|
|
6
|
-
function getTable(table) {
|
|
7
|
-
// eslint-disable-next-line class-methods-use-this
|
|
8
|
-
const result = table.toLowerCase().replace(/[\n\r]+/g, ' ').split(' from ').filter((el) => /^[a-z0-9_]+\.[a-z0-9_]+/.test(el))
|
|
9
|
-
.map((el) => el.split(/[ )]/)[0]);
|
|
10
|
-
return result?.pop();
|
|
11
|
-
} */
|
|
12
|
-
|
|
13
|
-
const selectMeta = {};
|
|
14
|
-
|
|
15
|
-
export default async function getSelectMeta({ name, pg: pg1 }) {
|
|
16
|
-
if (selectMeta[name]) return selectMeta[name];
|
|
17
|
-
const pg = pg1 || getPG({ db: 'client' });
|
|
18
|
-
|
|
19
|
-
const cls = await getSelect(name);
|
|
20
|
-
|
|
21
|
-
if (!cls) return null;
|
|
22
|
-
if (cls.arr) return cls;
|
|
23
|
-
if (!cls.sql) return null;
|
|
24
|
-
|
|
25
|
-
const { sql: original } = cls;
|
|
26
|
-
const sql = `with c(id,text) as (${original} ) select * from c where id is not null `;
|
|
27
|
-
|
|
28
|
-
/*= == meta table === */
|
|
29
|
-
const tableNew = original.toLowerCase().replace(/\n/g, ' ').split(' from ').filter((el) => /^[a-z0-9_]+\.[a-z0-9_]+/.test(el))
|
|
30
|
-
.map((el) => el.split(/[ )]/)[0].replace(/[\r\n]+/g, ''));
|
|
31
|
-
|
|
32
|
-
const dataOrigin = await pg.query(`${sql} limit 0`);
|
|
33
|
-
|
|
34
|
-
const dataOrigin1 = await pg.query(`${original} limit 0`);
|
|
35
|
-
|
|
36
|
-
// const table = getTable(original);
|
|
37
|
-
const count = cls?.count ?? await pg.one(`select count(*) from (${original})q`).then((el) => el.count);
|
|
38
|
-
|
|
39
|
-
// column name
|
|
40
|
-
const cols = dataOrigin.fields.map((el) => el.name);
|
|
41
|
-
const type = dataOrigin.fields.map((el) => pg.pgType[el.dataTypeID]);
|
|
42
|
-
|
|
43
|
-
const searchColumn = cls?.searchColumn || (
|
|
44
|
-
dataOrigin.fields.find((el) => el.name === 'search') ? 'search' : dataOrigin1.fields[1].name);
|
|
45
|
-
|
|
46
|
-
const searchQuery = `(${searchColumn.split(',').map((el) => `"${el}" ilike $1 `).join(' or ')})`;
|
|
47
|
-
|
|
48
|
-
const data = {
|
|
49
|
-
|
|
50
|
-
type: type.join(','),
|
|
51
|
-
cols: cols.join(','),
|
|
52
|
-
originalCols: dataOrigin1.fields.map((el) => el.name).join(','),
|
|
53
|
-
|
|
54
|
-
original,
|
|
55
|
-
sql,
|
|
56
|
-
count,
|
|
57
|
-
searchQuery,
|
|
58
|
-
table: tableNew.join(','),
|
|
59
|
-
time: new Date().toISOString(),
|
|
60
|
-
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
selectMeta[name] = data;
|
|
64
|
-
return data;
|
|
65
|
-
}
|
|
1
|
+
// import pgClients from '../../../pg/pgClients.js';
|
|
2
|
+
import getPG from '../../../pg/funcs/getPG.js';
|
|
3
|
+
|
|
4
|
+
import getSelect from './getSelect.js';
|
|
5
|
+
/*
|
|
6
|
+
function getTable(table) {
|
|
7
|
+
// eslint-disable-next-line class-methods-use-this
|
|
8
|
+
const result = table.toLowerCase().replace(/[\n\r]+/g, ' ').split(' from ').filter((el) => /^[a-z0-9_]+\.[a-z0-9_]+/.test(el))
|
|
9
|
+
.map((el) => el.split(/[ )]/)[0]);
|
|
10
|
+
return result?.pop();
|
|
11
|
+
} */
|
|
12
|
+
|
|
13
|
+
const selectMeta = {};
|
|
14
|
+
|
|
15
|
+
export default async function getSelectMeta({ name, pg: pg1 }) {
|
|
16
|
+
if (selectMeta[name]) return selectMeta[name];
|
|
17
|
+
const pg = pg1 || getPG({ db: 'client' });
|
|
18
|
+
|
|
19
|
+
const cls = await getSelect(name);
|
|
20
|
+
|
|
21
|
+
if (!cls) return null;
|
|
22
|
+
if (cls.arr) return cls;
|
|
23
|
+
if (!cls.sql) return null;
|
|
24
|
+
|
|
25
|
+
const { sql: original } = cls;
|
|
26
|
+
const sql = `with c(id,text) as (${original} ) select * from c where id is not null `;
|
|
27
|
+
|
|
28
|
+
/*= == meta table === */
|
|
29
|
+
const tableNew = original.toLowerCase().replace(/\n/g, ' ').split(' from ').filter((el) => /^[a-z0-9_]+\.[a-z0-9_]+/.test(el))
|
|
30
|
+
.map((el) => el.split(/[ )]/)[0].replace(/[\r\n]+/g, ''));
|
|
31
|
+
|
|
32
|
+
const dataOrigin = await pg.query(`${sql} limit 0`);
|
|
33
|
+
|
|
34
|
+
const dataOrigin1 = await pg.query(`${original} limit 0`);
|
|
35
|
+
|
|
36
|
+
// const table = getTable(original);
|
|
37
|
+
const count = cls?.count ?? await pg.one(`select count(*) from (${original})q`).then((el) => el.count);
|
|
38
|
+
|
|
39
|
+
// column name
|
|
40
|
+
const cols = dataOrigin.fields.map((el) => el.name);
|
|
41
|
+
const type = dataOrigin.fields.map((el) => pg.pgType[el.dataTypeID]);
|
|
42
|
+
|
|
43
|
+
const searchColumn = cls?.searchColumn || (
|
|
44
|
+
dataOrigin.fields.find((el) => el.name === 'search') ? 'search' : dataOrigin1.fields[1].name);
|
|
45
|
+
|
|
46
|
+
const searchQuery = `(${searchColumn.split(',').map((el) => `"${el}" ilike $1 `).join(' or ')})`;
|
|
47
|
+
|
|
48
|
+
const data = {
|
|
49
|
+
|
|
50
|
+
type: type.join(','),
|
|
51
|
+
cols: cols.join(','),
|
|
52
|
+
originalCols: dataOrigin1.fields.map((el) => el.name).join(','),
|
|
53
|
+
|
|
54
|
+
original,
|
|
55
|
+
sql,
|
|
56
|
+
count,
|
|
57
|
+
searchQuery,
|
|
58
|
+
table: tableNew.join(','),
|
|
59
|
+
time: new Date().toISOString(),
|
|
60
|
+
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
selectMeta[name] = data;
|
|
64
|
+
return data;
|
|
65
|
+
}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import { readFile } from 'fs/promises';
|
|
2
|
-
import fs from 'fs';
|
|
3
|
-
import path from 'path';
|
|
4
|
-
import config from '../../../config.js';
|
|
5
|
-
|
|
6
|
-
const loadTemplate = {};
|
|
7
|
-
|
|
8
|
-
export default async function getTemplateDir(type, name) {
|
|
9
|
-
if (!type) return null;
|
|
10
|
-
if (!name) return null;
|
|
11
|
-
|
|
12
|
-
const cwd = process.cwd();
|
|
13
|
-
const typeDir = path.join(cwd, (config.templateDir || 'server/templates'), type);
|
|
14
|
-
|
|
15
|
-
if (!loadTemplate[type]) {
|
|
16
|
-
const typeList = fs.existsSync(typeDir) ? fs.readdirSync(typeDir) : [];
|
|
17
|
-
loadTemplate[type] = typeList;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const sql = loadTemplate[type].includes(`${name}.sql`) ? await readFile(path.join(typeDir, `${name}.sql`), 'utf-8') : null;
|
|
21
|
-
const data = loadTemplate[type].includes(`${name}.json`) ? JSON.parse(await readFile(path.join(typeDir, `${name}.json`), 'utf-8')) : null;
|
|
22
|
-
if (sql) return { ...data || {}, sql };
|
|
23
|
-
return data;
|
|
24
|
-
}
|
|
1
|
+
import { readFile } from 'fs/promises';
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import config from '../../../config.js';
|
|
5
|
+
|
|
6
|
+
const loadTemplate = {};
|
|
7
|
+
|
|
8
|
+
export default async function getTemplateDir(type, name) {
|
|
9
|
+
if (!type) return null;
|
|
10
|
+
if (!name) return null;
|
|
11
|
+
|
|
12
|
+
const cwd = process.cwd();
|
|
13
|
+
const typeDir = path.join(cwd, (config.templateDir || 'server/templates'), type);
|
|
14
|
+
|
|
15
|
+
if (!loadTemplate[type]) {
|
|
16
|
+
const typeList = fs.existsSync(typeDir) ? fs.readdirSync(typeDir) : [];
|
|
17
|
+
loadTemplate[type] = typeList;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const sql = loadTemplate[type].includes(`${name}.sql`) ? await readFile(path.join(typeDir, `${name}.sql`), 'utf-8') : null;
|
|
21
|
+
const data = loadTemplate[type].includes(`${name}.json`) ? JSON.parse(await readFile(path.join(typeDir, `${name}.json`), 'utf-8')) : null;
|
|
22
|
+
if (sql) return { ...data || {}, sql };
|
|
23
|
+
return data;
|
|
24
|
+
}
|
|
@@ -1,75 +1,75 @@
|
|
|
1
|
-
/* const getTable = require('../../controllers/utils/getTable');
|
|
2
|
-
const pg = require('../../../pg/client');
|
|
3
|
-
const config = require('../../../../config'); */
|
|
4
|
-
|
|
5
|
-
import getTemplate from '../../controllers/utils/getTemplate.js';
|
|
6
|
-
import pgClients from '../../../pg/pgClients.js';
|
|
7
|
-
import config from '../../../config.js';
|
|
8
|
-
// filter util
|
|
9
|
-
import getTableSql from './util/getTableSql.js';
|
|
10
|
-
// import getCustomQuery from './util/getCustomQuery.js';
|
|
11
|
-
import getFilterQuery from './util/getFilterQuery.js';
|
|
12
|
-
import getOptimizedQuery from './util/getOptimizedQuery.js';
|
|
13
|
-
|
|
14
|
-
async function getFilterSQL({
|
|
15
|
-
table, filter, pg = pgClients.client, search, filterList, query,
|
|
16
|
-
}) {
|
|
17
|
-
if (!table) return { error: 'param table is required', status: 400 };
|
|
18
|
-
|
|
19
|
-
const body = await getTemplate('table', table);
|
|
20
|
-
|
|
21
|
-
const fieldQuery = config.allTemplates?.table?.[table] ? `${config.allTemplates?.table?.[table]} limit 0`
|
|
22
|
-
: `select * from ${body?.table || table} limit 0`;
|
|
23
|
-
const { fields = [] } = await pg.query(fieldQuery);
|
|
24
|
-
|
|
25
|
-
const { fields: fieldsModel } = pg.pk[body?.table] ? await pg.query(`select * from ${body.table} limit 0`) : {};
|
|
26
|
-
|
|
27
|
-
const autoSearchColumn = fields?.filter((el) => pg.pgType?.[el.dataTypeID] === 'text')?.map((el) => el.name).join(',');
|
|
28
|
-
const searchColumn = body?.search_column || autoSearchColumn;
|
|
29
|
-
const fieldsList = (fieldsModel || fields)?.map((el) => el.name);
|
|
30
|
-
try {
|
|
31
|
-
const tableSQL = await getTableSql({
|
|
32
|
-
pg, body, table, fields,
|
|
33
|
-
});
|
|
34
|
-
const sval = `ilike '%${decodeURIComponent(search).replace(/'/g, "''")}%'`;
|
|
35
|
-
const searchQuery = search && searchColumn
|
|
36
|
-
? ` (${searchColumn.split(',')?.map((name) => {
|
|
37
|
-
const { pk } = tableSQL.find((el) => el.name === name) || {};
|
|
38
|
-
return pk && !fieldsList.includes(name) ? `${pk} in (select ${pk} from (${fieldQuery})q where ${name} ${sval})` : `${name} ${sval}`;
|
|
39
|
-
}).join(' or ')} )` : '';
|
|
40
|
-
|
|
41
|
-
const filters = getFilterQuery({
|
|
42
|
-
filter,
|
|
43
|
-
tableSQL,
|
|
44
|
-
fields,
|
|
45
|
-
filterList: body?.filter_list || filterList,
|
|
46
|
-
pg,
|
|
47
|
-
config,
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
// filter
|
|
51
|
-
const filterQuery = filters?.filter((el) => el.query)?.map((el) => `${el.query} `).join(' and ');
|
|
52
|
-
const q = [body?.query, query, searchQuery, filterQuery].filter((el) => el).join(' and ');
|
|
53
|
-
|
|
54
|
-
// table
|
|
55
|
-
const modelQuery = body?.model || body?.table || table;
|
|
56
|
-
const optimizedSQL = `select * from ${getOptimizedQuery({ body, table, q })} `;
|
|
57
|
-
const tableCount = getOptimizedQuery({ body, table, q }, true);
|
|
58
|
-
// console.log(optimizedSQL);
|
|
59
|
-
return {
|
|
60
|
-
filterList,
|
|
61
|
-
|
|
62
|
-
q,
|
|
63
|
-
optimizedSQL,
|
|
64
|
-
tableCount,
|
|
65
|
-
table: modelQuery,
|
|
66
|
-
// filter parts
|
|
67
|
-
searchQuery,
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
catch (err) {
|
|
71
|
-
throw new Error(err.toString());
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export default getFilterSQL;
|
|
1
|
+
/* const getTable = require('../../controllers/utils/getTable');
|
|
2
|
+
const pg = require('../../../pg/client');
|
|
3
|
+
const config = require('../../../../config'); */
|
|
4
|
+
|
|
5
|
+
import getTemplate from '../../controllers/utils/getTemplate.js';
|
|
6
|
+
import pgClients from '../../../pg/pgClients.js';
|
|
7
|
+
import config from '../../../config.js';
|
|
8
|
+
// filter util
|
|
9
|
+
import getTableSql from './util/getTableSql.js';
|
|
10
|
+
// import getCustomQuery from './util/getCustomQuery.js';
|
|
11
|
+
import getFilterQuery from './util/getFilterQuery.js';
|
|
12
|
+
import getOptimizedQuery from './util/getOptimizedQuery.js';
|
|
13
|
+
|
|
14
|
+
async function getFilterSQL({
|
|
15
|
+
table, filter, pg = pgClients.client, search, filterList, query,
|
|
16
|
+
}) {
|
|
17
|
+
if (!table) return { error: 'param table is required', status: 400 };
|
|
18
|
+
|
|
19
|
+
const body = await getTemplate('table', table);
|
|
20
|
+
|
|
21
|
+
const fieldQuery = config.allTemplates?.table?.[table] ? `${config.allTemplates?.table?.[table]} limit 0`
|
|
22
|
+
: `select * from ${body?.table || table} limit 0`;
|
|
23
|
+
const { fields = [] } = await pg.query(fieldQuery);
|
|
24
|
+
|
|
25
|
+
const { fields: fieldsModel } = pg.pk[body?.table] ? await pg.query(`select * from ${body.table} limit 0`) : {};
|
|
26
|
+
|
|
27
|
+
const autoSearchColumn = fields?.filter((el) => pg.pgType?.[el.dataTypeID] === 'text')?.map((el) => el.name).join(',');
|
|
28
|
+
const searchColumn = body?.search_column || autoSearchColumn;
|
|
29
|
+
const fieldsList = (fieldsModel || fields)?.map((el) => el.name);
|
|
30
|
+
try {
|
|
31
|
+
const tableSQL = await getTableSql({
|
|
32
|
+
pg, body, table, fields,
|
|
33
|
+
});
|
|
34
|
+
const sval = `ilike '%${decodeURIComponent(search).replace(/'/g, "''")}%'`;
|
|
35
|
+
const searchQuery = search && searchColumn
|
|
36
|
+
? ` (${searchColumn.split(',')?.map((name) => {
|
|
37
|
+
const { pk } = tableSQL.find((el) => el.name === name) || {};
|
|
38
|
+
return pk && !fieldsList.includes(name) ? `${pk} in (select ${pk} from (${fieldQuery})q where ${name} ${sval})` : `${name} ${sval}`;
|
|
39
|
+
}).join(' or ')} )` : '';
|
|
40
|
+
|
|
41
|
+
const filters = getFilterQuery({
|
|
42
|
+
filter,
|
|
43
|
+
tableSQL,
|
|
44
|
+
fields,
|
|
45
|
+
filterList: body?.filter_list || filterList,
|
|
46
|
+
pg,
|
|
47
|
+
config,
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// filter
|
|
51
|
+
const filterQuery = filters?.filter((el) => el.query)?.map((el) => `${el.query} `).join(' and ');
|
|
52
|
+
const q = [body?.query, query, searchQuery, filterQuery].filter((el) => el).join(' and ');
|
|
53
|
+
|
|
54
|
+
// table
|
|
55
|
+
const modelQuery = body?.model || body?.table || table;
|
|
56
|
+
const optimizedSQL = `select * from ${getOptimizedQuery({ body, table, q })} `;
|
|
57
|
+
const tableCount = getOptimizedQuery({ body, table, q }, true);
|
|
58
|
+
// console.log(optimizedSQL);
|
|
59
|
+
return {
|
|
60
|
+
filterList,
|
|
61
|
+
|
|
62
|
+
q,
|
|
63
|
+
optimizedSQL,
|
|
64
|
+
tableCount,
|
|
65
|
+
table: modelQuery,
|
|
66
|
+
// filter parts
|
|
67
|
+
searchQuery,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
throw new Error(err.toString());
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export default getFilterSQL;
|