@opengis/fastify-table 2.0.118 → 2.0.120

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 (38) hide show
  1. package/dist/helper.d.ts +1 -1
  2. package/dist/helper.d.ts.map +1 -1
  3. package/dist/helper.js +3 -5
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +2 -0
  6. package/dist/script/dump.js +1 -1
  7. package/dist/script/dump.ts +1 -1
  8. package/dist/server/migrations/cls.sql +36 -0
  9. package/dist/server/migrations/users.sql +1 -35
  10. package/dist/server/plugins/crud/funcs/getAccess.d.ts.map +1 -1
  11. package/dist/server/plugins/crud/funcs/getAccess.js +14 -2
  12. package/dist/server/plugins/migration/exec.sql.d.ts.map +1 -1
  13. package/dist/server/plugins/migration/exec.sql.js +4 -1
  14. package/dist/server/plugins/usercls/index.d.ts +34 -2
  15. package/dist/server/plugins/usercls/index.d.ts.map +1 -1
  16. package/dist/server/plugins/usercls/index.js +102 -17
  17. package/dist/server/routes/table/controllers/suggest.d.ts.map +1 -1
  18. package/dist/server/routes/table/controllers/suggest.js +74 -80
  19. package/dist/server/routes/usercls/controllers/addUserCls.d.ts +2 -0
  20. package/dist/server/routes/usercls/controllers/addUserCls.d.ts.map +1 -0
  21. package/dist/server/routes/usercls/controllers/addUserCls.js +31 -0
  22. package/dist/server/routes/usercls/controllers/deleteUserCls.d.ts +2 -0
  23. package/dist/server/routes/usercls/controllers/deleteUserCls.d.ts.map +1 -0
  24. package/dist/server/routes/usercls/controllers/deleteUserCls.js +17 -0
  25. package/dist/server/routes/usercls/controllers/editUserCls.d.ts +2 -0
  26. package/dist/server/routes/usercls/controllers/editUserCls.d.ts.map +1 -0
  27. package/dist/server/routes/usercls/controllers/editUserCls.js +32 -0
  28. package/dist/server/routes/usercls/controllers/getUserCls.d.ts +2 -0
  29. package/dist/server/routes/usercls/controllers/getUserCls.d.ts.map +1 -0
  30. package/dist/server/routes/usercls/controllers/getUserCls.js +12 -0
  31. package/dist/server/routes/usercls/index.d.ts +2 -0
  32. package/dist/server/routes/usercls/index.d.ts.map +1 -0
  33. package/dist/server/routes/usercls/index.js +51 -0
  34. package/dist/test.setup.js +8 -4
  35. package/dist/utils.d.ts +1 -1
  36. package/dist/utils.d.ts.map +1 -1
  37. package/dist/utils.js +1 -1
  38. package/package.json +1 -1
package/dist/helper.d.ts CHANGED
@@ -3,6 +3,6 @@ import { pgClients } from "./utils.js";
3
3
  declare const prefix: any;
4
4
  export declare function setup(): Promise<void>;
5
5
  export declare function teardown(): Promise<void>;
6
- export declare function build(): any;
6
+ export declare function build(): Promise<any>;
7
7
  export { prefix, config, pgClients, };
8
8
  //# sourceMappingURL=helper.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../helper.ts"],"names":[],"mappings":"AAGA,OAAO,MAAM,MAAM,aAAa,CAAC;AAGjC,OAAO,EAAE,SAAS,EAAkB,MAAM,YAAY,CAAC;AAEvD,QAAA,MAAQ,MAAM,KAAoB,CAAC;AAInC,wBAAsB,KAAK,kBAI1B;AAGD,wBAAsB,QAAQ,kBAW7B;AAED,wBAAgB,KAAK,QAWpB;AAED,OAAO,EAEL,MAAM,EACN,MAAM,EACN,SAAS,GACV,CAAC"}
1
+ {"version":3,"file":"helper.d.ts","sourceRoot":"","sources":["../helper.ts"],"names":[],"mappings":"AAGA,OAAO,MAAM,MAAM,aAAa,CAAC;AAGjC,OAAO,EAAE,SAAS,EAAkB,MAAM,YAAY,CAAC;AAEvD,QAAA,MAAQ,MAAM,KAAoB,CAAC;AAInC,wBAAsB,KAAK,kBAI1B;AAGD,wBAAsB,QAAQ,kBAW7B;AAED,wBAAsB,KAAK,iBAU1B;AAED,OAAO,EAEL,MAAM,EACN,MAAM,EACN,SAAS,GACV,CAAC"}
package/dist/helper.js CHANGED
@@ -1,8 +1,7 @@
1
- import path from "node:path";
2
1
  import Fastify from "fastify";
3
2
  import config from "./config.js";
4
3
  import appService from "./index.js";
5
- import { pgClients, addTemplateDir } from "./utils.js";
4
+ import { pgClients } from "./utils.js";
6
5
  const { prefix = "/api" } = config;
7
6
  let app;
8
7
  export async function setup() {
@@ -20,15 +19,14 @@ export async function teardown() {
20
19
  console.log("Global teardown: all clients closed");
21
20
  process.exit(0);
22
21
  }
23
- export function build() {
22
+ export async function build() {
24
23
  if (!app) {
25
24
  app = Fastify({ logger: false });
26
25
  app.register(appService, config);
27
26
  app.addHook("onRequest", async (req) => {
28
27
  req.user = req.user || { uid: "1", user_type: "admin" };
29
28
  });
30
- addTemplateDir(path.join(process.cwd(), "module/test"));
31
- // await app.ready(); // ? ensure plugins registered, can not add fastify hooks after app is ready
29
+ await app.ready(); // ? ensure plugins registered, can not add fastify hooks after app is ready
32
30
  }
33
31
  return app;
34
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AA2FA,iBAAS,MAAM,CAAC,OAAO,EAAE,GAAG,QA4K3B;;AACD,wBAA0B"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AA4FA,iBAAS,MAAM,CAAC,OAAO,EAAE,GAAG,QA6K3B;;AACD,wBAA0B"}
package/dist/index.js CHANGED
@@ -54,6 +54,7 @@ import fileRoutes from "./server/routes/file/index.js";
54
54
  import uploadChunkRoutes from "./server/routes/upload/index.js";
55
55
  import grpcRoutes from "./server/routes/grpc/index.js";
56
56
  import notificationsRoutes from "./server/routes/notifications/index.js";
57
+ import userClsRoutes from "./server/routes/usercls/index.js";
57
58
  addHook("preForm", preForm);
58
59
  addHook("afterTable", afterTable);
59
60
  addHook("preTemplate", preTemplate);
@@ -157,6 +158,7 @@ function plugin(fastify) {
157
158
  fastify.register(grpcRoutes, opt);
158
159
  // from admin
159
160
  fastify.register(notificationsRoutes, opt);
161
+ fastify.register(userClsRoutes, opt);
160
162
  config.proxy?.forEach?.((el) => {
161
163
  if (execName === "bun") {
162
164
  fastify.all(`${el.source}/*`, async (req, reply) => {
@@ -12,7 +12,7 @@ if (import.meta.main) {
12
12
  }
13
13
  const debug = false;
14
14
  export default async function dumpMigrateSQL() {
15
- const app = build();
15
+ const app = await build();
16
16
  app.addHook("onClose", async () => teardown());
17
17
  try {
18
18
  // const { database, host, port, user, password } = config.pg;
@@ -20,7 +20,7 @@ if (import.meta.main) {
20
20
  const debug = false;
21
21
 
22
22
  export default async function dumpMigrateSQL() {
23
- const app = build();
23
+ const app = await build();
24
24
  app.addHook("onClose", async () => teardown());
25
25
 
26
26
  try {
@@ -67,3 +67,39 @@ COMMENT ON COLUMN admin.user_cls.data IS 'SQL запит';
67
67
  COMMENT ON COLUMN admin.user_cls.icon IS 'Іконка';
68
68
  COMMENT ON COLUMN admin.user_cls.color IS 'Колір';
69
69
  COMMENT ON COLUMN admin.user_cls.type IS 'Тип (json/sql)';
70
+
71
+ ALTER TABLE admin.user_cls DROP CONSTRAINT IF EXISTS admin_user_cls_pkey;
72
+ ALTER TABLE admin.user_cls DROP CONSTRAINT IF EXISTS admin_user_unique;
73
+
74
+ ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS user_clsid text;
75
+ ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS code text;
76
+ ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS parent text;
77
+ ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS name text;
78
+ ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS icon text;
79
+ ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS data text;
80
+ ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS type text;
81
+ ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS files json;
82
+ ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS cdate timestamp without time zone;
83
+ ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS editor_id text;
84
+ ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS editor_date timestamp without time zone;
85
+ ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS uid text;
86
+ ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS color text;
87
+
88
+ ALTER TABLE admin.user_cls ALTER COLUMN user_clsid SET NOT NULL;
89
+ ALTER TABLE admin.user_cls ALTER COLUMN user_clsid SET DEFAULT next_id();
90
+ ALTER TABLE admin.user_cls ALTER COLUMN cdate SET DEFAULT (now())::timestamp without time zone;
91
+ ALTER TABLE admin.user_cls ALTER COLUMN uid SET NOT NULL;
92
+ ALTER TABLE admin.user_cls ALTER COLUMN uid SET DEFAULT '1'::text;
93
+
94
+ ALTER TABLE admin.user_cls ADD CONSTRAINT admin_user_cls_pkey PRIMARY KEY(user_clsid);
95
+ ALTER TABLE admin.user_cls ADD CONSTRAINT admin_user_unique UNIQUE(code, parent);
96
+
97
+ COMMENT ON TABLE admin.user_cls IS 'Користувацькі класифікатори';
98
+ COMMENT ON COLUMN admin.user_cls.user_clsid IS 'ID';
99
+ COMMENT ON COLUMN admin.user_cls.code IS 'Код';
100
+ COMMENT ON COLUMN admin.user_cls.name IS 'Назва';
101
+ COMMENT ON COLUMN admin.user_cls.icon IS 'Іконка';
102
+ COMMENT ON COLUMN admin.user_cls.color IS 'Колір';
103
+
104
+ ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS alias text[];
105
+ ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS description text;
@@ -35,7 +35,7 @@ ALTER TABLE admin.users add CONSTRAINT admin_user_user_rnokpp UNIQUE (user_rnokp
35
35
 
36
36
  -- update admin.users set user_type='regular' where user_type not in ('viewer', 'regular','admin','superadmin');
37
37
  -- ALTER TABLE admin.users add constraint admin_user_type_check CHECK (user_type=any(array['viewer', 'regular','admin','superadmin']));
38
- insert into admin.users (uid,login,sur_name,password,user_type,enabled)values('viewer','viewer','viewer','viewer','viewer', false) on conflict (uid) do update set enabled=excluded.enabled, sur_name=excluded.sur_name;
38
+ insert into admin.users (uid,login,user_name,email,sur_name,password,user_type,enabled)values('viewer','viewer','viewer','viewer','viewer','viewer','viewer', false) on conflict (uid) do update set enabled=excluded.enabled, sur_name=excluded.sur_name;
39
39
  -- update admin.users set enabled=true where uid='viewer';
40
40
 
41
41
  COMMENT ON TABLE admin.users IS 'Користувачі';
@@ -149,38 +149,4 @@ COMMENT ON COLUMN admin.users_social_auth.social_auth_softpro_code IS 'код о
149
149
  COMMENT ON COLUMN admin.users_social_auth.enabled IS 'Выключатель';
150
150
  COMMENT ON COLUMN admin.users_social_auth.social_auth_url IS 'URL для QR code';
151
151
 
152
- CREATE TABLE IF NOT EXISTS admin.user_cls();
153
- ALTER TABLE admin.user_cls DROP CONSTRAINT IF EXISTS admin_user_cls_pkey;
154
- ALTER TABLE admin.user_cls DROP CONSTRAINT IF EXISTS admin_user_unique;
155
-
156
- ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS user_clsid text;
157
- ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS code text;
158
- ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS parent text;
159
- ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS name text;
160
- ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS icon text;
161
- ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS data text;
162
- ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS type text;
163
- ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS files json;
164
- ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS cdate timestamp without time zone;
165
- ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS editor_id text;
166
- ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS editor_date timestamp without time zone;
167
- ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS uid text;
168
- ALTER TABLE admin.user_cls ADD COLUMN IF NOT EXISTS color text;
169
-
170
- ALTER TABLE admin.user_cls ALTER COLUMN user_clsid SET NOT NULL;
171
- ALTER TABLE admin.user_cls ALTER COLUMN user_clsid SET DEFAULT next_id();
172
- ALTER TABLE admin.user_cls ALTER COLUMN cdate SET DEFAULT (now())::timestamp without time zone;
173
- ALTER TABLE admin.user_cls ALTER COLUMN uid SET NOT NULL;
174
- ALTER TABLE admin.user_cls ALTER COLUMN uid SET DEFAULT '1'::text;
175
-
176
- ALTER TABLE admin.user_cls ADD CONSTRAINT admin_user_cls_pkey PRIMARY KEY(user_clsid);
177
- ALTER TABLE admin.user_cls ADD CONSTRAINT admin_user_unique UNIQUE(code, parent);
178
-
179
- COMMENT ON TABLE admin.user_cls IS 'Користувацькі класифікатори';
180
- COMMENT ON COLUMN admin.user_cls.user_clsid IS 'ID';
181
- COMMENT ON COLUMN admin.user_cls.code IS 'Код';
182
- COMMENT ON COLUMN admin.user_cls.name IS 'Назва';
183
- COMMENT ON COLUMN admin.user_cls.icon IS 'Іконка';
184
- COMMENT ON COLUMN admin.user_cls.color IS 'Колір';
185
-
186
152
  update admin.users set twofa=false where uid='1';
@@ -1 +1 @@
1
- {"version":3,"file":"getAccess.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/crud/funcs/getAccess.ts"],"names":[],"mappings":"AAsBA;;;;;;;;;GASG;AAEH,wBAA8B,SAAS,CACrC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAS,EAAE,EAAE,GAAG,EAC/B,EAAE,MAAmB,sBAuEtB"}
1
+ {"version":3,"file":"getAccess.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/crud/funcs/getAccess.ts"],"names":[],"mappings":"AAuBA;;;;;;;;;GASG;AAEH,wBAA8B,SAAS,CACrC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAS,EAAE,EAAE,GAAG,EAC/B,EAAE,MAAmB,sBAwFtB"}
@@ -1,4 +1,5 @@
1
1
  import pgClients from "../../pg/pgClients.js";
2
+ import getMeta from "../../pg/funcs/getMeta.js";
2
3
  import getTemplate from "../../table/funcs/getTemplate.js";
3
4
  import applyHook from "../../hook/applyHook.js";
4
5
  const allActions = ["view", "edit", "add", "del"];
@@ -54,10 +55,21 @@ export default async function getAccess({ table, form, user = {} }, pg = pgClien
54
55
  return { actions: tableActions, query: "1=1" };
55
56
  }
56
57
  if (body?.access === "user" && uid) {
57
- return { actions: tableActions, query: "1=1" };
58
+ // subquery handled by template
59
+ if (body?.query?.includes?.("{{uid}}")) {
60
+ return { actions: tableActions, query: "1=1" };
61
+ }
62
+ const authorColumn = await getMeta({
63
+ pg,
64
+ table: body?.table || table,
65
+ }).then((el) => el?.columns?.find((col) => ["uid", "created_by"].includes(col.name))?.name);
66
+ if (!authorColumn) {
67
+ return { actions: [], query: "false" };
68
+ }
69
+ return { actions: tableActions, query: `${authorColumn}='${uid}'` };
58
70
  }
59
71
  if (!uid) {
60
- return { actions: [], query: "1=1" };
72
+ return { actions: [], query: "false" };
61
73
  }
62
74
  const userAccess = pg?.pk?.["admin.routes"] &&
63
75
  pg.pk?.["admin.role_access"] &&
@@ -1 +1 @@
1
- {"version":3,"file":"exec.sql.d.ts","sourceRoot":"","sources":["../../../../server/plugins/migration/exec.sql.ts"],"names":[],"mappings":"AAcA,wBAA8B,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,MAAmB,gBAqDzE"}
1
+ {"version":3,"file":"exec.sql.d.ts","sourceRoot":"","sources":["../../../../server/plugins/migration/exec.sql.ts"],"names":[],"mappings":"AAcA,wBAA8B,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,MAAmB,gBA0DzE"}
@@ -28,7 +28,10 @@ export default async function execSql(filepath, pg = pgClients.client) {
28
28
  .hgetall(`${pg?.options?.database}:migration-hashes`)
29
29
  .then((obj) => Object.keys(obj))
30
30
  : [];
31
- if (hashes.includes(hash) && !config.disableCache && debug) {
31
+ if (hashes.includes(hash) &&
32
+ !config.disableCache &&
33
+ !process.env.MIGRATE &&
34
+ debug) {
32
35
  console.log(filename, "skip equal hash", Date.now() - start);
33
36
  return null;
34
37
  }
@@ -1,9 +1,41 @@
1
+ export declare function addCustomCls({ name, description, alias, table, uid, data, }: {
2
+ name: string;
3
+ description?: string;
4
+ alias?: string[];
5
+ table: string;
6
+ uid: string;
7
+ data: {
8
+ id?: string | number;
9
+ text: string;
10
+ description?: string;
11
+ color?: string;
12
+ icon?: string;
13
+ active?: boolean;
14
+ }[];
15
+ }, pg?: any): Promise<string>;
1
16
  export declare function deleteUserCls(name: string, pg?: any): Promise<string>;
2
- export declare function addUserCls(name: string, options: string | Record<string, any>[], pg?: any): Promise<string>;
3
- export declare function editUserCls(name: string, options: string | Record<string, any>[], pg?: any): Promise<string>;
17
+ export declare function addUserCls({ name, alias, data, description, }: {
18
+ name: string;
19
+ alias?: string[];
20
+ description?: string;
21
+ data: string | Record<string, any>[];
22
+ }, pg?: any): Promise<string>;
23
+ export declare function editUserCls({ name, alias, description, data, }: {
24
+ name: string;
25
+ description?: string;
26
+ alias?: string[];
27
+ data: string | Record<string, any>[];
28
+ }, pg?: any): Promise<string>;
29
+ export declare function getUserClsList({ name, search, sql }: {
30
+ name?: string;
31
+ search?: string;
32
+ sql?: any;
33
+ }, pg?: any): Promise<any>;
4
34
  export declare function getUserCls(name: string, pg?: any): Promise<{
5
35
  type: any;
6
36
  data: any;
37
+ description: any;
38
+ alias: any;
7
39
  } | null>;
8
40
  declare const _default: null;
9
41
  export default _default;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/plugins/usercls/index.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAmB,mBAUtE;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EACvC,EAAE,MAAmB,mBAkDtB;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,EACvC,EAAE,MAAmB,mBAKtB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAmB;;;UAoBnE;;AAED,wBAAoB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/plugins/usercls/index.ts"],"names":[],"mappings":"AAMA,wBAAsB,YAAY,CAChC,EACE,IAAI,EACJ,WAAW,EACX,KAAK,EACL,KAAK,EACL,GAAG,EACH,IAAS,GACV,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE;QACJ,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,EAAE,CAAC;CACL,EACD,EAAE,MAAmB,mBA8EtB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAmB,mBAUtE;AAED,wBAAsB,UAAU,CAC9B,EACE,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,WAAW,GACZ,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;CACtC,EACD,EAAE,MAAmB,mBAkDtB;AAED,wBAAsB,WAAW,CAC/B,EACE,IAAI,EACJ,KAAK,EACL,WAAW,EACX,IAAI,GACL,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;CACtC,EACD,EAAE,MAAmB,mBAKtB;AAED,wBAAsB,cAAc,CAClC,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,GAAG,CAAA;CAAE,EACpE,EAAE,MAAmB,gBA+BtB;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAmB;;;;;UAsBnE;;AAED,wBAAoB"}
@@ -1,6 +1,67 @@
1
1
  import { NotFoundError } from "../../types/errors.js";
2
2
  import pgClients from "../pg/pgClients.js";
3
3
  import dataInsert from "../crud/funcs/dataInsert.js";
4
+ import dataUpdate from "../crud/funcs/dataUpdate.js";
5
+ export async function addCustomCls({ name, description, alias, table, uid, data = [], }, pg = pgClients.client) {
6
+ if (!table || !pg.pk?.[table]) {
7
+ throw new Error("custom cls table not exists");
8
+ }
9
+ const codes = await pg
10
+ .query(`select array_agg(code) from ${table}`)
11
+ .then((el) => el.rows?.[0]?.array_agg || []);
12
+ const ids = await pg
13
+ .query(`select json_object_agg(code, id) from ${table}`)
14
+ .then((el) => el.rows?.[0]?.json_object_agg || {});
15
+ const client = await pg.connect();
16
+ try {
17
+ await client.query("BEGIN");
18
+ // overwrite old if exists
19
+ await client.query("delete from admin.user_cls where name=$1", [name]);
20
+ // disable old
21
+ await client.query(`update ${table} set active=case when code=any($1) then true else false end`, [data.map((el) => el.id)]);
22
+ // insert new
23
+ await Promise.all(data
24
+ .filter((el) => el.id && !codes.includes(el.id))
25
+ .map(async (el) => dataInsert({
26
+ pg: client,
27
+ table,
28
+ data: { ...el, code: el.id, name: el.text, id: undefined },
29
+ uid,
30
+ })));
31
+ // update existing
32
+ await Promise.all(data
33
+ .filter((el) => el.id && codes.includes(el.id) && ids[el.id])
34
+ .map(async (el) => dataUpdate({
35
+ pg: client,
36
+ id: ids[el.id],
37
+ table,
38
+ data: { ...el, code: el.id, name: el.text, id: ids[el.id] },
39
+ uid,
40
+ })));
41
+ await dataInsert({
42
+ pg: client,
43
+ table: "admin.user_cls",
44
+ id: table,
45
+ data: {
46
+ name,
47
+ alias,
48
+ description,
49
+ code: "custom",
50
+ type: "sql",
51
+ data: `select code, name, description, color, icon from ${table} where active`,
52
+ },
53
+ });
54
+ await client.query("COMMIT");
55
+ return "ok";
56
+ }
57
+ catch (err) {
58
+ await client.query("ROLLBACK");
59
+ throw err;
60
+ }
61
+ finally {
62
+ client.release();
63
+ }
64
+ }
4
65
  export async function deleteUserCls(name, pg = pgClients.client) {
5
66
  const exists = await getUserCls(name, pg);
6
67
  if (!exists) {
@@ -9,15 +70,15 @@ export async function deleteUserCls(name, pg = pgClients.client) {
9
70
  await pg.query("delete from admin.user_cls where (name=$1 and parent is null) or parent=$1 ", [name]);
10
71
  return "ok";
11
72
  }
12
- export async function addUserCls(name, options, pg = pgClients.client) {
13
- const type = typeof options === "string" ? "sql" : "json";
14
- if (type === "json" && !Array.isArray(options)) {
15
- throw new Error("options must be an array");
73
+ export async function addUserCls({ name, alias, data, description, }, pg = pgClients.client) {
74
+ const type = typeof data === "string" ? "sql" : "json";
75
+ if (type === "json" && !Array.isArray(data)) {
76
+ throw new Error("param data must be an array");
16
77
  }
17
78
  if (type === "json" &&
18
- typeof options === "object" &&
19
- !options.find((item) => item.id && item.text)) {
20
- throw new Error("options must have items");
79
+ typeof data === "object" &&
80
+ !data.find((item) => item.id && item.text)) {
81
+ throw new Error("param data must have items");
21
82
  }
22
83
  const client = await pg.connect();
23
84
  try {
@@ -26,16 +87,16 @@ export async function addUserCls(name, options, pg = pgClients.client) {
26
87
  await dataInsert({
27
88
  pg: client,
28
89
  table: "admin.user_cls",
29
- data: { name, type, data: options },
90
+ data: { name, alias, description, type, data },
30
91
  });
31
92
  }
32
- else if (type === "json" && Array.isArray(options)) {
93
+ else if (type === "json" && Array.isArray(data)) {
33
94
  await dataInsert({
34
95
  pg: client,
35
96
  table: "admin.user_cls",
36
- data: { name, type },
97
+ data: { name, alias, description, type },
37
98
  });
38
- await Promise.all(options.map(async (item) => {
99
+ await Promise.all(data.map(async (item) => {
39
100
  await dataInsert({
40
101
  pg: client,
41
102
  table: "admin.user_cls",
@@ -54,23 +115,47 @@ export async function addUserCls(name, options, pg = pgClients.client) {
54
115
  client.release();
55
116
  }
56
117
  }
57
- export async function editUserCls(name, options, pg = pgClients.client) {
118
+ export async function editUserCls({ name, alias, description, data, }, pg = pgClients.client) {
58
119
  await deleteUserCls(name, pg);
59
- await addUserCls(name, options, pg);
120
+ await addUserCls({ name, alias, description, data }, pg);
60
121
  return "ok";
61
122
  }
123
+ export async function getUserClsList({ name, search, sql }, pg = pgClients.client) {
124
+ const args = [];
125
+ const where = Object.entries({ name, search })
126
+ .filter((el) => el[1])
127
+ .reduce((acc, curr, idx) => {
128
+ args.push(curr[0] === "name" ? curr[1]?.split(",") : curr[1]);
129
+ return [
130
+ acc,
131
+ {
132
+ name: `name=any($${idx + 1}::text[])`,
133
+ search: `name in (select parent from admin.user_cls where name ilike '%'||$${idx + 1}||'%')`,
134
+ }[curr[0]],
135
+ ]
136
+ .filter(Boolean)
137
+ .join(" and ");
138
+ }, "1=1");
139
+ const q = `select name, type, description, alias, (select count(*) filter(where ${search
140
+ ? `name ilike '%'||$${where.match(/\$\d/g)?.length || 0}||'%'`
141
+ : "true"}) from admin.user_cls where parent=t.name) as count from admin.user_cls t where parent is null and ${where}`;
142
+ if (sql)
143
+ return q;
144
+ const rows = await pg.query(q, args).then((el) => el.rows || []);
145
+ return rows;
146
+ }
62
147
  export async function getUserCls(name, pg = pgClients.client) {
63
- const { type, data } = await pg
64
- .query("select type, data from admin.user_cls where parent is null and name=$1", [name])
148
+ const { type, data, description, alias } = await pg
149
+ .query("select type, data, description, alias from admin.user_cls where parent is null and name=$1", [name])
65
150
  .then((el) => el.rows?.[0] || {});
66
151
  if (type === "sql") {
67
- return { type, data };
152
+ return { type, data, description, alias };
68
153
  }
69
154
  if (type === "json") {
70
155
  const options = await pg
71
156
  .query(`select json_agg(json_build_object('id', code, 'text', name, 'icon', icon, 'color', color)) from admin.user_cls where parent=$1`, [name])
72
157
  .then((el) => el.rows?.[0]?.json_agg || []);
73
- return { type, data: options };
158
+ return { type, data: options, description, alias };
74
159
  }
75
160
  return null;
76
161
  }
@@ -1 +1 @@
1
- {"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../../../../server/routes/table/controllers/suggest.ts"],"names":[],"mappings":"AA+DA,wBAA8B,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,gBAqXzD"}
1
+ {"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../../../../server/routes/table/controllers/suggest.ts"],"names":[],"mappings":"AAmEA,wBAA8B,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,gBAsWzD"}
@@ -1,17 +1,21 @@
1
1
  import path from "node:path";
2
2
  import { existsSync, readFileSync } from "node:fs";
3
- import { config, getPG, getTemplate, getSelectMeta, getMeta, applyHook, getSelectVal, logger, getSelect, metaFormat, getColumnCLS, } from "../../../../utils.js";
3
+ import { config, getPGAsync, getTemplate, getSelectMeta, getMeta, applyHook, getSelectVal, logger, getSelect, metaFormat, getColumnCLS, pgClients, } from "../../../../utils.js";
4
4
  const defaultLimit = 50;
5
- async function getTableColumnMeta({ table, column, filtered, startsWith, key, pg, }) {
5
+ async function getTableColumnMeta({ table, template, column, selectName, filtered, startsWith, key, pg = pgClients.client, }) {
6
6
  if (!table || !column) {
7
7
  return null;
8
8
  }
9
- const loadTable = await getTemplate("table", table);
10
- const { data: clsName } = loadTable?.columns?.find?.((el) => el.name === column) || {};
11
- const { arr } = (await getSelect(clsName, pg)) || {};
9
+ const { columns, table: tableName } = template
10
+ ? await getTemplate("table", template)
11
+ : { table, columns: [] };
12
+ const { data: clsName } = selectName
13
+ ? { data: selectName }
14
+ : columns.find((el) => el.name === column) || {};
15
+ const { arr } = (await getSelect(clsName || column, pg)) || {};
12
16
  const original = filtered
13
- ? `with c(id,text) as (select ${column} as id, ${column} as text from ${loadTable?.table || table} group by ${column}) select id, text from c`
14
- : `with c(id,text) as (select ${column} as id, ${column} as text, count(*) from ${loadTable?.table || table} group by ${column} limit ${defaultLimit}) select * from c`;
17
+ ? `with c(id,text) as (select ${column} as id, ${column} as text from ${tableName} group by ${column}) select id, text from c`
18
+ : `with c(id,text) as (select ${column} as id, ${column} as text, count(*) from ${tableName} group by ${column} limit ${defaultLimit}) select * from c`;
15
19
  return {
16
20
  arr,
17
21
  original,
@@ -22,10 +26,13 @@ async function getTableColumnMeta({ table, column, filtered, startsWith, key, pg
22
26
  };
23
27
  }
24
28
  export default async function suggest(req, reply) {
25
- const { params, query, pg: pg1, user } = req;
26
- const lang = query.lang || "ua";
27
29
  const time = Date.now();
28
- const parent = query.parent || "";
30
+ const { params, user, query = {}, pg: pg1 = pgClients.client } = req;
31
+ const { lang = "ua", parent = "" } = query;
32
+ const debugMode = config.local ||
33
+ user?.user_type?.includes?.("admin") ||
34
+ process.env.NODE_ENV === "test" ||
35
+ process.env.VITEST;
29
36
  if (params?.data && params.data?.startsWith?.("hash-")) {
30
37
  const filepath = path.join(process.cwd(), `/log/suggest/${params.data.replace("hash-", "")}.json`);
31
38
  if (existsSync(filepath)) {
@@ -33,40 +40,26 @@ export default async function suggest(req, reply) {
33
40
  params.data = `${table}:${column}`;
34
41
  }
35
42
  }
36
- const [table, column] = params.data?.includes(":")
43
+ const [table1, column1] = params.data?.includes(":")
37
44
  ? params.data.split(":")
38
45
  : [query.token, query.column];
39
46
  const selectName = query.sel || params.data;
47
+ const table = table1 || query.token;
48
+ const column = column1 || query.column;
40
49
  if (!selectName) {
41
50
  return reply.status(400).send({
42
51
  error: "name is required",
43
52
  code: 400,
44
53
  });
45
54
  }
46
- const { body: hookBody } = table || query.token
55
+ const { body: hookBody } = table
47
56
  ? (await applyHook("preSuggest", {
48
57
  pg: pg1,
49
- table: table || query.token,
58
+ table,
50
59
  })) || {}
51
60
  : {};
52
- const body = await getTemplate("table", table || query.token);
53
- const tableName = hookBody?.table || body?.table || table || query.token;
54
- if (table && !pg1.pk?.[tableName]) {
55
- return reply.status(400).send({
56
- error: "param name is invalid: 1",
57
- code: 400,
58
- });
59
- }
60
- const tableMeta = await getMeta({ pg: pg1, table: tableName });
61
- const columnExists = (hookBody?.columns ||
62
- body?.columns ||
63
- tableMeta?.columns)?.find((col) => col?.name === (column || query.column));
64
- if (table && (!column || !columnExists)) {
65
- return reply.status(400).send({
66
- error: "param name is invalid: 2",
67
- code: 400,
68
- });
69
- }
61
+ const body = await getTemplate("table", table);
62
+ const tableName = hookBody?.table || body?.table || table;
70
63
  if (query.limit && query.limit < 0) {
71
64
  return reply.status(400).send({
72
65
  error: "param limit is invalid",
@@ -75,20 +68,20 @@ export default async function suggest(req, reply) {
75
68
  }
76
69
  const meta = tableName && column
77
70
  ? await getTableColumnMeta({
78
- table,
71
+ table: tableName,
72
+ template: tableName && table && tableName !== table ? table : undefined,
79
73
  column,
80
- filtered: query?.key || query?.val,
74
+ selectName,
75
+ filtered: query.key || query.val,
81
76
  startsWith: !!query.start,
82
77
  key: query.key,
83
- pg: pg1,
84
78
  })
85
79
  : await getSelectMeta({
86
80
  name: selectName,
87
- nocache: query?.nocache,
81
+ nocache: query.nocache,
88
82
  startsWith: !!query.start,
89
83
  key: query.key,
90
84
  parent,
91
- pg: pg1,
92
85
  });
93
86
  if (meta?.minLength && query.key && query.key.length < meta?.minLength) {
94
87
  return reply.status(400).send({
@@ -97,7 +90,32 @@ export default async function suggest(req, reply) {
97
90
  });
98
91
  }
99
92
  const limit = meta?.limit || defaultLimit;
100
- const pg = meta?.db ? getPG(meta.db) : pg1;
93
+ const pg = meta?.db ? await getPGAsync(meta.db) : pg1;
94
+ if (!pg || !pg.pk || !pg.pgType) {
95
+ return reply.status(400).send({
96
+ error: "pg connection not established",
97
+ code: 400,
98
+ });
99
+ }
100
+ if (table && !pg?.pk?.[tableName]) {
101
+ return reply.status(400).send({
102
+ error: "param name is invalid: 1",
103
+ code: 400,
104
+ });
105
+ }
106
+ const columns = hookBody?.columns || body?.columns
107
+ ? hookBody?.columns || body?.columns
108
+ : await getMeta({
109
+ pg,
110
+ table: tableName,
111
+ }).then((el) => el?.columns || []);
112
+ const { name: columnName, dataTypeID } = (columns || []).find((col) => col?.name === column) || {};
113
+ if (table && (!column || !columnName)) {
114
+ return reply.status(400).send({
115
+ error: "param name is invalid: 2",
116
+ code: 400,
117
+ });
118
+ }
101
119
  if (!meta) {
102
120
  return reply.status(404).send({
103
121
  error: "Not found query select",
@@ -108,28 +126,19 @@ export default async function suggest(req, reply) {
108
126
  return meta;
109
127
  }
110
128
  const { arr, searchQuery } = meta;
111
- if (arr && query.token && query.column) {
112
- const loadTable = await getTemplate("table", query.token);
113
- const { columns = [] } = await getMeta({
114
- pg,
115
- table: loadTable?.table || tableName,
116
- });
117
- const column1 = columns.find((el) => el.name === query.column);
118
- const args = { table: tableName };
119
- if (!column1)
120
- return [];
129
+ if (arr && table && column) {
121
130
  const sqlCls = query.count
122
- ? `select value, count(*) from (select ${pg.pgType?.[column1.dataTypeID]?.includes("[]")
123
- ? `unnest(${column1.name})`
124
- : `${column1.name}`} as value from ${(loadTable?.table || tableName).replace(/'/g, "''")} where ${hookBody?.query || loadTable?.query || "1=1"})q group by value`
125
- : `select array_agg(distinct value)::text[] from (select ${pg.pgType?.[column1.dataTypeID]?.includes("[]")
126
- ? `unnest(${column1.name})`
127
- : `${column1.name}`} as value from ${(loadTable?.table || tableName).replace(/'/g, "''")} where ${hookBody?.query || loadTable?.query || "1=1"})q`;
128
- if (query.sql && (config.local || user?.user_type?.includes?.("admin"))) {
131
+ ? `select value, count(*) from (select ${pg.pgType?.[dataTypeID]?.includes("[]")
132
+ ? `unnest(${columnName})`
133
+ : `${columnName}`} as value from ${tableName.replace(/'/g, "''")} where ${hookBody?.query || body?.query || "1=1"})q group by value`
134
+ : `select array_agg(distinct value)::text[] from (select ${pg.pgType?.[dataTypeID]?.includes("[]")
135
+ ? `unnest(${columnName})`
136
+ : `${columnName}`} as value from ${tableName.replace(/'/g, "''")} where ${hookBody?.query || body?.query || "1=1"})q`;
137
+ if (query.sql && debugMode) {
129
138
  return sqlCls;
130
139
  }
131
- if (pg.pk?.[loadTable?.table || tableName] && column1?.name) {
132
- const qRes = await pg.queryCache(sqlCls, args);
140
+ if (tableName && pg?.pk?.[tableName] && columnName) {
141
+ const qRes = await pg.queryCache(sqlCls, { table: tableName });
133
142
  const vals = (query.count
134
143
  ? qRes.rows?.map?.((el) => el.value?.toString?.())
135
144
  : qRes.rows?.[0]?.array_agg) || [];
@@ -152,9 +161,9 @@ export default async function suggest(req, reply) {
152
161
  if (config.debug) {
153
162
  logger.file("suggest/debug", {
154
163
  type: 1,
155
- loadTable: loadTable?.table,
164
+ table,
156
165
  tableName,
157
- column: column?.name,
166
+ column: columnName,
158
167
  data,
159
168
  data1,
160
169
  data2,
@@ -167,9 +176,7 @@ export default async function suggest(req, reply) {
167
176
  count: data.length,
168
177
  total: arr.length,
169
178
  mode: "array",
170
- sql: config.local || user?.user_type?.includes?.("admin")
171
- ? sqlCls
172
- : undefined,
179
+ sql: debugMode ? sqlCls : undefined,
173
180
  data,
174
181
  };
175
182
  }
@@ -211,22 +218,13 @@ export default async function suggest(req, reply) {
211
218
  const where = [search, val, meta.pk ? `${meta.pk} is not null` : null]
212
219
  .filter(Boolean)
213
220
  .join(" and ") || "true";
214
- const loadTable = await getTemplate("table", query.token);
215
- const tableName1 = hookBody?.table || loadTable?.table || query.token;
216
- const { columns = [] } = await getMeta({ pg: pg1, table: tableName1 });
217
- const { name: filterColumn, dataTypeID } = query.column
218
- ? columns.find((el) => el.name === query.column) || {}
219
- : {};
220
- const filter = query.token &&
221
- pg.pk?.[loadTable?.table || query.token] &&
222
- filterColumn &&
223
- dataTypeID
221
+ const filter = table && pg.pk?.[table] && columnName && dataTypeID
224
222
  ? `id in (select ${pg.pgType[dataTypeID]?.includes("[]")
225
- ? `unnest(${filterColumn})`
226
- : filterColumn} from ${(loadTable?.table || query.token).replace(/'/g, "''")})`
223
+ ? `unnest(${columnName})`
224
+ : columnName} from ${table.replace(/'/g, "''")})`
227
225
  : "true";
228
226
  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");
229
- if (query.sql && (config.local || user?.user_type?.includes?.("admin"))) {
227
+ if (query.sql && debugMode) {
230
228
  return sqlSuggest;
231
229
  }
232
230
  // query
@@ -248,9 +246,7 @@ export default async function suggest(req, reply) {
248
246
  total: meta.count - 0,
249
247
  mode: type === "cls" ? "array" : "sql",
250
248
  db: meta.db,
251
- sql: config.local || user?.user_type?.includes?.("admin")
252
- ? sqlSuggest
253
- : undefined,
249
+ sql: debugMode ? sqlSuggest : undefined,
254
250
  data: data.map((el) => ({
255
251
  count: el.count,
256
252
  id: el.id,
@@ -284,9 +280,7 @@ export default async function suggest(req, reply) {
284
280
  total: meta.count - 0,
285
281
  mode: "sql",
286
282
  db: meta.db,
287
- sql: config.local || user?.user_type?.includes?.("admin")
288
- ? sqlSuggest
289
- : undefined,
283
+ sql: debugMode ? sqlSuggest : undefined,
290
284
  data,
291
285
  };
292
286
  return message;
@@ -0,0 +1,2 @@
1
+ export default function addUserClsApi({ pg, body, user }: any, reply: any): Promise<any>;
2
+ //# sourceMappingURL=addUserCls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addUserCls.d.ts","sourceRoot":"","sources":["../../../../../server/routes/usercls/controllers/addUserCls.ts"],"names":[],"mappings":"AAUA,wBAA8B,aAAa,CACzC,EAAE,EAAqB,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,EAC1C,KAAK,EAAE,GAAG,gBAqCX"}
@@ -0,0 +1,31 @@
1
+ import pgClients from "../../../plugins/pg/pgClients.js";
2
+ import getSelectMeta from "../../../plugins/table/funcs/getSelectMeta.js";
3
+ import { addUserCls, addCustomCls, editUserCls, getUserCls, } from "../../../plugins/usercls/index.js";
4
+ export default async function addUserClsApi({ pg = pgClients.client, body, user }, reply) {
5
+ const { name, description, alias, data, table } = body;
6
+ const t1 = Date.now();
7
+ if (!user?.uid) {
8
+ return reply.status(401).send({ error: "unauthorized", code: 401 });
9
+ }
10
+ if (table) {
11
+ await addCustomCls({ name, description, alias, table, uid: user.uid, data }, pg);
12
+ return reply
13
+ .status(200)
14
+ .send({ time: Date.now() - t1, name, type: "custom" });
15
+ }
16
+ const exists = await getUserCls(name, pg);
17
+ if (exists) {
18
+ await editUserCls({ name, description, alias, data }, pg);
19
+ }
20
+ else {
21
+ await addUserCls({ name, description, alias, data }, pg);
22
+ }
23
+ // refresh metadata to avoid suggest API cache
24
+ await getSelectMeta({
25
+ pg,
26
+ name,
27
+ nocache: 1,
28
+ });
29
+ const result = await getUserCls(name, pg);
30
+ return reply.status(200).send({ time: Date.now() - t1, name, ...result });
31
+ }
@@ -0,0 +1,2 @@
1
+ export default function deleteUserClsApi({ pg, params, user }: any, reply: any): Promise<any>;
2
+ //# sourceMappingURL=deleteUserCls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deleteUserCls.d.ts","sourceRoot":"","sources":["../../../../../server/routes/usercls/controllers/deleteUserCls.ts"],"names":[],"mappings":"AAIA,wBAA8B,gBAAgB,CAC5C,EAAE,EAAqB,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAC5C,KAAK,EAAE,GAAG,gBAkBX"}
@@ -0,0 +1,17 @@
1
+ import pgClients from "../../../plugins/pg/pgClients.js";
2
+ import getSelectMeta from "../../../plugins/table/funcs/getSelectMeta.js";
3
+ import { deleteUserCls } from "../../../plugins/usercls/index.js";
4
+ export default async function deleteUserClsApi({ pg = pgClients.client, params, user }, reply) {
5
+ const { name } = params;
6
+ const t1 = Date.now();
7
+ if (!user?.uid) {
8
+ return reply.status(401).send({ error: "unauthorized", code: 401 });
9
+ }
10
+ await getSelectMeta({
11
+ pg,
12
+ name,
13
+ nocache: 1,
14
+ });
15
+ await deleteUserCls(name, pg);
16
+ return reply.status(200).send({ time: Date.now() - t1, name });
17
+ }
@@ -0,0 +1,2 @@
1
+ export default function editUserClsApi({ pg, body, params, user }: any, reply: any): Promise<any>;
2
+ //# sourceMappingURL=editUserCls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editUserCls.d.ts","sourceRoot":"","sources":["../../../../../server/routes/usercls/controllers/editUserCls.ts"],"names":[],"mappings":"AAWA,wBAA8B,cAAc,CAC1C,EAAE,EAAqB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,GAAG,EAClD,KAAK,EAAE,GAAG,gBAmCX"}
@@ -0,0 +1,32 @@
1
+ import pgClients from "../../../plugins/pg/pgClients.js";
2
+ import getSelectMeta from "../../../plugins/table/funcs/getSelectMeta.js";
3
+ import { addUserCls, addCustomCls, editUserCls, getUserCls, } from "../../../plugins/usercls/index.js";
4
+ export default async function editUserClsApi({ pg = pgClients.client, body, params, user }, reply) {
5
+ const { name } = params;
6
+ const { data, table } = body;
7
+ const t1 = Date.now();
8
+ if (!user?.uid) {
9
+ return reply.status(401).send({ error: "unauthorized", code: 401 });
10
+ }
11
+ if (table) {
12
+ await addCustomCls({ name, data, table, uid: user.uid }, pg);
13
+ return reply
14
+ .status(200)
15
+ .send({ time: Date.now() - t1, name, type: "custom" });
16
+ }
17
+ const exists = await getUserCls(name, pg);
18
+ if (exists) {
19
+ await editUserCls({ name, data }, pg);
20
+ }
21
+ else {
22
+ await addUserCls({ name, data }, pg);
23
+ }
24
+ // refresh metadata to avoid suggest API cache
25
+ const test = await getSelectMeta({
26
+ pg,
27
+ name,
28
+ nocache: 1,
29
+ });
30
+ const result = await getUserCls(name, pg);
31
+ return reply.status(200).send({ time: Date.now() - t1, name, ...result });
32
+ }
@@ -0,0 +1,2 @@
1
+ export default function getUserClsListApi({ query, user, pg }: any, reply: any): Promise<any>;
2
+ //# sourceMappingURL=getUserCls.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getUserCls.d.ts","sourceRoot":"","sources":["../../../../../server/routes/usercls/controllers/getUserCls.ts"],"names":[],"mappings":"AAKA,wBAA8B,iBAAiB,CAC7C,EAAE,KAAK,EAAE,IAAI,EAAE,EAAqB,EAAE,EAAE,GAAG,EAC3C,KAAK,EAAE,GAAG,gBAgBX"}
@@ -0,0 +1,12 @@
1
+ import pgClients from "../../../plugins/pg/pgClients.js";
2
+ import { getUserClsList } from "../../../plugins/usercls/index.js";
3
+ export default async function getUserClsListApi({ query, user, pg = pgClients.client }, reply) {
4
+ if (!user?.uid) {
5
+ return reply.status(401).send({ error: "unauthorized", code: 401 });
6
+ }
7
+ const t1 = Date.now();
8
+ const result = await getUserClsList({ name: query.name, search: query.search, sql: query.sql }, pg);
9
+ if (query.sql)
10
+ return result;
11
+ return { time: Date.now() - t1, data: result };
12
+ }
@@ -0,0 +1,2 @@
1
+ export default function plugin(app: any): void;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/routes/usercls/index.ts"],"names":[],"mappings":"AAgCA,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,GAAG,EAAE,GAAG,QAqCtC"}
@@ -0,0 +1,51 @@
1
+ const userClsParamsSchema = {
2
+ type: "object",
3
+ properties: {
4
+ name: { type: "string" },
5
+ },
6
+ required: ["name"],
7
+ };
8
+ const addUserClsBodySchema = {
9
+ type: "object",
10
+ properties: {
11
+ name: { type: "string" },
12
+ data: {},
13
+ table: { type: "string" },
14
+ },
15
+ required: ["name", "data"],
16
+ };
17
+ const editUserClsBodySchema = {
18
+ type: "object",
19
+ properties: {
20
+ data: {},
21
+ table: { type: "string" },
22
+ },
23
+ required: ["data"],
24
+ };
25
+ import getUserCls from "./controllers/getUserCls.js";
26
+ import addUserCls from "./controllers/addUserCls.js";
27
+ import editUserCls from "./controllers/editUserCls.js";
28
+ import deleteUserCls from "./controllers/deleteUserCls.js";
29
+ export default function plugin(app) {
30
+ if (!app.hasRoute({ method: "GET", url: "/api/user-cls" })) {
31
+ app.get("/user-cls", { config: { policy: "L1" } }, getUserCls);
32
+ }
33
+ if (!app.hasRoute({ method: "POST", url: "/api/user-cls" })) {
34
+ app.post("/user-cls", {
35
+ config: { policy: "L1" },
36
+ schema: { body: addUserClsBodySchema },
37
+ }, addUserCls);
38
+ }
39
+ if (!app.hasRoute({ method: "PUT", url: "/api/user-cls/:name" })) {
40
+ app.put("/user-cls/:name", {
41
+ config: { policy: "L1" },
42
+ schema: {
43
+ params: userClsParamsSchema,
44
+ body: editUserClsBodySchema,
45
+ },
46
+ }, editUserCls);
47
+ }
48
+ if (!app.hasRoute({ method: "DELETE", url: "/api/user-cls/:name" })) {
49
+ app.delete("/user-cls/:name", { config: { policy: "L1" }, schema: { params: userClsParamsSchema } }, deleteUserCls);
50
+ }
51
+ }
@@ -1,14 +1,18 @@
1
1
  import { beforeEach, afterEach, afterAll } from "vitest";
2
2
  import { build, teardown } from "./helper.js";
3
3
  beforeEach(async () => {
4
- console.log("build after each bun test start...");
4
+ if (process.env.trace === "true")
5
+ console.log("build after each bun test start...");
5
6
  await build();
6
- console.log("build after each bun test finished");
7
+ if (process.env.trace === "true")
8
+ console.log("build after each bun test finished");
7
9
  });
8
10
  afterEach(async () => {
9
- console.log("teardown after each bun test start...");
11
+ if (process.env.trace === "true")
12
+ console.log("teardown after each bun test start...");
10
13
  // await teardown();
11
- console.log("teardown after each bun test finished");
14
+ if (process.env.trace === "true")
15
+ console.log("teardown after each bun test finished");
12
16
  });
13
17
  afterAll(async () => {
14
18
  console.log("teardown after all bun test start...");
package/dist/utils.d.ts CHANGED
@@ -79,7 +79,7 @@ export { default as jsonToXls } from "./server/routes/file/controllers/utils/jso
79
79
  export { default as getAdminAccess } from "./server/plugins/access/funcs/getAdminAccess.js";
80
80
  export { default as sendNotification } from "./server/plugins/auth/funcs/sendNotification.js";
81
81
  export { default as addUserNotification } from "./server/plugins/notifications/addNotification.js";
82
- export { addUserCls, editUserCls, deleteUserCls, getUserCls, } from "./server/plugins/usercls/index.js";
82
+ export { addUserCls, editUserCls, deleteUserCls, getUserCls, getUserClsList, } from "./server/plugins/usercls/index.js";
83
83
  export { prefix as uploadChunkApiPrefix, fileDir as uploadChunkFileDir, uploadChunkDirectory, } from "./server/plugins/upload/index.js";
84
84
  export { default as getUploadStatus } from "./server/plugins/upload/getUploadStatus.js";
85
85
  export { default as startUpload } from "./server/plugins/upload/startUpload.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
@@ -96,7 +96,7 @@ export { default as jsonToXls } from "./server/routes/file/controllers/utils/jso
96
96
  export { default as getAdminAccess } from "./server/plugins/access/funcs/getAdminAccess.js";
97
97
  export { default as sendNotification } from "./server/plugins/auth/funcs/sendNotification.js"; // email
98
98
  export { default as addUserNotification } from "./server/plugins/notifications/addNotification.js"; // popup, widget, interface etc.
99
- export { addUserCls, editUserCls, deleteUserCls, getUserCls, } from "./server/plugins/usercls/index.js";
99
+ export { addUserCls, editUserCls, deleteUserCls, getUserCls, getUserClsList, } from "./server/plugins/usercls/index.js";
100
100
  export { prefix as uploadChunkApiPrefix, fileDir as uploadChunkFileDir, uploadChunkDirectory, } from "./server/plugins/upload/index.js";
101
101
  export { default as getUploadStatus } from "./server/plugins/upload/getUploadStatus.js";
102
102
  export { default as startUpload } from "./server/plugins/upload/startUpload.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengis/fastify-table",
3
- "version": "2.0.118",
3
+ "version": "2.0.120",
4
4
  "type": "module",
5
5
  "description": "core-plugins",
6
6
  "keywords": [