@opengis/fastify-table 2.0.147 → 2.0.149

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.
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"AAWA,QAAA,MAAM,MAAM,KAA8D,CAAC;AAsC3E,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../config.ts"],"names":[],"mappings":"AAWA,QAAA,MAAM,MAAM,KAA8D,CAAC;AAgD3E,eAAe,MAAM,CAAC"}
package/dist/config.js CHANGED
@@ -15,6 +15,13 @@ Object.assign(config, {
15
15
  if (existsSync(`.env.local`)) {
16
16
  dotenv.config({ path: `.env.local` }); // ! load .env.local
17
17
  }
18
+ // example: bun server kamianske
19
+ if (process.cwd().split("\\").pop() &&
20
+ process.cwd().split("\\").pop() === "fastify-table" &&
21
+ process.argv[2] &&
22
+ existsSync(`.env.${process.argv[2]}`)) {
23
+ dotenv.config({ path: `.env.${process.argv[2]}` }); // ! for debug only
24
+ }
18
25
  if (process.env?.NODE_ENV && existsSync(`.env.${process.env.NODE_ENV}`)) {
19
26
  dotenv.config({ path: `.env.${process.env.NODE_ENV}` }); // ! load .env.{{production}} etc.
20
27
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AA4FA,iBAAS,MAAM,CAAC,OAAO,EAAE,GAAG,QA6K3B;;AACD,wBAA0B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AA4FA,iBAAS,MAAM,CAAC,OAAO,EAAE,GAAG,QA8K3B;;AACD,wBAA0B"}
package/dist/index.js CHANGED
@@ -125,7 +125,7 @@ function plugin(fastify) {
125
125
  timeWindow: config.rateLimit?.timeWindow || 60000,
126
126
  hook: "preHandler",
127
127
  global: true,
128
- keyGenerator: (req) => `${req.ip}-${req.raw.url.split("?")[0]}`,
128
+ keyGenerator: (req) => `${req.user?.uid || req.ip}-${req.raw.url.split("?")[0]}`,
129
129
  });
130
130
  }
131
131
  else {
@@ -3,7 +3,7 @@ import getRedis from "../../redis/funcs/getRedis.js";
3
3
  import pgClients from "../../pg/pgClients.js";
4
4
  import getTemplate from "../../table/funcs/getTemplate.js";
5
5
  import config from "../../../../config.js";
6
- import logChanges from "./utils/logChanges.js";
6
+ // import logChanges from "./utils/logChanges.js";
7
7
  import getInsertQuery from "./utils/getInsertQuery.js";
8
8
  import logger from "../../logger/getLogger.js";
9
9
  import extraData from "../../extra/extraData.js";
@@ -95,16 +95,16 @@ export default async function dataInsert({ id, table: table1, referer, data, pg:
95
95
  Object.assign(res.rows[0], { [key]: parentRows.filter(Boolean) });
96
96
  }));
97
97
  }
98
- await logChanges({
99
- pg: client,
100
- table,
101
- tokenData,
102
- referer,
103
- data,
104
- id: id1,
105
- uid,
106
- type: "INSERT",
107
- });
98
+ // await logChanges({
99
+ // pg: client,
100
+ // table,
101
+ // tokenData,
102
+ // referer,
103
+ // data,
104
+ // id: id1,
105
+ // uid,
106
+ // type: "INSERT",
107
+ // });
108
108
  if (config.redis && rclient?.status !== "end") {
109
109
  rclient.incr(`pg:${client.options?.database}:${table}:crud`);
110
110
  }
@@ -1 +1 @@
1
- {"version":3,"file":"logChanges.d.ts","sourceRoot":"","sources":["../../../../../../server/plugins/crud/funcs/utils/logChanges.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAC;AA4B5D,wBAA8B,UAAU,CAAC,EACvC,EAAE,EACF,KAAK,EAAE,MAAM,EACb,SAAS,EACT,OAAO,EACP,EAAE,EACF,IAAI,EACJ,GAAO,EACP,IAAI,GACL,EAAE;IACD,EAAE,EAAE,UAAU,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;CACd;;;;;;;;;;;;;;;;;;UAuJA"}
1
+ {"version":3,"file":"logChanges.d.ts","sourceRoot":"","sources":["../../../../../../server/plugins/crud/funcs/utils/logChanges.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,2BAA2B,CAAC;AA4B5D,wBAA8B,UAAU,CAAC,EACvC,EAAE,EACF,KAAK,EAAE,MAAM,EACb,SAAS,EACT,OAAO,EACP,EAAE,EACF,IAAI,EACJ,GAAO,EACP,IAAI,GACL,EAAE;IACD,EAAE,EAAE,UAAU,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;CACd;;;;;;;;;;;;;;;;;;UA6JA"}
@@ -49,10 +49,11 @@ export default async function logChanges({ pg, table: table1, tokenData, referer
49
49
  .query(`insert into log.table_changes(change_date,change_type,change_user_id,entity_type,entity_id)
50
50
  values(CURRENT_DATE, $1, $2, $3, $4) returning change_id`, [type, uid, table, id])
51
51
  .then((el) => el.rows?.[0] || {});
52
- const q = `select json_object_agg(entity_key, value_hash) from (
52
+ const q = `select json_object_agg(entity_key, json_build_object('hash',value_hash,'value',value_new)) from (
53
53
  select
54
54
  entity_key,
55
55
  value_hash,
56
+ value_new,
56
57
  ( rank() over (partition by entity_key order by cdate desc) = 1 ) as is_latest
57
58
  from log.table_changes_data
58
59
 
@@ -93,14 +94,16 @@ export default async function logChanges({ pg, table: table1, tokenData, referer
93
94
  .map((el) => ({
94
95
  change_id: changeId,
95
96
  entity_key: el,
96
- value_old: getValue(old?.[el], table),
97
+ value_old: getValue(old?.[el]?.value, table),
97
98
  value_new: type === "DELETE" ? null : getValue(newObj?.[el], table),
98
99
  value_hash: newObj?.[el]
99
100
  ? createHash("md5").update(JSON.stringify(newObj?.[el])).digest("hex")
100
101
  : null,
101
102
  uid,
102
103
  }))
103
- .filter((el) => old?.[el.entity_key] !== el.value_hash);
104
+ .filter((el) => (newObj?.[el.entity_key] ||
105
+ getValue(old?.[el.entity_key]?.value, table)) &&
106
+ old?.[el.entity_key]?.hash !== el.value_hash);
104
107
  const res = await Promise.all(changesData.map(async (el) => {
105
108
  const insertQuery = `insert into log.table_changes_data (${Object.entries(el)
106
109
  ?.map((key) => `"${key[0]}"`)
@@ -256,7 +256,7 @@ export default async function suggest(req, reply) {
256
256
  const where = [search, val, filter, meta.pk ? `${meta.pk} is not null` : null]
257
257
  .filter(Boolean)
258
258
  .join(" and ") || "true";
259
- const sqlSuggest = `with c(id,text) as ( ${meta.original.replace(/{{parent}}/gi, parent)} where ${where} ${meta.original.includes("order by") ? "" : "order by 2"}) select * from c where ${filter} limit ${Math.min(query.limit || meta.limit || limit, limit)}`.replace(/{{uid}}/g, user?.uid || "0");
259
+ const sqlSuggest = `with c(id,text) as ( ${meta.original.replace(/{{parent}}/gi, parent)} where ${where} ${meta.original.toLowerCase().includes("order by") ? "" : "order by 2"}) select * from c where ${filter} limit ${Math.min(query.limit || meta.limit || limit, limit)}`.replace(/{{uid}}/g, user?.uid || "0");
260
260
  if (query.sql && debugMode) {
261
261
  return sqlSuggest;
262
262
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../../../../server/routes/util/controllers/dependencies.ts"],"names":[],"mappings":"AAQA,wBAA8B,iBAAiB,CAAC,GAAG,EAAE,GAAG,eAUvD"}
1
+ {"version":3,"file":"dependencies.d.ts","sourceRoot":"","sources":["../../../../../server/routes/util/controllers/dependencies.ts"],"names":[],"mappings":"AAQA,wBAA8B,iBAAiB,CAAC,GAAG,EAAE,GAAG,eAcvD"}
@@ -9,5 +9,14 @@ export default async function dumpInstalledDeps(app) {
9
9
  ...json.dependencies,
10
10
  ...(json.devDependencies || {}),
11
11
  ...(json.peerDependencies || {}),
12
- }).reduce((acc, curr) => Object.assign(acc, { [curr]: require(`${curr}/package.json`).version }), {});
12
+ }).reduce((acc, curr) => {
13
+ try {
14
+ Object.assign(acc, { [curr]: require(`${curr}/package.json`).version });
15
+ }
16
+ catch (err) {
17
+ Object.assign(acc, { [curr]: err.toString() });
18
+ // skip packages that does not explicidly provide access to package.json
19
+ }
20
+ return acc;
21
+ }, {});
13
22
  }
@@ -2,5 +2,5 @@
2
2
  * Дістає CRM для widget
3
3
  *
4
4
  */
5
- export default function widgetGet({ pg, user, params, query, unittest }: any, reply: any): Promise<any>;
5
+ export default function widgetGet({ pg, user, params, query }: any, reply: any): Promise<any>;
6
6
  //# sourceMappingURL=widget.get.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"widget.get.d.ts","sourceRoot":"","sources":["../../../../../server/routes/widget/controllers/widget.get.ts"],"names":[],"mappings":"AAyBA;;;GAGG;AAEH,wBAA8B,SAAS,CACrC,EAAE,EAAqB,EAAE,IAAS,EAAE,MAAW,EAAE,KAAU,EAAE,QAAQ,EAAE,EAAE,GAAG,EAC5E,KAAK,EAAE,GAAG,gBAkLX"}
1
+ {"version":3,"file":"widget.get.d.ts","sourceRoot":"","sources":["../../../../../server/routes/widget/controllers/widget.get.ts"],"names":[],"mappings":"AAyBA;;;GAGG;AAEH,wBAA8B,SAAS,CACrC,EAAE,EAAqB,EAAE,IAAS,EAAE,MAAW,EAAE,KAAU,EAAE,EAAE,GAAG,EAClE,KAAK,EAAE,GAAG,gBA+KX"}
@@ -23,7 +23,8 @@ const pkList = {
23
23
  * Дістає CRM для widget
24
24
  *
25
25
  */
26
- export default async function widgetGet({ pg = pgClients.client, user = {}, params = {}, query = {}, unittest }, reply) {
26
+ export default async function widgetGet({ pg = pgClients.client, user = {}, params = {}, query = {} }, reply) {
27
+ const time = [Date.now()];
27
28
  const param = user?.uid
28
29
  ? await getToken({
29
30
  token: params.objectid,
@@ -43,8 +44,7 @@ export default async function widgetGet({ pg = pgClients.client, user = {}, para
43
44
  left join admin.users u on u.uid=c.uid
44
45
  where entity_id=$1 order by cdate desc`
45
46
  : "select communication_id, entity_id, body, subject, cdate, uid from crm.communications where entity_id=$1 order by cdate desc",
46
- history: `select * from (
47
- SELECT change_id, entity_id, entity_type, change_type, change_date, a.change_user_id, a.uid, a.cdate, b.json_agg as changes,
47
+ history: `SELECT change_id, entity_id, entity_type, change_type, change_date, a.change_user_id, a.uid, a.cdate, b.json_agg as changes,
48
48
  ${username} as username, u.login, u.avatar
49
49
  FROM log.table_changes a
50
50
  left join admin.users u on a.change_user_id = u.uid
@@ -54,26 +54,12 @@ export default async function widgetGet({ pg = pgClients.client, user = {}, para
54
54
  where change_id=a.change_id
55
55
  )q
56
56
  )b on 1=1
57
- where b.json_agg is not null and (entity_id=$1 or entity_id in (
58
- select communication_id as comments from crm.communications where entity_id=$1
59
- union all select checklist_id from crm.checklists where entity_id=$1)
57
+ where a.change_type != 'INSERT' and b.json_agg is not null and (entity_id=$1 or entity_id in (
58
+ select communication_id from crm.communications where entity_id=$1
59
+ union all select checklist_id from crm.checklists where entity_id=$1
60
+ union all select file_id from crm.files where entity_id=$1)
60
61
  )
61
-
62
- union all
63
- select change_id, entity_id, entity_type, change_type, change_date, a.change_user_id, a.uid, a.cdate, b.json_agg as changes,
64
- ${username} as username, u.login, u.avatar
65
- FROM log.table_changes a
66
- left join admin.users u on a.change_user_id = u.uid
67
- left join lateral(
68
- select json_agg(o) from (
69
- select json_object_agg(entity_key, coalesce(value_new, value_old)) as o from log.table_changes_data
70
- where change_id=a.change_id and entity_key not in ('uid', 'file_status', 'editor_id', 'cdate', 'editor_date', 'entity_id')
71
- )q
72
- )b on 1=1
73
- where a.change_type in ('INSERT', 'DELETE') and a.entity_id in (select file_id from crm.files where entity_id=$1)
74
- limit 100
75
-
76
- )q order by cdate desc limit 100`,
62
+ order by cdate desc limit 100`,
77
63
  checklist: pg.pk["admin.users"]
78
64
  ? `SELECT checklist_id, entity_id, subject, is_done, done_date, c.uid, c.cdate, ${username} as username, u.login, u.avatar
79
65
  FROM crm.checklists c
@@ -102,9 +88,11 @@ export default async function widgetGet({ pg = pgClients.client, user = {}, para
102
88
  if (!q) {
103
89
  return reply.status(400).send("invalid widget type");
104
90
  }
105
- /* data */
106
- const t1 = Date.now();
107
- const { rows = [] } = await pg.query(q, [objectid, params.type === "gallery" ? galleryExtList : null].filter((el) => el));
91
+ /* rows */
92
+ const rows = await pg
93
+ .query(q, [objectid, params.type === "gallery" ? galleryExtList : null].filter(Boolean))
94
+ .then((el) => el.rows || []);
95
+ time.push(Date.now());
108
96
  rows.forEach((row) => Object.assign(row, { username: row.username?.trim?.() || row.login }));
109
97
  /* reactions */
110
98
  const widgetPkey = pkList[params.type];
@@ -121,26 +109,32 @@ export default async function widgetGet({ pg = pgClients.client, user = {}, para
121
109
  });
122
110
  }
123
111
  /* Object info */
124
- const { tableName } = pg.pk["log.table_changes"]
112
+ const tableName = pg.pk["log.table_changes"]
125
113
  ? await pg
126
- .query('select entity_type as "tableName" from log.table_changes where entity_id=$1 limit 1', [objectid])
127
- .then((el) => el.rows?.[0] || {})
114
+ .query("select entity_type from log.table_changes where entity_id=$1 limit 1", [objectid])
115
+ .then((el) => el.rows?.[0]?.entity_type)
116
+ : null;
117
+ const { pk, columns = [] } = tableName
118
+ ? await getMeta({ pg, table: tableName })
128
119
  : {};
129
- const { pk, columns = [] } = await getMeta({ pg, table: tableName });
130
120
  const authorIdColumn = columns.find((col) => ["uid", "created_by"].includes(col.name))?.name;
131
- if (!pk && params.type === "history" && !unittest) {
121
+ if (!pk &&
122
+ params.type === "history" &&
123
+ process.env.NODE_ENV !== "test" &&
124
+ !process.env.VITEST) {
132
125
  return reply.status(404).send("log table not found");
133
126
  }
134
127
  const q1 = `select ${username} as author, u.login, a.cdate, a.editor_date from ${tableName} a
135
128
  left join admin.users u on a.${authorIdColumn}=u.uid where a.${pk}=$1 limit 1`;
136
129
  const data = pg.pk["admin.users"] && pk && tableName
137
130
  ? await pg
138
- .query(q, [
131
+ .query(q1, [
139
132
  objectid,
140
133
  params.type === "gallery" ? galleryExtList : null,
141
- ].filter((el) => el))
134
+ ].filter(Boolean))
142
135
  .then((el) => el.rows?.[0] || {})
143
136
  : {};
137
+ time.push(Date.now());
144
138
  if (query.debug && user?.user_type === "admin") {
145
139
  return {
146
140
  q,
@@ -151,7 +145,7 @@ export default async function widgetGet({ pg = pgClients.client, user = {}, para
151
145
  };
152
146
  }
153
147
  return reply.status(200).send({
154
- time: { data: Date.now() - t1 },
148
+ time: { rows: time[1] - time[0], data: time[2] - time[1] },
155
149
  rows,
156
150
  user: { uid: user?.uid, name: user?.user_name },
157
151
  data: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengis/fastify-table",
3
- "version": "2.0.147",
3
+ "version": "2.0.149",
4
4
  "type": "module",
5
5
  "description": "core-plugins",
6
6
  "keywords": [
@@ -15,7 +15,8 @@
15
15
  "exports": {
16
16
  ".": "./dist/index.js",
17
17
  "./index.js": "./dist/index.js",
18
- "./utils.js": "./dist/utils.js"
18
+ "./utils.js": "./dist/utils.js",
19
+ "./package.json": "./package.json"
19
20
  },
20
21
  "files": [
21
22
  "dist/*"