@opengis/fastify-table 2.0.119 → 2.0.121

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 (40) hide show
  1. package/dist/config.js +1 -1
  2. package/dist/helper.d.ts +1 -1
  3. package/dist/helper.d.ts.map +1 -1
  4. package/dist/helper.js +3 -5
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +2 -0
  7. package/dist/script/dump.js +1 -1
  8. package/dist/script/dump.ts +1 -1
  9. package/dist/server/migrations/cls.sql +36 -0
  10. package/dist/server/migrations/users.sql +1 -35
  11. package/dist/server/plugins/crud/funcs/getAccess.d.ts.map +1 -1
  12. package/dist/server/plugins/crud/funcs/getAccess.js +14 -2
  13. package/dist/server/plugins/logger/createFileStream.d.ts.map +1 -1
  14. package/dist/server/plugins/migration/exec.sql.d.ts.map +1 -1
  15. package/dist/server/plugins/migration/exec.sql.js +4 -1
  16. package/dist/server/plugins/table/funcs/getSelectMeta.d.ts.map +1 -1
  17. package/dist/server/plugins/table/funcs/getSelectMeta.js +3 -1
  18. package/dist/server/plugins/usercls/index.d.ts +34 -2
  19. package/dist/server/plugins/usercls/index.d.ts.map +1 -1
  20. package/dist/server/plugins/usercls/index.js +111 -17
  21. package/dist/server/routes/usercls/controllers/addUserCls.d.ts +2 -0
  22. package/dist/server/routes/usercls/controllers/addUserCls.d.ts.map +1 -0
  23. package/dist/server/routes/usercls/controllers/addUserCls.js +31 -0
  24. package/dist/server/routes/usercls/controllers/deleteUserCls.d.ts +2 -0
  25. package/dist/server/routes/usercls/controllers/deleteUserCls.d.ts.map +1 -0
  26. package/dist/server/routes/usercls/controllers/deleteUserCls.js +17 -0
  27. package/dist/server/routes/usercls/controllers/editUserCls.d.ts +2 -0
  28. package/dist/server/routes/usercls/controllers/editUserCls.d.ts.map +1 -0
  29. package/dist/server/routes/usercls/controllers/editUserCls.js +32 -0
  30. package/dist/server/routes/usercls/controllers/getUserCls.d.ts +2 -0
  31. package/dist/server/routes/usercls/controllers/getUserCls.d.ts.map +1 -0
  32. package/dist/server/routes/usercls/controllers/getUserCls.js +13 -0
  33. package/dist/server/routes/usercls/index.d.ts +2 -0
  34. package/dist/server/routes/usercls/index.d.ts.map +1 -0
  35. package/dist/server/routes/usercls/index.js +51 -0
  36. package/dist/test.setup.js +8 -4
  37. package/dist/utils.d.ts +1 -1
  38. package/dist/utils.d.ts.map +1 -1
  39. package/dist/utils.js +1 -1
  40. package/package.json +1 -1
package/dist/config.js CHANGED
@@ -10,7 +10,7 @@ Object.assign(config, {
10
10
  storageList: {},
11
11
  allTemplates: config?.allTemplates || {},
12
12
  env: process.env.NODE_ENV,
13
- port: process.env.PORT,
13
+ port: config.port || process.env.PORT,
14
14
  });
15
15
  if (existsSync(`.env.local`)) {
16
16
  dotenv.config({ path: `.env.local` }); // ! load .env.local
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":"createFileStream.d.ts","sourceRoot":"","sources":["../../../../server/plugins/logger/createFileStream.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,yBAAyB,CAAC;AAoC5C,MAAM,CAAC,OAAO,UAAU,eAAe,iDAoDtC"}
1
+ {"version":3,"file":"createFileStream.d.ts","sourceRoot":"","sources":["../../../../server/plugins/logger/createFileStream.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,yBAAyB,CAAC;AAmC5C,MAAM,CAAC,OAAO,UAAU,eAAe,iDAoDtC"}
@@ -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 +1 @@
1
- {"version":3,"file":"getSelectMeta.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/table/funcs/getSelectMeta.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAWzD,wBAA8B,aAAa,CAAC,EAC1C,IAAI,EACJ,UAAU,EACV,GAAG,EACH,OAAO,EACP,MAAM,EACN,EAAqB,GACtB,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,UAAU,CAAC;CACjB,gBA4GA"}
1
+ {"version":3,"file":"getSelectMeta.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/table/funcs/getSelectMeta.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAWzD,wBAA8B,aAAa,CAAC,EAC1C,IAAI,EACJ,UAAU,EACV,GAAG,EACH,OAAO,EACP,MAAM,EACN,EAAqB,GACtB,EAAE;IACD,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,GAAG,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,EAAE,CAAC,EAAE,UAAU,CAAC;CACjB,gBA8GA"}
@@ -17,7 +17,9 @@ export default async function getSelectMeta({ name, startsWith, key, nocache, pa
17
17
  }
18
18
  const cls = await getSelect(name, pg, nocache);
19
19
  const db = typeof cls?.db === "string" ? { database: cls.db } : cls?.db;
20
- const pg1 = cls?.db ? await getPGAsync(db) : pg;
20
+ const pg1 = cls?.db
21
+ ? await getPGAsync({ database: db, port: cls?.port })
22
+ : pg;
21
23
  if (!cls)
22
24
  return null;
23
25
  if (cls.arr)
@@ -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,gBA8CtB;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,56 @@ 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 true as custom, 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
+
143
+ union all
144
+
145
+ select false as custom, name, type, null as description, null as alias, (select count(*) filter(where ${search
146
+ ? `name ilike '%'||$${where.match(/\$\d/g)?.length || 0}||'%'`
147
+ : "true"}) from admin.cls where parent=t.name) as count from admin.cls t where parent is null and ${where}`;
148
+ if (sql)
149
+ return q;
150
+ const rows1 = await pg.query(q, args).then((el) => el.rows || []);
151
+ const customRows = rows1.filter((row) => row.custom);
152
+ const customClsNames = customRows.map((row) => row.name);
153
+ const rows = customRows.concat(rows1.filter((row) => !customClsNames.includes(row.name)));
154
+ return rows;
155
+ }
62
156
  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])
157
+ const { type, data, description, alias } = await pg
158
+ .query("select type, data, description, alias from admin.user_cls where parent is null and name=$1", [name])
65
159
  .then((el) => el.rows?.[0] || {});
66
160
  if (type === "sql") {
67
- return { type, data };
161
+ return { type, data, description, alias };
68
162
  }
69
163
  if (type === "json") {
70
164
  const options = await pg
71
165
  .query(`select json_agg(json_build_object('id', code, 'text', name, 'icon', icon, 'color', color)) from admin.user_cls where parent=$1`, [name])
72
166
  .then((el) => el.rows?.[0]?.json_agg || []);
73
- return { type, data: options };
167
+ return { type, data: options, description, alias };
74
168
  }
75
169
  return null;
76
170
  }
@@ -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,13 @@
1
+ import config from "../../../../config.js";
2
+ import pgClients from "../../../plugins/pg/pgClients.js";
3
+ import { getUserClsList } from "../../../plugins/usercls/index.js";
4
+ export default async function getUserClsListApi({ query, user, pg = pgClients.client }, reply) {
5
+ if (!user?.uid && !config.local) {
6
+ return reply.status(401).send({ error: "unauthorized", code: 401 });
7
+ }
8
+ const t1 = Date.now();
9
+ const result = await getUserClsList({ name: query.name, search: query.search, sql: query.sql }, pg);
10
+ if (query.sql)
11
+ return result;
12
+ return { time: Date.now() - t1, data: result };
13
+ }
@@ -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.119",
3
+ "version": "2.0.121",
4
4
  "type": "module",
5
5
  "description": "core-plugins",
6
6
  "keywords": [