@opengis/fastify-table 2.0.78 → 2.0.80

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 (32) hide show
  1. package/dist/server/plugins/crud/funcs/dataDelete.js +1 -1
  2. package/dist/server/plugins/crud/funcs/dataUpsert.d.ts +13 -0
  3. package/dist/server/plugins/crud/funcs/dataUpsert.d.ts.map +1 -0
  4. package/dist/server/plugins/crud/funcs/dataUpsert.js +148 -0
  5. package/dist/server/plugins/crud/funcs/utils/getInsertQuery.d.ts +2 -0
  6. package/dist/server/plugins/crud/funcs/utils/getInsertQuery.d.ts.map +1 -1
  7. package/dist/server/plugins/crud/funcs/utils/getInsertQuery.js +2 -1
  8. package/dist/server/plugins/file/uploadMultiPart.d.ts +1 -1
  9. package/dist/server/plugins/file/uploadMultiPart.d.ts.map +1 -1
  10. package/dist/server/plugins/file/uploadMultiPart.js +9 -2
  11. package/dist/server/plugins/pg/funcs/getMeta.js +2 -2
  12. package/dist/server/plugins/pg/funcs/getPG.d.ts.map +1 -1
  13. package/dist/server/plugins/pg/funcs/getPG.js +2 -1
  14. package/dist/server/plugins/pg/funcs/getPGAsync.d.ts.map +1 -1
  15. package/dist/server/plugins/pg/funcs/getPGAsync.js +2 -1
  16. package/dist/server/plugins/pg/funcs/init.d.ts.map +1 -1
  17. package/dist/server/plugins/pg/funcs/init.js +12 -3
  18. package/dist/server/plugins/policy/funcs/checkPolicy.d.ts.map +1 -1
  19. package/dist/server/plugins/policy/funcs/checkPolicy.js +3 -1
  20. package/dist/server/plugins/policy/funcs/checkSQL.d.ts +8 -0
  21. package/dist/server/plugins/policy/funcs/checkSQL.d.ts.map +1 -0
  22. package/dist/server/plugins/policy/funcs/checkSQL.js +19 -0
  23. package/dist/server/routes/crud/controllers/insert.d.ts.map +1 -1
  24. package/dist/server/routes/crud/controllers/insert.js +14 -2
  25. package/dist/server/routes/crud/controllers/update.d.ts.map +1 -1
  26. package/dist/server/routes/crud/controllers/update.js +14 -2
  27. package/dist/server/routes/table/controllers/getFormByTable.d.ts.map +1 -1
  28. package/dist/server/routes/table/controllers/getFormByTable.js +10 -5
  29. package/dist/utils.d.ts +2 -0
  30. package/dist/utils.d.ts.map +1 -1
  31. package/dist/utils.js +2 -0
  32. package/package.json +1 -1
@@ -17,7 +17,7 @@ export default async function dataDelete({ table: table1, tokenData, referer, id
17
17
  pg.relkinds = pgClients.client?.relkinds;
18
18
  pg.pk = pgClients.client?.pk;
19
19
  }
20
- const table = pg.pk[table1] ? table1 : table1.replace(/"/g, "");
20
+ const table = pg.pk?.[table1] ? table1 : table1.replace(/"/g, "");
21
21
  if (!table)
22
22
  return "table not exist";
23
23
  const { pk } = await getMeta({ pg, table });
@@ -0,0 +1,13 @@
1
+ import type { ExtendedPG } from "../../../types/core.js";
2
+ export default function dataUpsert({ id, table: table1, referer, data, pg: pg1, uid, tokenData, update, constraint, }: {
3
+ id?: string | number;
4
+ table: string;
5
+ referer?: string;
6
+ data: Record<string, any>;
7
+ pg?: ExtendedPG;
8
+ uid?: string;
9
+ tokenData?: Record<string, any>;
10
+ update?: boolean | string;
11
+ constraint?: string;
12
+ }): Promise<any>;
13
+ //# sourceMappingURL=dataUpsert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataUpsert.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/crud/funcs/dataUpsert.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAezD,wBAA8B,UAAU,CAAC,EACvC,EAAE,EACF,KAAK,EAAE,MAAM,EACb,OAAO,EACP,IAAI,EACJ,EAAE,EAAE,GAAG,EACP,GAAG,EACH,SAAc,EACd,MAAa,EACb,UAAU,GACX,EAAE;IACD,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,EAAE,CAAC,EAAE,UAAU,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,gBA+KA"}
@@ -0,0 +1,148 @@
1
+ import getPG from "../../pg/funcs/getPG.js";
2
+ import getRedis from "../../redis/funcs/getRedis.js";
3
+ import pgClients from "../../pg/pgClients.js";
4
+ import getTemplate from "../../table/funcs/getTemplate.js";
5
+ import config from "../../../../config.js";
6
+ import logChanges from "./utils/logChanges.js";
7
+ import getInsertQuery from "./utils/getInsertQuery.js";
8
+ import logger from "../../logger/getLogger.js";
9
+ import extraData from "../../extra/extraData.js";
10
+ const rclient = getRedis();
11
+ export default async function dataUpsert({ id, table: table1, referer, data, pg: pg1, uid, tokenData = {}, update = true, constraint, }) {
12
+ const pg = pg1 || getPG({ name: "client" });
13
+ if (!pg)
14
+ return null;
15
+ // pg client single transaction support
16
+ if (!pg?.pk && config.pg) {
17
+ pg.options = pgClients.client?.options;
18
+ pg.tlist = pgClients.client?.tlist;
19
+ pg.pgType = pgClients.client?.pgType;
20
+ pg.relkinds = pgClients.client?.relkinds;
21
+ pg.pk = pgClients.client?.pk;
22
+ }
23
+ if (config.trace)
24
+ console.log("form", tokenData?.form);
25
+ const table = pg.pk?.[table1] ? table1 : table1.replace(/"/g, "");
26
+ const { insertQuery, args = [], keys = [], systemColumns = [], } = (await getInsertQuery({
27
+ pg,
28
+ table,
29
+ data,
30
+ id,
31
+ uid,
32
+ })) || {};
33
+ const updatedAtColumn = systemColumns
34
+ .map((el) => el[0])
35
+ .find((colname) => ["editor_date", "updated_at"].includes(colname));
36
+ const upsert = () => {
37
+ if (!update || !keys.length) {
38
+ const p1 = `on conflict(${constraint || pg.pk?.[table]}) do `;
39
+ const p2 = updatedAtColumn
40
+ ? `update set ${updatedAtColumn}=now()`
41
+ : "nothing";
42
+ return p1 + p2 + "returning *";
43
+ }
44
+ return `on conflict(${constraint || pg.pk?.[table]}) do update set ${typeof update === "string"
45
+ ? update
46
+ : keys.map((colname) => `${colname} = EXCLUDED."${colname}"`).join(", ")} ${keys.includes(updatedAtColumn) || !updatedAtColumn
47
+ ? ""
48
+ : `,${updatedAtColumn}=now()`} returning *`;
49
+ };
50
+ if (!insertQuery || !args.length)
51
+ return null;
52
+ const q = [insertQuery.replace("returning *", ""), upsert()]
53
+ .filter(Boolean)
54
+ .join(" ");
55
+ // for transactions
56
+ const isClient = typeof pg.query === "function" && typeof pg.release === "function";
57
+ const client = (isClient ? pg : await pg.connect());
58
+ if (isClient || !client.pk) {
59
+ client.options = pg.options;
60
+ client.tlist = pg.tlist;
61
+ client.pgType = pg.pgType;
62
+ client.relkinds = pg.relkinds;
63
+ client.pk = pg.pk;
64
+ }
65
+ try {
66
+ if (!isClient) {
67
+ await client.query("begin;");
68
+ }
69
+ const row = await client.query(q, args).then((el) => el.rows?.[0]);
70
+ const id1 = row?.[pg.pk?.[table] || ""];
71
+ if (!id1)
72
+ return null;
73
+ await extraData({
74
+ table,
75
+ form: tokenData?.form,
76
+ id: id1,
77
+ data,
78
+ uid,
79
+ row,
80
+ }, client);
81
+ // foreign key dataTable (table + parent_id)
82
+ const formData = tokenData?.form
83
+ ? (await getTemplate("form", tokenData.form)) || {}
84
+ : {};
85
+ const schema = formData?.schema || formData;
86
+ const parentKeys = Object.keys(schema || {})?.filter((key) => data[key]?.length &&
87
+ Array.isArray(data[key]) &&
88
+ schema?.[key]?.table &&
89
+ schema?.[key]?.parent_id);
90
+ if (parentKeys?.length) {
91
+ await Promise.all(parentKeys?.map(async (key) => {
92
+ const parentKey = schema[key].parent_id;
93
+ const objId = data[parentKey] || data?.id || row?.[parentKey] || id1;
94
+ const parentRows = await Promise.all(data[key].map(async (row) => {
95
+ Object.assign(row, { [parentKey]: objId });
96
+ const parentRes = await getInsertQuery({
97
+ pg: client,
98
+ table: schema[key].table,
99
+ data: row,
100
+ uid,
101
+ });
102
+ if (!parentRes?.insertQuery || !parentRes?.args?.length)
103
+ return null;
104
+ const { rows = [] } = await client.query(parentRes.insertQuery, parentRes.args);
105
+ return rows[0];
106
+ }));
107
+ Object.assign(row, { [key]: parentRows.filter(Boolean) });
108
+ }));
109
+ }
110
+ await logChanges({
111
+ pg: client,
112
+ table,
113
+ tokenData,
114
+ referer,
115
+ data,
116
+ id: id1,
117
+ uid,
118
+ type: "UPSERT",
119
+ });
120
+ if (config.redis) {
121
+ rclient.incr(`pg:${table}:crud`);
122
+ }
123
+ if (!isClient) {
124
+ await client.query("commit;");
125
+ }
126
+ return row;
127
+ }
128
+ catch (err) {
129
+ logger.file("crud/upsert", {
130
+ error: err.toString(),
131
+ stack: err.stack,
132
+ table,
133
+ id,
134
+ referer,
135
+ uid,
136
+ form: tokenData?.form,
137
+ });
138
+ if (!isClient) {
139
+ await client.query("rollback;");
140
+ }
141
+ throw err;
142
+ }
143
+ finally {
144
+ if (!isClient) {
145
+ client?.release?.();
146
+ }
147
+ }
148
+ }
@@ -8,5 +8,7 @@ export default function getInsertQuery({ pg, table, data, id, uid, }: {
8
8
  }): Promise<{
9
9
  insertQuery: string;
10
10
  args: any[];
11
+ keys: any[];
12
+ systemColumns: any;
11
13
  } | null>;
12
14
  //# sourceMappingURL=getInsertQuery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getInsertQuery.d.ts","sourceRoot":"","sources":["../../../../../../server/plugins/crud/funcs/utils/getInsertQuery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAI5D,wBAA8B,cAAc,CAAC,EAC3C,EAAE,EACF,KAAK,EACL,IAAI,EACJ,EAAE,EACF,GAAG,GACJ,EAAE;IACD,EAAE,CAAC,EAAE,UAAU,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;;;UA6EA"}
1
+ {"version":3,"file":"getInsertQuery.d.ts","sourceRoot":"","sources":["../../../../../../server/plugins/crud/funcs/utils/getInsertQuery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAI5D,wBAA8B,cAAc,CAAC,EAC3C,EAAE,EACF,KAAK,EACL,IAAI,EACJ,EAAE,EACF,GAAG,GACJ,EAAE;IACD,EAAE,CAAC,EAAE,UAAU,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;;;;;UA+EA"}
@@ -56,5 +56,6 @@ export default async function getInsertQuery({ pg, table, data, id, uid, }) {
56
56
  ? JSON.stringify(el[1])
57
57
  : el[1]),
58
58
  ];
59
- return { insertQuery, args };
59
+ const keys = filterData.map((el) => el[0]);
60
+ return { insertQuery, args, keys, systemColumns };
60
61
  }
@@ -9,7 +9,7 @@ interface IFile {
9
9
  extension?: string;
10
10
  buffer?: Buffer;
11
11
  filename?: string;
12
- ext?: string;
12
+ fields?: Record<string, any>;
13
13
  }
14
14
  export default function uploadMultiPart(req: any, { extensions, raw, subdir, originalFilename, }?: {
15
15
  extensions?: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"uploadMultiPart.d.ts","sourceRoot":"","sources":["../../../../server/plugins/file/uploadMultiPart.ts"],"names":[],"mappings":"AAqBA,UAAU,KAAK;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAyCD,wBAA8B,eAAe,CAC3C,GAAG,EAAE,GAAG,EACR,EACE,UAAU,EACV,GAAG,EACH,MAAM,EACN,gBAAwB,GACzB,GAAE;IACD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACvB,GACL,OAAO,CAAC,KAAK,CAAC,CAwFhB"}
1
+ {"version":3,"file":"uploadMultiPart.d.ts","sourceRoot":"","sources":["../../../../server/plugins/file/uploadMultiPart.ts"],"names":[],"mappings":"AAqBA,UAAU,KAAK;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC9B;AAyCD,wBAA8B,eAAe,CAC3C,GAAG,EAAE,GAAG,EACR,EACE,UAAU,EACV,GAAG,EACH,MAAM,EACN,gBAAwB,GACzB,GAAE;IACD,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACvB,GACL,OAAO,CAAC,KAAK,CAAC,CAgGhB"}
@@ -66,8 +66,15 @@ export default async function uploadMultiPart(req, { extensions, raw, subdir, or
66
66
  if (!fileBuffer?.length) {
67
67
  throw new BadRequestError("file buffer is empty");
68
68
  }
69
- if (raw)
70
- return { buffer: fileBuffer, filename: value.filename, ext }; // return buffer for custom upload
69
+ // return buffer for custom upload
70
+ if (raw) {
71
+ return {
72
+ buffer: fileBuffer,
73
+ filename: value.filename,
74
+ extension: ext.substring(1),
75
+ fields: value.fields,
76
+ };
77
+ }
71
78
  const dir = subdir != null ? subdir : req.params?.["*"] || "uploads";
72
79
  const yearMonthDay = subdir != null ? "" : new Date().toISOString().split("T")[0];
73
80
  const dbname = req.pg?.options?.database || req.pg?.database || config.pg?.database; // request / config params / default config params
@@ -5,7 +5,7 @@ export default async function getMeta(opt, nocache) {
5
5
  if (!pg)
6
6
  return { error: "pg connection not established", status: 400 };
7
7
  const table1 = opt?.table || opt;
8
- const table = pg.pk[table1] ? table1 : table1?.replace?.(/"/g, "");
8
+ const table = pg.pk?.[table1] ? table1 : table1?.replace?.(/"/g, "");
9
9
  if (pg?.options?.database && data[pg.options.database]?.[table] && !nocache)
10
10
  return data[pg.options.database][table];
11
11
  if (!pg?.tlist?.includes(table) &&
@@ -39,7 +39,7 @@ export default async function getMeta(opt, nocache) {
39
39
  pk,
40
40
  columns: fields,
41
41
  geom: geomAttr?.name,
42
- view: pg.relkinds?.[table] === "v",
42
+ view: ["v", "m"].includes(pg.relkinds?.[table]),
43
43
  };
44
44
  if (!data[pg.options.database]) {
45
45
  data[pg.options.database] = {};
@@ -1 +1 @@
1
- {"version":3,"file":"getPG.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/pg/funcs/getPG.ts"],"names":[],"mappings":"AAYA,iBAAS,KAAK,CAAC,KAAK,GAAE,GAAQ,OA0C7B;AAED,eAAe,KAAK,CAAC"}
1
+ {"version":3,"file":"getPG.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/pg/funcs/getPG.ts"],"names":[],"mappings":"AAYA,iBAAS,KAAK,CAAC,KAAK,GAAE,GAAQ,OA6C7B;AAED,eAAe,KAAK,CAAC"}
@@ -14,7 +14,7 @@ function getPG(param = {}) {
14
14
  dblist.find((el) => el.database === (param?.db || param?.database || param) &&
15
15
  el.port === param?.port);
16
16
  const { user, password, host, port, db, database, name: origin, statement_timeout: timeout, // explicit
17
- } = dbListParams ??
17
+ connectionTimeoutMillis: connectionTimeout, } = dbListParams ??
18
18
  (typeof param === "string" ? getDBParams(param) : param || {});
19
19
  const name = origin || db || database || param || "client";
20
20
  if (pgClients[name])
@@ -26,6 +26,7 @@ function getPG(param = {}) {
26
26
  port: port || config.pg?.port,
27
27
  database: db || database || config.pg?.db || config.pg?.database,
28
28
  statement_timeout: timeout || config.pg?.statement_timeout || 10000,
29
+ connectionTimeoutMillis: connectionTimeout || config.pg?.connectionTimeoutMillis || 5000,
29
30
  };
30
31
  if (!dbConfig.database) {
31
32
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"getPGAsync.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/pg/funcs/getPGAsync.ts"],"names":[],"mappings":"AAYA,iBAAe,UAAU,CAAC,KAAK,EAAE,GAAG,gBAsDnC;AAED,eAAe,UAAU,CAAC"}
1
+ {"version":3,"file":"getPGAsync.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/pg/funcs/getPGAsync.ts"],"names":[],"mappings":"AAYA,iBAAe,UAAU,CAAC,KAAK,EAAE,GAAG,gBAyDnC;AAED,eAAe,UAAU,CAAC"}
@@ -13,7 +13,7 @@ async function getPGAsync(param) {
13
13
  const dbListParams = dblist.find((el) => el.key === param?.key) ||
14
14
  dblist.find((el) => el.database === (param?.db || param?.database || param));
15
15
  const { user, password, host, port, db, database, name: origin, statement_timeout: timeout, // explicit
16
- } = dbListParams ??
16
+ connectionTimeoutMillis: connectionTimeout, } = dbListParams ??
17
17
  (typeof param === "string" ? getDBParams(param) : param || {});
18
18
  const name = origin || db || database || param || "client";
19
19
  if (pgClients[name]?.tlist)
@@ -25,6 +25,7 @@ async function getPGAsync(param) {
25
25
  port: port || config.pg?.port,
26
26
  database: db || database || config.pg?.db || config.pg?.database,
27
27
  statement_timeout: timeout || config.pg?.statement_timeout || 10000,
28
+ connectionTimeoutMillis: connectionTimeout || config.pg?.connectionTimeoutMillis || 5000,
28
29
  };
29
30
  if (!dbConfig.database) {
30
31
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/pg/funcs/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AASpB,iBAAe,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,iBA+LlC;AAGD,eAAe,IAAI,CAAC"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/pg/funcs/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AASpB,iBAAe,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,iBA2MlC;AAGD,eAAe,IAAI,CAAC"}
@@ -8,6 +8,13 @@ async function init(client) {
8
8
  if (!client?.options?.database) {
9
9
  return;
10
10
  }
11
+ try {
12
+ await client.connect();
13
+ }
14
+ catch (err) {
15
+ console.error("Error connecting to PostgreSQL:", client?.options?.database, err.message);
16
+ return;
17
+ }
11
18
  const { pgType, pk } = await client
12
19
  .query(`SELECT
13
20
  (
@@ -52,9 +59,10 @@ async function init(client) {
52
59
  FROM
53
60
  pg_class
54
61
  WHERE
55
- relkind IN ('r', 'v')`)
62
+ relkind IN ('r', 'v', 'm')`)
56
63
  .then((d) => d.rows[0].tlist);
57
- const { rows = [] } = await client.query(`SELECT
64
+ const rows = await client
65
+ .query(`SELECT
58
66
  (
59
67
  SELECT
60
68
  nspname
@@ -67,7 +75,8 @@ async function init(client) {
67
75
  FROM
68
76
  pg_class
69
77
  WHERE
70
- relkind IN ('r', 'v')`);
78
+ relkind IN ('r', 'v', 'm')`)
79
+ .then((el) => el.rows || []);
71
80
  const relkinds = rows.reduce((acc, curr) => Object.assign(acc, { [curr.tname]: curr.relkind }), {});
72
81
  async function query(q, args = []) {
73
82
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"checkPolicy.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/policy/funcs/checkPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAEV,eAAe,EAEhB,MAAM,wBAAwB,CAAC;AAKhC,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,YAAY,oSA8K5E"}
1
+ {"version":3,"file":"checkPolicy.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/policy/funcs/checkPolicy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAEV,eAAe,EAEhB,MAAM,wBAAwB,CAAC;AAKhC,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,YAAY,oSAmL5E"}
@@ -77,7 +77,9 @@ export default function checkPolicy(req, reply) {
77
77
  return null;
78
78
  }
79
79
  // ! sql injection
80
- const stopWords = block.filter((el) => path.includes(el));
80
+ const stopWords = block.filter((el) => path.includes(el) ||
81
+ JSON.stringify(req.body || {}).includes(el) ||
82
+ JSON.stringify(query || {}).includes(el));
81
83
  if (stopWords?.length) {
82
84
  logger.file("injection/sql", {
83
85
  path,
@@ -0,0 +1,8 @@
1
+ export default function checkSQL({ body, schema }: any): {
2
+ body: any;
3
+ error?: undefined;
4
+ } | {
5
+ error: string;
6
+ body: any;
7
+ };
8
+ //# sourceMappingURL=checkSQL.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkSQL.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/policy/funcs/checkSQL.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAW,EAAE,EAAE,GAAG;;;;;;EA0B1D"}
@@ -0,0 +1,19 @@
1
+ import sqlInjection from "../sqlInjection.js";
2
+ export default function checkSQL({ body, schema = {} }) {
3
+ const data = typeof body === "string" ? body : JSON.stringify(body);
4
+ const stopWords = sqlInjection.filter((el) => data?.toLowerCase?.()?.includes?.(el));
5
+ if (!stopWords.length)
6
+ return { body };
7
+ const disabledCheckFields = Object.keys(schema || {})?.filter((el) => schema?.[el]?.sqlCheck === false); // exclude specific columns
8
+ const field = Object.keys(body)?.find((key) => body[key]?.toLowerCase &&
9
+ !disabledCheckFields.includes(key) &&
10
+ body[key].toLowerCase().includes(stopWords[0]));
11
+ if (field) {
12
+ console.error(stopWords[0], field, body[field]);
13
+ return {
14
+ error: `rule: ${stopWords[0]} | attr: ${field} | val: ${body[field]}`,
15
+ body,
16
+ };
17
+ }
18
+ return { body };
19
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"insert.d.ts","sourceRoot":"","sources":["../../../../../server/routes/crud/controllers/insert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAe5C,wBAA8B,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY;;;GAsJjE"}
1
+ {"version":3,"file":"insert.d.ts","sourceRoot":"","sources":["../../../../../server/routes/crud/controllers/insert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAgB5C,wBAA8B,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY;;;GAsKjE"}
@@ -1,4 +1,4 @@
1
- import { applyHook, getAccess, getTemplate, checkXSS, dataInsert, getToken, config, pgClients, logger, validateData, } from "../../../../utils.js";
1
+ import { applyHook, getAccess, getTemplate, checkXSS, checkSQL, dataInsert, getToken, config, pgClients, logger, validateData, } from "../../../../utils.js";
2
2
  export default async function insert(req, reply) {
3
3
  const { pg = pgClients.client, user = {}, params = {}, body = {}, headers = {}, } = req || {};
4
4
  if (!user) {
@@ -62,7 +62,7 @@ export default async function insert(req, reply) {
62
62
  }
63
63
  const fieldCheck = validateData({ body, schema });
64
64
  if (fieldCheck.error) {
65
- logger.file("injection/sql", {
65
+ logger.file("injection/formdata", {
66
66
  table,
67
67
  form: form || loadTemplate?.form,
68
68
  uid: user?.uid,
@@ -72,6 +72,18 @@ export default async function insert(req, reply) {
72
72
  .status(409)
73
73
  .send("Дані не пройшли валідацію. Приберіть некоректні дані та спробуйте ще раз");
74
74
  }
75
+ const sqlCheck = checkSQL({ body, schema });
76
+ if (sqlCheck.error) {
77
+ logger.file("injection/sql", {
78
+ table,
79
+ form: form || loadTemplate?.form,
80
+ uid: user?.uid,
81
+ ...sqlCheck,
82
+ });
83
+ return reply
84
+ .status(409)
85
+ .send("Дані містять заборонені sql символи. Приберіть їх та спробуйте ще раз");
86
+ }
75
87
  if (![add, table].includes("admin.users")) {
76
88
  Object.assign(body, { uid: user?.uid, editor_id: user?.uid });
77
89
  }
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../../server/routes/crud/controllers/update.ts"],"names":[],"mappings":"AAcA,wBAA8B,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,gBAsKxD"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../../server/routes/crud/controllers/update.ts"],"names":[],"mappings":"AAeA,wBAA8B,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,gBAsLxD"}
@@ -1,4 +1,4 @@
1
- import { pgClients, applyHook, getAccess, getTemplate, checkXSS, dataUpdate, logger, getToken, validateData, } from "../../../../utils.js";
1
+ import { pgClients, applyHook, getAccess, getTemplate, checkXSS, checkSQL, dataUpdate, logger, getToken, validateData, } from "../../../../utils.js";
2
2
  import config from "../../../../config.js";
3
3
  import insert from "./insert.js";
4
4
  export default async function update(req, reply) {
@@ -75,7 +75,7 @@ export default async function update(req, reply) {
75
75
  }
76
76
  const fieldCheck = validateData({ body, schema });
77
77
  if (fieldCheck.error) {
78
- logger.file("injection/sql", {
78
+ logger.file("injection/formdata", {
79
79
  table,
80
80
  form: form || loadTemplate?.form,
81
81
  uid: user?.uid,
@@ -85,6 +85,18 @@ export default async function update(req, reply) {
85
85
  .status(409)
86
86
  .send("Дані не пройшли валідацію. Приберіть некоректні дані та спробуйте ще раз");
87
87
  }
88
+ const sqlCheck = checkSQL({ body, schema });
89
+ if (sqlCheck.error) {
90
+ logger.file("injection/sql", {
91
+ table,
92
+ form: form || loadTemplate?.form,
93
+ uid: user?.uid,
94
+ ...sqlCheck,
95
+ });
96
+ return reply
97
+ .status(409)
98
+ .send("Дані містять заборонені sql символи. Приберіть їх та спробуйте ще раз");
99
+ }
88
100
  if (tokenData?.obj) {
89
101
  const objData = tokenData.obj?.split("#").reduce((p, el) => ({
90
102
  ...p,
@@ -1 +1 @@
1
- {"version":3,"file":"getFormByTable.d.ts","sourceRoot":"","sources":["../../../../../server/routes/table/controllers/getFormByTable.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAc5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAUzD,wBAA8B,OAAO,CACnC,EACE,EAAqB,EACrB,MAAM,EACN,IAAS,EACT,KAAU,GACX,EAAE;IACD,EAAE,EAAE,UAAU,CAAC;IACf,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;CACvB,EACD,KAAK,EAAE,YAAY,gBAkKpB"}
1
+ {"version":3,"file":"getFormByTable.d.ts","sourceRoot":"","sources":["../../../../../server/routes/table/controllers/getFormByTable.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAc5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAUzD,wBAA8B,OAAO,CACnC,EACE,EAAqB,EACrB,MAAM,EACN,IAAS,EACT,KAAU,GACX,EAAE;IACD,EAAE,EAAE,UAAU,CAAC;IACf,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,KAAK,EAAE;QAAE,IAAI,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;CACvB,EACD,KAAK,EAAE,YAAY,gBAsKpB"}
@@ -23,10 +23,9 @@ export default async function getForm({ pg = pgClients.client, params, user = {}
23
23
  }
24
24
  const tokenData = (await getToken({ token: params.name, uid: user?.uid, json: 1 })) || {};
25
25
  const table = tokenData?.table || hookData?.table || params.name;
26
- const form = tokenData?.form ||
27
- hookData?.form ||
28
- (await getTemplate("table", table).then((el) => el?.form)) ||
29
- {};
26
+ const loadTable = (await getTemplate("table", table)) || {};
27
+ const { title = loadTable.ua, description } = loadTable;
28
+ const form = tokenData?.form || hookData?.form || loadTable.form;
30
29
  if (!form) {
31
30
  // return reply.status(404).send("form not found");
32
31
  }
@@ -52,7 +51,13 @@ export default async function getForm({ pg = pgClients.client, params, user = {}
52
51
  }), {});
53
52
  Object.assign(loadTemplate, { obj });
54
53
  }
55
- const res = { mode: "form", time: 0, ...loadTemplate, schema };
54
+ const res = {
55
+ mode: "form",
56
+ time: 0,
57
+ meta: { title, description },
58
+ ...loadTemplate,
59
+ schema,
60
+ };
56
61
  if (user.uid) {
57
62
  // form in form addToken
58
63
  formatSchema(schema, user, loadTemplate?.obj);
package/dist/utils.d.ts CHANGED
@@ -34,6 +34,7 @@ export { default as getMenu } from "./server/routes/menu/controllers/getMenu.js"
34
34
  export { default as getFilter } from "./server/plugins/table/funcs/getFilter.js";
35
35
  export { default as dataInsert } from "./server/plugins/crud/funcs/dataInsert.js";
36
36
  export { default as dataUpdate } from "./server/plugins/crud/funcs/dataUpdate.js";
37
+ export { default as dataUpsert } from "./server/plugins/crud/funcs/dataUpsert.js";
37
38
  export { default as dataDelete } from "./server/plugins/crud/funcs/dataDelete.js";
38
39
  export { default as getInsertQuery } from "./server/plugins/crud/funcs/utils/getInsertQuery.js";
39
40
  export { default as getToken } from "./server/plugins/crud/funcs/getToken.js";
@@ -42,6 +43,7 @@ export { default as getOpt } from "./server/plugins/crud/funcs/getOpt.js";
42
43
  export { default as setOpt } from "./server/plugins/crud/funcs/setOpt.js";
43
44
  export { default as validateData } from "./server/plugins/crud/funcs/validateData.js";
44
45
  export { default as checkXSS } from "./server/plugins/policy/funcs/checkXSS.js";
46
+ export { default as checkSQL } from "./server/plugins/policy/funcs/checkSQL.js";
45
47
  export { default as addHook } from "./server/plugins/hook/addHook.js";
46
48
  export { default as applyHook } from "./server/plugins/hook/applyHook.js";
47
49
  export { default as applyHookSync } from "./server/plugins/hook/applyHookSync.js";
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../utils.ts"],"names":[],"mappings":"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"}
package/dist/utils.js CHANGED
@@ -42,6 +42,7 @@ export { default as getFilter } from "./server/plugins/table/funcs/getFilter.js"
42
42
  // crud
43
43
  export { default as dataInsert } from "./server/plugins/crud/funcs/dataInsert.js";
44
44
  export { default as dataUpdate } from "./server/plugins/crud/funcs/dataUpdate.js";
45
+ export { default as dataUpsert } from "./server/plugins/crud/funcs/dataUpsert.js";
45
46
  export { default as dataDelete } from "./server/plugins/crud/funcs/dataDelete.js";
46
47
  export { default as getInsertQuery } from "./server/plugins/crud/funcs/utils/getInsertQuery.js";
47
48
  export { default as getToken } from "./server/plugins/crud/funcs/getToken.js";
@@ -51,6 +52,7 @@ export { default as setOpt } from "./server/plugins/crud/funcs/setOpt.js";
51
52
  export { default as validateData } from "./server/plugins/crud/funcs/validateData.js";
52
53
  // policy
53
54
  export { default as checkXSS } from "./server/plugins/policy/funcs/checkXSS.js";
55
+ export { default as checkSQL } from "./server/plugins/policy/funcs/checkSQL.js";
54
56
  // hook
55
57
  export { default as addHook } from "./server/plugins/hook/addHook.js";
56
58
  export { default as applyHook } from "./server/plugins/hook/applyHook.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengis/fastify-table",
3
- "version": "2.0.78",
3
+ "version": "2.0.80",
4
4
  "type": "module",
5
5
  "description": "core-plugins",
6
6
  "keywords": [