@opengis/fastify-table 1.1.90 → 1.1.91

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 (75) hide show
  1. package/index.js +76 -76
  2. package/package.json +45 -45
  3. package/server/migrations/0.sql +80 -80
  4. package/server/migrations/cls.sql +39 -39
  5. package/server/migrations/properties.sql +144 -144
  6. package/server/migrations/roles.sql +188 -188
  7. package/server/migrations/users.sql +170 -170
  8. package/server/plugins/cron/funcs/addCron.js +130 -130
  9. package/server/plugins/cron/index.js +6 -6
  10. package/server/plugins/crud/funcs/dataDelete.js +21 -21
  11. package/server/plugins/crud/funcs/dataInsert.js +38 -38
  12. package/server/plugins/crud/funcs/dataUpdate.js +64 -64
  13. package/server/plugins/crud/funcs/getAccess.js +48 -48
  14. package/server/plugins/crud/funcs/getOpt.js +13 -13
  15. package/server/plugins/crud/funcs/setOpt.js +21 -21
  16. package/server/plugins/crud/funcs/setToken.js +44 -44
  17. package/server/plugins/crud/funcs/utils/getFolder.js +10 -10
  18. package/server/plugins/crud/funcs/utils/logChanges.js +62 -62
  19. package/server/plugins/crud/index.js +23 -23
  20. package/server/plugins/hook/index.js +8 -8
  21. package/server/plugins/logger/errorStatus.js +19 -19
  22. package/server/plugins/logger/index.js +21 -21
  23. package/server/plugins/migration/funcs/exec.migrations.js +86 -86
  24. package/server/plugins/migration/index.js +7 -7
  25. package/server/plugins/pg/funcs/getMeta.js +29 -29
  26. package/server/plugins/pg/funcs/getPG.js +33 -33
  27. package/server/plugins/pg/pgClients.js +21 -21
  28. package/server/plugins/policy/funcs/checkPolicy.js +92 -92
  29. package/server/plugins/policy/index.js +12 -12
  30. package/server/plugins/policy/sqlInjection.js +33 -33
  31. package/server/plugins/redis/client.js +8 -8
  32. package/server/plugins/redis/funcs/redisClients.js +3 -3
  33. package/server/plugins/redis/index.js +17 -17
  34. package/server/plugins/table/funcs/addTemplateDir.js +8 -8
  35. package/server/plugins/table/funcs/getFilterSQL/index.js +96 -96
  36. package/server/plugins/table/funcs/getFilterSQL/util/formatValue.js +170 -170
  37. package/server/plugins/table/funcs/getFilterSQL/util/getCustomQuery.js +13 -13
  38. package/server/plugins/table/funcs/getFilterSQL/util/getFilterQuery.js +66 -66
  39. package/server/plugins/table/funcs/getFilterSQL/util/getOptimizedQuery.js +12 -12
  40. package/server/plugins/table/funcs/getFilterSQL/util/getTableSql.js +34 -34
  41. package/server/plugins/table/funcs/getSelect.js +19 -19
  42. package/server/plugins/table/funcs/getSelectMeta.js +67 -67
  43. package/server/plugins/table/funcs/getTemplates.js +19 -19
  44. package/server/plugins/table/funcs/gisIRColumn.js +72 -72
  45. package/server/plugins/table/funcs/loadTemplate.js +1 -1
  46. package/server/plugins/table/funcs/loadTemplatePath.js +1 -1
  47. package/server/plugins/table/funcs/metaFormat/getSelectVal.js +38 -38
  48. package/server/plugins/table/funcs/metaFormat/index.js +31 -31
  49. package/server/plugins/table/funcs/userTemplateDir.js +1 -1
  50. package/server/plugins/table/index.js +13 -13
  51. package/server/plugins/util/funcs/eventStream.js +28 -28
  52. package/server/plugins/util/index.js +7 -7
  53. package/server/routes/cron/index.js +14 -14
  54. package/server/routes/crud/controllers/deleteCrud.js +36 -36
  55. package/server/routes/crud/controllers/insert.js +80 -80
  56. package/server/routes/crud/controllers/table.js +91 -91
  57. package/server/routes/crud/controllers/update.js +82 -82
  58. package/server/routes/crud/index.js +21 -21
  59. package/server/routes/logger/controllers/logger.file.js +92 -92
  60. package/server/routes/logger/controllers/utils/checkUserAccess.js +19 -19
  61. package/server/routes/logger/controllers/utils/getRootDir.js +26 -26
  62. package/server/routes/logger/index.js +17 -17
  63. package/server/routes/properties/controllers/properties.add.js +55 -55
  64. package/server/routes/properties/controllers/properties.get.js +17 -17
  65. package/server/routes/properties/index.js +16 -16
  66. package/server/routes/table/controllers/data.js +144 -144
  67. package/server/routes/table/controllers/filter.js +60 -60
  68. package/server/routes/table/controllers/form.js +42 -42
  69. package/server/routes/table/controllers/search.js +74 -74
  70. package/server/routes/table/controllers/suggest.js +88 -88
  71. package/server/routes/table/index.js +28 -28
  72. package/server/routes/table/schema.js +64 -64
  73. package/server/routes/util/controllers/status.monitor.js +8 -8
  74. package/server/routes/util/index.js +11 -11
  75. package/utils.js +122 -122
@@ -1,62 +1,62 @@
1
- import getMeta from '../../../pg/funcs/getMeta.js';
2
-
3
- export default async function logChanges({
4
- pg, table, id, data, uid = 1, type,
5
- }) {
6
- if (!id) {
7
- console.error('param id is required');
8
- return null;
9
- }
10
- if (!table || !pg.pk?.[table]) {
11
- console.error('table not found');
12
- return null;
13
- }
14
- if (!pg.pk?.['log.table_changes'] || !pg.pk?.['log.table_changes_data']) {
15
- console.error('log table not found');
16
- return null;
17
- }
18
- if (!type) {
19
- console.error('invalid type');
20
- return null;
21
- }
22
-
23
- try {
24
- const { change_id: changeId } = await pg.query(`insert into log.table_changes(change_date,change_type,change_user_id,entity_type,entity_id)
25
- values(CURRENT_DATE, $1, $2, $3, $4) returning change_id`, [type, uid, table, id]).then((res) => res.rows?.[0] || {});
26
-
27
- const { fields = [] } = await pg.query(`select * from ${table} limit 0`);
28
- const columnList = fields.map((el) => el?.name);
29
- const q = `select ${Object.keys(data || {}).filter((el) => columnList.includes(el)).join(',') || '*'} from ${table} where ${pg.pk?.[table]}=$1`;
30
- // console.log(q, type, id);
31
-
32
- const old = type !== 'INSERT' ? await pg.query(q, [id]).then((res) => res.rows?.[0] || {}) : {};
33
-
34
- const { columns = [] } = await getMeta({ table: 'log.table_changes_data' });
35
- const names = columns.map((el) => el.name);
36
-
37
- const res = await Promise.all(Object.keys(data || {}).map(async (el) => {
38
- const filterData = Object.entries({
39
- change_id: changeId, entity_key: el, value_old: old[el], value_new: data[el], uid,
40
- })
41
- .filter((el1) => el1[1] && names.includes(el1[0]));
42
-
43
- const insertQuery = `insert into log.table_changes_data (${filterData?.map((key) => `"${key[0]}"`).join(',')})
44
- values (${filterData?.map((key, i) => `$${i + 1}`).join(',')}) returning *`;
45
-
46
- const { rows = [] } = await pg.query(insertQuery, [...filterData.map((el1) => (el1[1] && typeof el1[1] === 'object' && (!Array.isArray(el1[1]) || typeof el1[1]?.[0] === 'object') ? JSON.stringify(el1[1]) : el1[1]))]) || {};
47
- return rows[0];
48
- }));
49
-
50
- const newData = type === 'DELETE' ? {} : (Array.isArray(res) ? res : [res]).reduce((acc, curr) => Object.assign(acc, { [curr.entity_key]: curr.value_new }), {});
51
- // console.log('logChanges OK', type);
52
- return {
53
- change_id: changeId, entity_type: table, entity_id: id, uid, change_type: type, old, new: newData,
54
- };
55
- }
56
- catch (err) {
57
- console.error('logChanges error', type, table, id, data, err.toString());
58
- return {
59
- error: err.toString(), entity_type: table, entity_id: id, uid, change_type: type,
60
- };
61
- }
62
- }
1
+ import getMeta from '../../../pg/funcs/getMeta.js';
2
+
3
+ export default async function logChanges({
4
+ pg, table, id, data, uid = 1, type,
5
+ }) {
6
+ if (!id) {
7
+ console.error('param id is required');
8
+ return null;
9
+ }
10
+ if (!table || !pg.pk?.[table]) {
11
+ console.error('table not found');
12
+ return null;
13
+ }
14
+ if (!pg.pk?.['log.table_changes'] || !pg.pk?.['log.table_changes_data']) {
15
+ console.error('log table not found');
16
+ return null;
17
+ }
18
+ if (!type) {
19
+ console.error('invalid type');
20
+ return null;
21
+ }
22
+
23
+ try {
24
+ const { change_id: changeId } = await pg.query(`insert into log.table_changes(change_date,change_type,change_user_id,entity_type,entity_id)
25
+ values(CURRENT_DATE, $1, $2, $3, $4) returning change_id`, [type, uid, table, id]).then((res) => res.rows?.[0] || {});
26
+
27
+ const { fields = [] } = await pg.query(`select * from ${table} limit 0`);
28
+ const columnList = fields.map((el) => el?.name);
29
+ const q = `select ${Object.keys(data || {}).filter((el) => columnList.includes(el)).join(',') || '*'} from ${table} where ${pg.pk?.[table]}=$1`;
30
+ // console.log(q, type, id);
31
+
32
+ const old = type !== 'INSERT' ? await pg.query(q, [id]).then((res) => res.rows?.[0] || {}) : {};
33
+
34
+ const { columns = [] } = await getMeta({ table: 'log.table_changes_data' });
35
+ const names = columns.map((el) => el.name);
36
+
37
+ const res = await Promise.all(Object.keys(data || {}).map(async (el) => {
38
+ const filterData = Object.entries({
39
+ change_id: changeId, entity_key: el, value_old: old[el], value_new: data[el], uid,
40
+ })
41
+ .filter((el1) => el1[1] && names.includes(el1[0]));
42
+
43
+ const insertQuery = `insert into log.table_changes_data (${filterData?.map((key) => `"${key[0]}"`).join(',')})
44
+ values (${filterData?.map((key, i) => `$${i + 1}`).join(',')}) returning *`;
45
+
46
+ const { rows = [] } = await pg.query(insertQuery, [...filterData.map((el1) => (el1[1] && typeof el1[1] === 'object' && (!Array.isArray(el1[1]) || typeof el1[1]?.[0] === 'object') ? JSON.stringify(el1[1]) : el1[1]))]) || {};
47
+ return rows[0];
48
+ }));
49
+
50
+ const newData = type === 'DELETE' ? {} : (Array.isArray(res) ? res : [res]).reduce((acc, curr) => Object.assign(acc, { [curr.entity_key]: curr.value_new }), {});
51
+ // console.log('logChanges OK', type);
52
+ return {
53
+ change_id: changeId, entity_type: table, entity_id: id, uid, change_type: type, old, new: newData,
54
+ };
55
+ }
56
+ catch (err) {
57
+ console.error('logChanges error', type, table, id, data, err.toString());
58
+ return {
59
+ error: err.toString(), entity_type: table, entity_id: id, uid, change_type: type,
60
+ };
61
+ }
62
+ }
@@ -1,23 +1,23 @@
1
- // import getOpt from './funcs/getOpt.js';
2
- // import setOpt from './funcs/setOpt.js';
3
-
4
- // import isFileExists from './funcs/isFileExists.js';
5
-
6
- // import dataUpdate from './funcs/dataUpdate.js';
7
- // import dataInsert from './funcs/dataInsert.js';
8
-
9
- // import getAccessFunc from './funcs/getAccess.js';
10
-
11
- async function plugin(fastify) {
12
- // fastify.decorate('setOpt', setOpt);
13
- // fastify.decorate('getOpt', getOpt);
14
-
15
- // fastify.decorate('dataUpdate', dataUpdate);
16
- // fastify.decorate('dataInsert', dataInsert);
17
-
18
- // fastify.decorate('getAccess', getAccessFunc);
19
-
20
- // fastify.decorate('isFileExists', isFileExists);
21
- }
22
-
23
- export default plugin;
1
+ // import getOpt from './funcs/getOpt.js';
2
+ // import setOpt from './funcs/setOpt.js';
3
+
4
+ // import isFileExists from './funcs/isFileExists.js';
5
+
6
+ // import dataUpdate from './funcs/dataUpdate.js';
7
+ // import dataInsert from './funcs/dataInsert.js';
8
+
9
+ // import getAccessFunc from './funcs/getAccess.js';
10
+
11
+ async function plugin(fastify) {
12
+ // fastify.decorate('setOpt', setOpt);
13
+ // fastify.decorate('getOpt', getOpt);
14
+
15
+ // fastify.decorate('dataUpdate', dataUpdate);
16
+ // fastify.decorate('dataInsert', dataInsert);
17
+
18
+ // fastify.decorate('getAccess', getAccessFunc);
19
+
20
+ // fastify.decorate('isFileExists', isFileExists);
21
+ }
22
+
23
+ export default plugin;
@@ -1,8 +1,8 @@
1
- import addHook from './funcs/addHook.js';
2
- import applyHook from './funcs/applyHook.js';
3
-
4
- async function plugin(fastify) {
5
- // fastify.decorate('addHook', addHook);
6
- // fastify.decorate('applyHook', applyHook);
7
- }
8
- export default plugin;
1
+ import addHook from './funcs/addHook.js';
2
+ import applyHook from './funcs/applyHook.js';
3
+
4
+ async function plugin(fastify) {
5
+ // fastify.decorate('addHook', addHook);
6
+ // fastify.decorate('applyHook', applyHook);
7
+ }
8
+ export default plugin;
@@ -1,19 +1,19 @@
1
- import applyHookSync from '../hook/funcs/applyHookSync.js';
2
-
3
- function errorStatus(error) {
4
- const hook = applyHookSync('errorStatus', error);
5
- if (hook) return hook;
6
-
7
- if (error.routine === 'exec_stmt_raise' && error.file === 'pl_exec.c') {
8
- return 601;
9
- }
10
- if (error.routine === 'ExecConstraints') {
11
- return 602;
12
- }
13
- if (error.type === 'DatabaseError') {
14
- return 600;
15
- }
16
-
17
- return 500;
18
- }
19
- export default errorStatus;
1
+ import applyHookSync from '../hook/funcs/applyHookSync.js';
2
+
3
+ function errorStatus(error) {
4
+ const hook = applyHookSync('errorStatus', error);
5
+ if (hook) return hook;
6
+
7
+ if (error.routine === 'exec_stmt_raise' && error.file === 'pl_exec.c') {
8
+ return 601;
9
+ }
10
+ if (error.routine === 'ExecConstraints') {
11
+ return 602;
12
+ }
13
+ if (error.type === 'DatabaseError') {
14
+ return 600;
15
+ }
16
+
17
+ return 500;
18
+ }
19
+ export default errorStatus;
@@ -1,21 +1,21 @@
1
- import errorMessage from './errorMessage.js';
2
-
3
- async function plugin(fastify) {
4
- fastify.setErrorHandler(async (error, request, reply) => {
5
- // validation not error
6
- if (error.validation) {
7
- request.log.warn(request, { code: error?.code, status: 422, error: error.toString() });
8
- return reply.status(422).send(error.toString());
9
- }
10
-
11
- // logger
12
- request.log.error(error, request);
13
- console.error({ msg: error.message, where: error.where, stack: error.stack });
14
-
15
- // errorMessage
16
- const msg = errorMessage(error);
17
-
18
- return reply.status(error.statusCode || 500).send(msg);
19
- });
20
- }
21
- export default plugin;
1
+ import errorMessage from './errorMessage.js';
2
+
3
+ async function plugin(fastify) {
4
+ fastify.setErrorHandler(async (error, request, reply) => {
5
+ // validation not error
6
+ if (error.validation) {
7
+ request.log.warn(request, { code: error?.code, status: 422, error: error.toString() });
8
+ return reply.status(422).send(error.toString());
9
+ }
10
+
11
+ // logger
12
+ request.log.error(error, request);
13
+ console.error({ msg: error.message, where: error.where, stack: error.stack });
14
+
15
+ // errorMessage
16
+ const msg = errorMessage(error);
17
+
18
+ return reply.status(error.statusCode || 500).send(msg);
19
+ });
20
+ }
21
+ export default plugin;
@@ -1,86 +1,86 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
-
4
- const time = Date.now();
5
-
6
- import getPG from '../../pg/funcs/getPG.js';
7
-
8
- function getCallerDir() {
9
- const originalFunc = Error.prepareStackTrace;
10
-
11
- let callerfile;
12
- try {
13
- const err = new Error();
14
- // let currentfile;
15
-
16
- Error.prepareStackTrace = function (err, stack) { return stack; };
17
-
18
- const currentfile = err.stack.shift().getFileName();
19
-
20
- while (err.stack.length) {
21
- callerfile = err.stack.shift().getFileName();
22
-
23
- if (currentfile !== callerfile) break;
24
- }
25
- }
26
- catch (err) { }
27
-
28
- Error.prepareStackTrace = originalFunc;
29
-
30
- return path.dirname(callerfile);
31
- }
32
-
33
- function sequence(files, data, fn) {
34
- return files.reduce((promise, filename) => promise.then(() => fn({
35
- ...data, filename,
36
- })), Promise.resolve());
37
- }
38
-
39
- async function execSql({
40
- pg, dir, filename,
41
- }) {
42
- const start = Date.now();
43
- const filepath = path.join(dir, filename);
44
- const sql = fs.readFileSync(filepath, 'utf-8');
45
- try {
46
- console.log(filename, 'start', Date.now() - start);
47
- await pg.query(sql);
48
- console.log(filename, 'finish', Date.now() - start);
49
- }
50
- catch (err) {
51
- console.log(filepath, 'error', err.toString(), Date.now() - start);
52
- }
53
- }
54
-
55
- export default async function execMigrations(opt) {
56
- try {
57
- const pg = opt?.pg || getPG({ name: 'client' });
58
- const rootDir = getCallerDir();
59
- const subdir = () => {
60
- if (rootDir.endsWith('plugins')) {
61
- return '../..';
62
- } if (path.basename(rootDir) === 'server') {
63
- return '..';
64
- }
65
- };
66
- const dir = path.join(rootDir.replace(/\\/g, '/').replace(/^file:\/\/\//, ''), subdir() || '', 'server/migrations');
67
-
68
- console.log('migrations start', dir, Date.now() - time);
69
- const exists = fs.existsSync(dir);
70
- if (exists) {
71
- // get directory sql file list
72
- const content = fs.readdirSync(dir, { withFileTypes: true })
73
- ?.filter((el) => el.isFile() && path.extname(el.name) === '.sql')
74
- ?.map((el) => el.name) || [];
75
-
76
- // execute sql files
77
- if (content?.length) {
78
- await sequence(content, { pg, dir }, execSql);
79
- }
80
- }
81
- console.log('migrations finish', dir, exists, Date.now() - time);
82
- }
83
- catch (err) {
84
- console.error('migrations error', err.toString(), Date.now() - time);
85
- }
86
- }
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+
4
+ const time = Date.now();
5
+
6
+ import getPG from '../../pg/funcs/getPG.js';
7
+
8
+ function getCallerDir() {
9
+ const originalFunc = Error.prepareStackTrace;
10
+
11
+ let callerfile;
12
+ try {
13
+ const err = new Error();
14
+ // let currentfile;
15
+
16
+ Error.prepareStackTrace = function (err, stack) { return stack; };
17
+
18
+ const currentfile = err.stack.shift().getFileName();
19
+
20
+ while (err.stack.length) {
21
+ callerfile = err.stack.shift().getFileName();
22
+
23
+ if (currentfile !== callerfile) break;
24
+ }
25
+ }
26
+ catch (err) { }
27
+
28
+ Error.prepareStackTrace = originalFunc;
29
+
30
+ return path.dirname(callerfile);
31
+ }
32
+
33
+ function sequence(files, data, fn) {
34
+ return files.reduce((promise, filename) => promise.then(() => fn({
35
+ ...data, filename,
36
+ })), Promise.resolve());
37
+ }
38
+
39
+ async function execSql({
40
+ pg, dir, filename,
41
+ }) {
42
+ const start = Date.now();
43
+ const filepath = path.join(dir, filename);
44
+ const sql = fs.readFileSync(filepath, 'utf-8');
45
+ try {
46
+ console.log(filename, 'start', Date.now() - start);
47
+ await pg.query(sql);
48
+ console.log(filename, 'finish', Date.now() - start);
49
+ }
50
+ catch (err) {
51
+ console.log(filepath, 'error', err.toString(), Date.now() - start);
52
+ }
53
+ }
54
+
55
+ export default async function execMigrations(opt) {
56
+ try {
57
+ const pg = opt?.pg || getPG({ name: 'client' });
58
+ const rootDir = getCallerDir();
59
+ const subdir = () => {
60
+ if (rootDir.endsWith('plugins')) {
61
+ return '../..';
62
+ } if (path.basename(rootDir) === 'server') {
63
+ return '..';
64
+ }
65
+ };
66
+ const dir = path.join(rootDir.replace(/\\/g, '/').replace(/^file:\/\/\//, ''), subdir() || '', 'server/migrations');
67
+
68
+ console.log('migrations start', dir, Date.now() - time);
69
+ const exists = fs.existsSync(dir);
70
+ if (exists) {
71
+ // get directory sql file list
72
+ const content = fs.readdirSync(dir, { withFileTypes: true })
73
+ ?.filter((el) => el.isFile() && path.extname(el.name) === '.sql')
74
+ ?.map((el) => el.name) || [];
75
+
76
+ // execute sql files
77
+ if (content?.length) {
78
+ await sequence(content, { pg, dir }, execSql);
79
+ }
80
+ }
81
+ console.log('migrations finish', dir, exists, Date.now() - time);
82
+ }
83
+ catch (err) {
84
+ console.error('migrations error', err.toString(), Date.now() - time);
85
+ }
86
+ }
@@ -1,7 +1,7 @@
1
- import execMigrations from './funcs/exec.migrations.js';
2
-
3
- async function plugin(fastify) {
4
- // fastify.decorate('execMigrations', execMigrations);
5
- }
6
-
7
- export default plugin;
1
+ import execMigrations from './funcs/exec.migrations.js';
2
+
3
+ async function plugin(fastify) {
4
+ // fastify.decorate('execMigrations', execMigrations);
5
+ }
6
+
7
+ export default plugin;
@@ -1,29 +1,29 @@
1
- import getPG from './getPG.js';
2
-
3
- const data = {};
4
-
5
- // decorator
6
- export default async function getMeta(opt) {
7
- const pg = opt?.pg || getPG({ name: 'client' });
8
- const table = opt?.table || opt;
9
-
10
- if (data[table]) return data[table];
11
-
12
- if (!pg.tlist?.includes(table)) {
13
- return { error: `${table} - not found`, status: 400 };
14
- }
15
-
16
- const { fields } = await pg.query(`select * from ${table} where $1=$1 limit 0`, [1]);
17
- const { pks1 } = await pg.query(`SELECT json_object_agg(c.conrelid::regclass, a.attname) as pks1 FROM pg_constraint c
18
- left join pg_attribute a on c.conrelid=a.attrelid and a.attnum = c.conkey[1] WHERE c.contype='p'::"char" and c.conrelid::regclass = $1::regclass`, [table]).then(el => el.rows[0]) || {};
19
-
20
- const pk = table.startsWith('public.') ? pks1[table.replace('public.', '')] : pks1[table];
21
-
22
- const geomAttr = fields.find((el) => pg.pgType[el.dataTypeID] === 'geometry')?.name; // change geometry text to geometry code
23
-
24
- const res = {
25
- pk, columns: fields, geom: geomAttr, view: pg.relkinds?.[table] === 'v',
26
- };
27
- data[table] = res;
28
- return res;
29
- }
1
+ import getPG from './getPG.js';
2
+
3
+ const data = {};
4
+
5
+ // decorator
6
+ export default async function getMeta(opt) {
7
+ const pg = opt?.pg || getPG({ name: 'client' });
8
+ const table = opt?.table || opt;
9
+
10
+ if (data[table]) return data[table];
11
+
12
+ if (!pg.tlist?.includes(table)) {
13
+ return { error: `${table} - not found`, status: 400 };
14
+ }
15
+
16
+ const { fields } = await pg.query(`select * from ${table} where $1=$1 limit 0`, [1]);
17
+ const { pks1 } = await pg.query(`SELECT json_object_agg(c.conrelid::regclass, a.attname) as pks1 FROM pg_constraint c
18
+ left join pg_attribute a on c.conrelid=a.attrelid and a.attnum = c.conkey[1] WHERE c.contype='p'::"char" and c.conrelid::regclass = $1::regclass`, [table]).then(el => el.rows[0]) || {};
19
+
20
+ const pk = table.startsWith('public.') ? pks1[table.replace('public.', '')] : pks1[table];
21
+
22
+ const geomAttr = fields.find((el) => pg.pgType[el.dataTypeID] === 'geometry')?.name; // change geometry text to geometry code
23
+
24
+ const res = {
25
+ pk, columns: fields, geom: geomAttr, view: pg.relkinds?.[table] === 'v',
26
+ };
27
+ data[table] = res;
28
+ return res;
29
+ }
@@ -1,33 +1,33 @@
1
- import pg from 'pg';
2
-
3
- const { types } = pg;
4
- types.setTypeParser(1082, (stringValue) => stringValue);
5
-
6
- import config from '../../../../config.js';
7
- import pgClients from '../pgClients.js';
8
- import init from './init.js';
9
-
10
- function getPG(param) {
11
- const {
12
- user, password, host, port, db, database, name: origin,
13
- } = param || {};
14
- const name = origin || db || database || param || 'client';
15
- if (pgClients[name]) return pgClients[name];
16
-
17
- const dbConfig = {
18
- user: user || config.pg?.user,
19
- password: password || config.pg?.password,
20
- host: host || config.pg?.host,
21
- port: port || config.pg?.port,
22
- database: db || database || config.pg?.db || config.pg?.database,
23
- };
24
-
25
- pgClients[name] = new pg.Pool(dbConfig);
26
- pgClients[name].init = async () => {
27
- await init(pgClients[name]);
28
- };
29
- init(pgClients[name]);
30
- return pgClients[name];
31
- }
32
-
33
- export default getPG;
1
+ import pg from 'pg';
2
+
3
+ const { types } = pg;
4
+ types.setTypeParser(1082, (stringValue) => stringValue);
5
+
6
+ import config from '../../../../config.js';
7
+ import pgClients from '../pgClients.js';
8
+ import init from './init.js';
9
+
10
+ function getPG(param) {
11
+ const {
12
+ user, password, host, port, db, database, name: origin,
13
+ } = param || {};
14
+ const name = origin || db || database || param || 'client';
15
+ if (pgClients[name]) return pgClients[name];
16
+
17
+ const dbConfig = {
18
+ user: user || config.pg?.user,
19
+ password: password || config.pg?.password,
20
+ host: host || config.pg?.host,
21
+ port: port || config.pg?.port,
22
+ database: db || database || config.pg?.db || config.pg?.database,
23
+ };
24
+
25
+ pgClients[name] = new pg.Pool(dbConfig);
26
+ pgClients[name].init = async () => {
27
+ await init(pgClients[name]);
28
+ };
29
+ init(pgClients[name]);
30
+ return pgClients[name];
31
+ }
32
+
33
+ export default getPG;
@@ -1,21 +1,21 @@
1
- import pg from 'pg';
2
-
3
- import config from '../../../config.js';
4
- import init from './funcs/init.js';
5
-
6
- const pgClients = {};
7
- if (config.pg) {
8
- const client = new pg.Pool({
9
- host: config.pg?.host || '127.0.0.1',
10
- port: config.pg?.port || 5432,
11
- database: config.pg?.database || 'postgres',
12
- user: config.pg?.user || 'postgres',
13
- password: config.pg?.password || 'postgres',
14
- });
15
- client.init = async () => {
16
- await init(client);
17
- };
18
- client.init();
19
- pgClients.client = client;
20
- }
21
- export default pgClients;
1
+ import pg from 'pg';
2
+
3
+ import config from '../../../config.js';
4
+ import init from './funcs/init.js';
5
+
6
+ const pgClients = {};
7
+ if (config.pg) {
8
+ const client = new pg.Pool({
9
+ host: config.pg?.host || '127.0.0.1',
10
+ port: config.pg?.port || 5432,
11
+ database: config.pg?.database || 'postgres',
12
+ user: config.pg?.user || 'postgres',
13
+ password: config.pg?.password || 'postgres',
14
+ });
15
+ client.init = async () => {
16
+ await init(client);
17
+ };
18
+ client.init();
19
+ pgClients.client = client;
20
+ }
21
+ export default pgClients;