@opengis/fastify-table 2.0.162 → 2.1.0

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,5 +1,6 @@
1
- export default function getUserPermissions({ uid, resource }: {
1
+ export default function getUserPermissions({ uid, resource, userType, }: {
2
2
  uid?: string;
3
3
  resource?: string;
4
+ userType?: string;
4
5
  }, pg?: any): Promise<any>;
5
6
  //# sourceMappingURL=getUserPermissions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"getUserPermissions.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/access/funcs/getUserPermissions.ts"],"names":[],"mappings":"AAYA,wBAA8B,kBAAkB,CAC9C,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,EACtD,EAAE,MAAmB,gBAkCtB"}
1
+ {"version":3,"file":"getUserPermissions.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/access/funcs/getUserPermissions.ts"],"names":[],"mappings":"AAYA,wBAA8B,kBAAkB,CAC9C,EACE,GAAG,EACH,QAAQ,EACR,QAAQ,GACT,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,EACzD,EAAE,MAAmB,gBAsCtB"}
@@ -7,9 +7,12 @@ from admin.role_access a
7
7
  left join admin.roles b on a.role_id=b.role_id and b.enabled
8
8
  left join admin.user_roles c on a.role_id=c.role_id
9
9
  where resource_id is not null and $1 in (a.user_uid, c.user_uid)`;
10
- export default async function getUserPermissions({ uid, resource }, pg = pgClients.client) {
10
+ export default async function getUserPermissions({ uid, resource, userType, }, pg = pgClients.client) {
11
11
  if (!uid)
12
12
  return [];
13
+ if (userType === "admin") {
14
+ return resourcesList;
15
+ }
13
16
  // ? in case pg.pk not set yet
14
17
  const pks = await pg
15
18
  .query(`SELECT json_object_agg(conrelid::regclass, (SELECT attname FROM pg_attribute WHERE attrelid = c.conrelid AND attnum = c.conkey[1]) )
@@ -1 +1 @@
1
- {"version":3,"file":"getAccess.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/crud/funcs/getAccess.ts"],"names":[],"mappings":"AA8BA;;;;;;;;;GASG;AAEH,wBAA8B,SAAS,CACrC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAS,EAAE,MAAc,EAAE,EAAE,GAAG,EACzD,EAAE,MAAmB,sBA2GtB"}
1
+ {"version":3,"file":"getAccess.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/crud/funcs/getAccess.ts"],"names":[],"mappings":"AA8BA;;;;;;;;;GASG;AAEH,wBAA8B,SAAS,CACrC,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,IAAS,EAAE,MAAc,EAAE,EAAE,GAAG,EACzD,EAAE,MAAmB,sBA8GtB"}
@@ -55,8 +55,10 @@ export default async function getAccess({ resource, table, form, user = {}, meth
55
55
  return { actions: ["view"], query: "1=1" };
56
56
  }
57
57
  if (resource) {
58
- const permissions = await getUserPermissions({ resource, uid }, pg);
59
- const actions = (permissions || []).flatMap((el) => el.actions.map((e) => matches[e] || e));
58
+ const permissions = await getUserPermissions({ resource, uid, userType }, pg);
59
+ const actions = (permissions || [])
60
+ .flatMap((el) => el.actions.map((e) => matches[e] || e))
61
+ .filter((el, idx, arr) => arr.indexOf(el) === idx);
60
62
  return {
61
63
  scope: permissions?.scope,
62
64
  actions,
@@ -1,7 +1,7 @@
1
1
  import fs from "node:fs";
2
2
  export default function fsStorage(): {
3
3
  deleteFile: (fp: string) => Promise<void>;
4
- downloadFile: (fp: string, options?: Record<string, any>) => Promise<Buffer<ArrayBufferLike> | fs.ReadStream | {
4
+ downloadFile: (fp: string, options?: Record<string, any>) => Promise<NonSharedBuffer | fs.ReadStream | {
5
5
  original: string;
6
6
  full: string | null;
7
7
  } | null>;
@@ -1,6 +1,6 @@
1
1
  import { type FastifyRequest } from "fastify";
2
- import { pino } from "pino";
3
- interface ExtendedLogger extends pino.Logger {
2
+ import { Logger } from "pino";
3
+ interface ExtendedLogger extends Logger {
4
4
  file: (logfolder: string, msg: any, req?: FastifyRequest) => void;
5
5
  metrics: (key: string, val?: any, dbName?: string) => void;
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"getLogger.d.ts","sourceRoot":"","sources":["../../../../server/plugins/logger/getLogger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,UAAU,cAAe,SAAQ,IAAI,CAAC,MAAM;IAC1C,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;IAClE,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5D;AAmDD,QAAA,MAAM,MAAM,EAAE,cAAgD,CAAC;AAiC/D,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"getLogger.d.ts","sourceRoot":"","sources":["../../../../server/plugins/logger/getLogger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C,OAAa,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEpC,UAAU,cAAe,SAAQ,MAAM;IACrC,IAAI,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;IAClE,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5D;AAmDD,QAAA,MAAM,MAAM,EAAE,cAAgD,CAAC;AAqC/D,eAAe,MAAM,CAAC"}
@@ -1,4 +1,4 @@
1
- import { pino } from "pino";
1
+ import pino from "pino";
2
2
  import config from "../../../config.js";
3
3
  import redactionList from "../../../redactionList.js";
4
4
  import getRedis from "../redis/funcs/getRedis.js";
@@ -42,7 +42,11 @@ const options = {
42
42
  };
43
43
  const logger = pino(options);
44
44
  logger.file = function userFile(logfolder, msg, req) {
45
- logger.info({ logfolder, ...(typeof msg === "string" ? { msg } : msg) }, req);
45
+ logger.info({
46
+ logfolder,
47
+ ...(typeof msg === "string" ? { msg } : msg),
48
+ req,
49
+ });
46
50
  };
47
51
  if (config.debug) {
48
52
  logger.file("test/redaction", {
@@ -1,15 +1,15 @@
1
1
  const serializers = {
2
2
  req(request) {
3
- const { method, url, referer, params, query, body, session, } = request;
3
+ const { method, url, headers, params, query, body, session } = request;
4
4
  const { uid = undefined, user_name: userName = undefined } = session?.passport?.user || {};
5
5
  return {
6
6
  method,
7
7
  url,
8
- referer,
9
- ip: request.headers?.['x-real-ip']
10
- || request.headers?.['x-forwarded-for']
11
- || request.ip
12
- || request.connection?.remoteAddress,
8
+ referer: headers?.referer,
9
+ ip: request.headers?.["x-real-ip"] ||
10
+ request.headers?.["x-forwarded-for"] ||
11
+ request.ip ||
12
+ request.connection?.remoteAddress,
13
13
  uid,
14
14
  dbName: request.pg?.options?.database,
15
15
  user_name: userName,
@@ -1 +1 @@
1
- {"version":3,"file":"checkPermissions.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/policy/funcs/checkPermissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAEV,eAAe,EAEhB,MAAM,wBAAwB,CAAC;AAMhC,wBAA8B,gBAAgB,CAC5C,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,YAAY,iBAgEpB"}
1
+ {"version":3,"file":"checkPermissions.d.ts","sourceRoot":"","sources":["../../../../../server/plugins/policy/funcs/checkPermissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAEV,eAAe,EAEhB,MAAM,wBAAwB,CAAC;AAMhC,wBAA8B,gBAAgB,CAC5C,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,YAAY,iBAkEpB"}
@@ -16,7 +16,7 @@ export default async function checkPermissions(req, reply) {
16
16
  if (!permissions?.length) {
17
17
  return null;
18
18
  }
19
- const userPermissions = await getUserPermissions({ uid: user?.uid }, pg).then((arr) => arr.reduce((acc, curr) => ({ ...acc, [curr.name]: curr.actions }), {}));
19
+ const userPermissions = await getUserPermissions({ uid: user?.uid, userType: user?.user_type }, pg).then((arr) => arr.reduce((acc, curr) => ({ ...acc, [curr.name]: curr.actions }), {}));
20
20
  const havePermission = Object.keys(userPermissions).length &&
21
21
  permissions?.length &&
22
22
  permissions.length ===
@@ -1 +1 @@
1
- {"version":3,"file":"totp.d.ts","sourceRoot":"","sources":["../../../../../../../server/routes/auth/controllers/2factor/providers/totp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAU1D,UAAU,OAAO;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,UAAU,CAAC;CAChB;AAED,UAAU,KAAK;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,UAAU,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAmBD,QAAA,MAAM,YAAY,GAAU,aAAa,OAAO,kBAK/C,CAAC;AAEF,QAAA,MAAM,YAAY,GAAU,aAAa,OAAO,kBAK/C,CAAC;AAEF,QAAA,MAAM,SAAS,GAAU,aAAa,OAAO;;;;EAc5C,CAAC;AAuBF,QAAA,MAAM,QAAQ,GAAU,aAAa,OAAO;;;;;;;;;;;;EA0D3C,CAAC;AAEF,QAAA,MAAM,MAAM,GAAU,0BAA0B,KAAK;;;EAiBpD,CAAC;AAKF,QAAA,MAAM,MAAM,GAAU,2BAA2B,KAAK,iBAqBrD,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;;AAE3E,wBAAoB"}
1
+ {"version":3,"file":"totp.d.ts","sourceRoot":"","sources":["../../../../../../../server/routes/auth/controllers/2factor/providers/totp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAU1D,UAAU,OAAO;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,UAAU,CAAC;CAChB;AAED,UAAU,KAAK;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,UAAU,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAuBD,QAAA,MAAM,YAAY,GAAU,aAAa,OAAO,kBAK/C,CAAC;AAEF,QAAA,MAAM,YAAY,GAAU,aAAa,OAAO,kBAK/C,CAAC;AAEF,QAAA,MAAM,SAAS,GAAU,aAAa,OAAO;;;;EAc5C,CAAC;AAuBF,QAAA,MAAM,QAAQ,GAAU,aAAa,OAAO;;;;;;;;;;;;EA0D3C,CAAC;AAEF,QAAA,MAAM,MAAM,GAAU,0BAA0B,KAAK;;;EAiBpD,CAAC;AAKF,QAAA,MAAM,MAAM,GAAU,2BAA2B,KAAK,iBAqBrD,CAAC;AAEF,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;;AAE3E,wBAAoB"}
@@ -1,9 +1,14 @@
1
1
  import crypto from "node:crypto";
2
2
  import qrcode from "qrcode";
3
- import { authenticator } from "otplib";
3
+ import * as authenticator from "otplib";
4
4
  import config from "../../../../../../config.js";
5
5
  const TYPE = "TOTP";
6
- const getOTP = (id, secret) => authenticator.keyuri(id.toString(), config.auth?.["2fa"]?.prefix || "SOFTPRO", secret);
6
+ // equivalent to otplib@12.0.1 authenticator.keyuri(id,prefix,secret)
7
+ // "otpauth://totp/SOFTPRO:777?secret=secret&period=30&digits=6&algorithm=SHA1&issuer=SOFTPRO"
8
+ const getOTP = (id, secret) => {
9
+ const issuer = config.auth?.["2fa"]?.prefix || "SOFTPRO";
10
+ return `otpauth://totp/${issuer}:${encodeURIComponent(id.toString())}?secret=${secret}&period=30&digits=6&algorithm=SHA1&issuer=${encodeURIComponent(issuer)}`;
11
+ };
7
12
  const enableSecret = async ({ uid, pg }) => {
8
13
  await pg.query("update admin.users_social_auth set enabled=true where uid = $1 and social_auth_type = $2", [uid, TYPE]);
9
14
  };
@@ -1 +1 @@
1
- {"version":3,"file":"getUserInfo.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/core/getUserInfo.ts"],"names":[],"mappings":"AAmCA,wBAA8B,WAAW,CAAC,GAAG,EAAE,GAAG,eA+EjD"}
1
+ {"version":3,"file":"getUserInfo.d.ts","sourceRoot":"","sources":["../../../../../../server/routes/auth/controllers/core/getUserInfo.ts"],"names":[],"mappings":"AAoCA,wBAA8B,WAAW,CAAC,GAAG,EAAE,GAAG,eAkFjD"}
@@ -1,4 +1,5 @@
1
1
  import config from "../../../../../config.js";
2
+ // import logger from "../../../../plugins/logger/getLogger.js";
2
3
  import pgClients from "../../../../plugins/pg/pgClients.js";
3
4
  import applyHook from "../../../../plugins/hook/applyHook.js";
4
5
  import getRedis from "../../../../plugins/redis/funcs/getRedis.js";
@@ -74,7 +75,7 @@ export default async function getUserInfo(req) {
74
75
  req.user?.uid
75
76
  ? await pg.query(q, [user.uid]).then((el) => el.rows || [])
76
77
  : [];
77
- const permissions = await getUserPermissions({ uid: user?.uid }, pg);
78
+ const permissions = await getUserPermissions({ uid: user?.uid, userType: user?.user_type }, pg);
78
79
  Object.assign(payload, {
79
80
  user: userInfo,
80
81
  settings,
@@ -1,4 +1,4 @@
1
- import { Agent } from "undici";
1
+ import { fetch, Agent } from "undici";
2
2
  import config from "../../../../../config.js";
3
3
  import { applyHook } from "../../../../../utils.js";
4
4
  import logger from "../../../../plugins/logger/getLogger.js";
@@ -6,7 +6,7 @@ export default async function tableData(req, reply, called) {
6
6
  const q = `select attr,
7
7
  (select rule_values from admin.account_grants where account_id in (select account_id from admin.account_users where user_uid=$2) and rule_id=r.rule_id limit 1)
8
8
  from admin.rules r where (select route_id from admin.routes where $1 in (alias,table_name)) = any(routes)`;
9
- const { rows = [] } = pg?.pk?.["admin.rules"] && user?.uid
9
+ const { rows = [] } = pg?.pk?.["admin.rules"] && pg?.pk?.["admin.account_grants"] && user?.uid
10
10
  ? await pg.query(q, [params.table, user.uid])
11
11
  : {};
12
12
  const contextQuery = rows
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opengis/fastify-table",
3
- "version": "2.0.162",
3
+ "version": "2.1.0",
4
4
  "type": "module",
5
5
  "description": "core-plugins",
6
6
  "keywords": [
@@ -39,56 +39,56 @@
39
39
  "start": "LOG_LEVEL=trace bun server"
40
40
  },
41
41
  "dependencies": {
42
- "@aws-sdk/client-s3": "3.879.0",
43
- "@aws-sdk/lib-storage": "3.879.0",
42
+ "@aws-sdk/client-s3": "3.1018.0",
43
+ "@aws-sdk/lib-storage": "3.1018.0",
44
44
  "@fastify/cookie": "11.0.2",
45
- "@fastify/http-proxy": "11.1.2",
46
- "@fastify/multipart": "9.0.3",
45
+ "@fastify/http-proxy": "11.4.3",
46
+ "@fastify/multipart": "9.4.0",
47
47
  "@fastify/passport": "3.0.2",
48
48
  "@fastify/rate-limit": "10.3.0",
49
- "@fastify/session": "11.1.0",
50
- "@grpc/grpc-js": "1.10.11",
51
- "@grpc/proto-loader": "0.7.15",
49
+ "@fastify/session": "11.1.1",
50
+ "@grpc/grpc-js": "1.14.3",
51
+ "@grpc/proto-loader": "0.8.0",
52
52
  "apache-crypt": "1.2.6",
53
53
  "better-sqlite3": "12.2.0",
54
- "dotenv": "16.5.0",
55
- "fastify": "5.3.3",
56
- "fastify-plugin": "5.0.1",
54
+ "dotenv": "17.3.1",
55
+ "fastify": "5.8.4",
56
+ "fastify-plugin": "5.1.0",
57
57
  "fastify-session-redis-store": "7.1.2",
58
- "handlebars": "4.7.8",
59
- "image-size": "1.2.0",
60
- "ioredis": "5.3.2",
61
- "js-yaml": "4.1.0",
62
- "markdown-it": "14.1.0",
63
- "nodemailer": "7.0.6",
64
- "otplib": "12.0.1",
65
- "pg": "8.11.6",
66
- "pino": "9.5.0",
67
- "pino-abstract-transport": "2.0.0",
58
+ "handlebars": "4.7.9",
59
+ "image-size": "2.0.2",
60
+ "ioredis": "5.10.1",
61
+ "js-yaml": "4.1.1",
62
+ "markdown-it": "14.1.1",
63
+ "nodemailer": "8.0.4",
64
+ "otplib": "13.4.0",
65
+ "pg": "8.20.0",
66
+ "pino": "10.3.1",
67
+ "pino-abstract-transport": "3.0.0",
68
68
  "promised-handlebars": "2.0.1",
69
69
  "qrcode": "1.5.4",
70
70
  "sharp": "0.34.5",
71
71
  "uglify-js": "3.19.3",
72
- "undici": "7.16.0"
72
+ "undici": "7.24.6"
73
73
  },
74
74
  "devDependencies": {
75
75
  "@types/better-sqlite3": "^7.6.13",
76
76
  "@types/bun": "^1.3.5",
77
77
  "@types/js-yaml": "^4.0.9",
78
78
  "@types/markdown-it": "^14.1.2",
79
- "@types/node": "^24.3.1",
79
+ "@types/node": "^24.12.0",
80
80
  "@types/nodemailer": "^7.0.1",
81
81
  "@types/passport": "^1.0.17",
82
82
  "@types/passport-local": "^1.0.38",
83
83
  "@types/pg": "^8.15.5",
84
84
  "@types/qrcode": "^1.5.5",
85
85
  "copyfiles": "^2.4.1",
86
- "eslint": "^9.35.0",
87
- "eslint-config-airbnb-extended": "^2.3.1",
86
+ "eslint": "^10.1.0",
87
+ "eslint-config-airbnb-extended": "^3.0.1",
88
88
  "ts-migrate": "^0.1.35",
89
- "typescript": "^5.9.2",
90
- "vitest": "^3.2.4"
89
+ "typescript": "^6.0.2",
90
+ "vitest": "^4.1.2"
91
91
  },
92
92
  "author": "Softpro",
93
93
  "license": "ISC"
94
- }
94
+ }