@galadrim/galadmin 0.1.53 → 0.1.55

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.
@@ -280,7 +280,14 @@ export type Config = {
280
280
  password: string;
281
281
  };
282
282
  authRoles?: AuthRole[];
283
- mysql: {
283
+ mysql?: {
284
+ host: string;
285
+ user: string;
286
+ password: string;
287
+ database: string;
288
+ port?: number;
289
+ };
290
+ postgresql?: {
284
291
  host: string;
285
292
  user: string;
286
293
  password: string;
@@ -1,5 +1,6 @@
1
1
  export default class dbManager {
2
2
  _db: any;
3
+ dbType: any;
3
4
  init(config: any): void;
4
5
  query(queryString: any, args?: any[]): Promise<any>;
5
6
  }
@@ -2,23 +2,72 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const mysql = require("mysql");
4
4
  const mysql2 = require("mysql2");
5
+ const pg = require("pg");
6
+ function convertQuery(mysqlQuery, params) {
7
+ let pgQuery = '';
8
+ let pgParams = [];
9
+ let paramIndex = 1;
10
+ let charIndex = 0;
11
+ while (charIndex < mysqlQuery.length) {
12
+ if (mysqlQuery.charAt(charIndex) === '?' && mysqlQuery.charAt(charIndex + 1) === '?') {
13
+ pgQuery += params.shift();
14
+ charIndex += 2;
15
+ }
16
+ else if (mysqlQuery.charAt(charIndex) === '?') {
17
+ pgQuery += `$${paramIndex++}`;
18
+ pgParams.push(params.shift());
19
+ charIndex++;
20
+ }
21
+ else {
22
+ pgQuery += mysqlQuery.charAt(charIndex);
23
+ charIndex++;
24
+ }
25
+ }
26
+ return {
27
+ pgQuery,
28
+ pgParams,
29
+ };
30
+ }
5
31
  class dbManager {
6
32
  init(config) {
7
- this._db = (config.useMysql2 ? mysql2 : mysql).createPool({
8
- connectionLimit: 10,
9
- host: config.mysql.host,
10
- user: config.mysql.user,
11
- password: config.mysql.password,
12
- database: config.mysql.database,
13
- port: config.mysql.port || 3306,
14
- dateStrings: true,
15
- multipleStatements: true
16
- });
33
+ if (config.mysql) {
34
+ this._db = (config.useMysql2 ? mysql2 : mysql).createPool({
35
+ connectionLimit: 10,
36
+ host: config.mysql.host,
37
+ user: config.mysql.user,
38
+ password: config.mysql.password,
39
+ database: config.mysql.database,
40
+ port: config.mysql.port || 3306,
41
+ dateStrings: true,
42
+ multipleStatements: true
43
+ });
44
+ this.dbType = "MYSQL";
45
+ }
46
+ else if (config.postgresql) {
47
+ this._db = new pg.Pool({
48
+ host: config.postgresql.host,
49
+ user: config.postgresql.user,
50
+ password: config.postgresql.password,
51
+ database: config.postgresql.database,
52
+ port: config.postgresql.port || 5432,
53
+ });
54
+ this.dbType = "POSTGRESQL";
55
+ }
17
56
  }
18
57
  async query(queryString, args = []) {
19
58
  return new Promise((resolve, reject) => {
20
- this._db.query(queryString, args, function (err, rows, fields) {
21
- resolve({ err, rows, fields });
59
+ if (this.dbType === "POSTGRESQL") {
60
+ const result = convertQuery(queryString, args);
61
+ queryString = result.pgQuery;
62
+ args = result.pgParams;
63
+ }
64
+ this._db.query(queryString, args, (a, b, c) => {
65
+ if (this.dbType === "MYSQL") {
66
+ resolve({ err: a, rows: b, fields: c });
67
+ }
68
+ else if (this.dbType === "POSTGRESQL") {
69
+ resolve({ err: a, rows: b === null || b === void 0 ? void 0 : b.rows, fields: b === null || b === void 0 ? void 0 : b.fields });
70
+ }
22
71
  });
23
72
  });
24
73
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dbManager.js","sourceRoot":"","sources":["../../src/utils/dbManager.ts"],"names":[],"mappings":";;AAAA,+BAA+B;AAC/B,iCAAiC;AAEjC,MAAqB,SAAS;IAG1B,IAAI,CAAC,MAAM;QACP,IAAI,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC;YACtD,eAAe,EAAE,EAAE;YACnB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI;YACvB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI;YACvB,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ;YAC/B,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,QAAQ;YAC/B,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,IAAI;YAC/B,WAAW,EAAE,IAAI;YACjB,kBAAkB,EAAE,IAAI;SAC3B,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,GAAG,EAAE;QAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,UAAU,GAAG,EAAE,IAAI,EAAE,MAAM;gBACzD,OAAO,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;YAClC,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AAvBD,4BAuBC"}
1
+ {"version":3,"file":"dbManager.js","sourceRoot":"","sources":["../../src/utils/dbManager.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@galadrim/galadmin",
3
- "version": "0.1.53",
3
+ "version": "0.1.55",
4
4
  "main": "dist/index.js",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1",
@@ -18,6 +18,7 @@
18
18
  "aws-sdk": "^2.958.0",
19
19
  "axios": "^0.21.1",
20
20
  "bcryptjs": "^2.4.3",
21
+ "connect-pg-simple": "^9.0.0",
21
22
  "express": "^4.17.1",
22
23
  "express-mysql-session": "^2.1.6",
23
24
  "express-session": "^1.17.2",
@@ -27,6 +28,7 @@
27
28
  "multiparty": "^4.2.2",
28
29
  "mysql": "^2.18.1",
29
30
  "mysql2": "^2.3.3",
31
+ "pg": "^8.11.3",
30
32
  "rollup": "^2.56.2",
31
33
  "serialize-javascript": "^6.0.0",
32
34
  "ssh2-sftp-client": "^9.0.4"
package/src/api.ts CHANGED
@@ -61,8 +61,8 @@ export default (db, config, user) => {
61
61
  queryString += ")"
62
62
  }
63
63
  const limit = params.allRecords ? 999999 : parseInt(params.limit)
64
- const query = params.customQuery || ("SELECT " + (params.selectExpression || "*") + " FROM ?? " + (params.join || "") + queryString + " " + (params.groupBy ? "GROUP BY " + params.groupBy : "") + (params.orderBy || params.primaryId ? " ORDER BY " + (params.orderBy || `${params.table}.${params.primaryId}`) : "") + (params.isDesc ? " DESC" : "") + " LIMIT ?, ?")
65
- const queryParams = [params.table, Math.max((params.page - 1) * limit, 0), limit]
64
+ const query = params.customQuery || ("SELECT " + (params.selectExpression || "*") + " FROM ?? " + (params.join || "") + queryString + " " + (params.groupBy ? "GROUP BY " + params.groupBy : "") + (params.orderBy || params.primaryId ? " ORDER BY " + (params.orderBy || `${params.table}.${params.primaryId}`) : "") + (params.isDesc ? " DESC" : "") + " LIMIT ? OFFSET ?")
65
+ const queryParams = [params.table, limit, Math.max((params.page - 1) * limit, 0)]
66
66
  const { err, rows } = await db.query(query, queryParams)
67
67
  if (err) {
68
68
  console.error(err)
@@ -695,7 +695,7 @@ export default (db, config, user) => {
695
695
 
696
696
 
697
697
  async function enrichConfig(config, db) {
698
- const { rows: info } = await db.query("SELECT * FROM information_schema.columns WHERE table_schema = ?", [config.mysql.database])
698
+ const { rows: info } = await db.query("SELECT * FROM information_schema.columns WHERE table_schema = ?", [config.mysql?.database || config.postgresql?.database])
699
699
  for (const view of config.views) {
700
700
  if (view.type == "table") {
701
701
  const tableName = view.tableName;
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "files": {
3
3
  "main.css": "/_HOMEPAGE_/static/css/main.b070e545.css",
4
- "main.js": "/_HOMEPAGE_/static/js/main.a6e3920f.js",
4
+ "main.js": "/_HOMEPAGE_/static/js/main.503d80f3.js",
5
5
  "static/media/gt-eesti-medium.woff": "/_HOMEPAGE_/static/media/gt-eesti-medium.a48c02fa57e83ab6ddcd.woff",
6
6
  "static/media/gt-eesti-regular.woff": "/_HOMEPAGE_/static/media/gt-eesti-regular.304a7ae06ee4a4d5d04a.woff",
7
7
  "static/media/logo.png": "/_HOMEPAGE_/static/media/logo.e407b9ca7e302466a07d.png",
8
8
  "static/media/cubano.woff": "/_HOMEPAGE_/static/media/cubano.4eaa47ef94222121a371.woff",
9
9
  "index.html": "/_HOMEPAGE_/index.html",
10
10
  "main.b070e545.css.map": "/_HOMEPAGE_/static/css/main.b070e545.css.map",
11
- "main.a6e3920f.js.map": "/_HOMEPAGE_/static/js/main.a6e3920f.js.map"
11
+ "main.503d80f3.js.map": "/_HOMEPAGE_/static/js/main.503d80f3.js.map"
12
12
  },
13
13
  "entrypoints": [
14
14
  "static/css/main.b070e545.css",
15
- "static/js/main.a6e3920f.js"
15
+ "static/js/main.503d80f3.js"
16
16
  ]
17
17
  }
@@ -1 +1 @@
1
- <!doctype html><html lang="fr"><head><script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script><script src="https://momentjs.com/downloads/moment-timezone-with-data-10-year-range.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/locale/fr.js"></script><script async="async" defer="defer" src="https://cdnjs.cloudflare.com/ajax/libs/spectrum/1.8.0/spectrum.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/air-datepicker/2.2.3/js/datepicker.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/air-datepicker/2.2.3/js/i18n/datepicker.fr.min.js"></script><script async="async" defer="defer" src="https://cdnjs.cloudflare.com/ajax/libs/downloadjs/1.4.8/download.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.4.0/Chart.min.js"></script><script async="async" defer="defer" src="https://cdn.jsdelivr.net/npm/sweetalert"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/quill/1.3.6/quill.min.js"></script><script src="https://sdk.amazonaws.com/js/aws-sdk-2.606.0.min.js"></script><script src="https://kit.fontawesome.com/75b28933ed.js" crossorigin="anonymous" async="async" defer="defer"></script><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/air-datepicker/2.2.3/css/datepicker.min.css"/><link rel="stylesheet" href="/_HOMEPAGE_/spectrum.css"/><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/quill/1.3.6/quill.snow.min.css"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta charset="utf-8"/><link rel="icon" href="/_HOMEPAGE_/favicon.png"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><link rel="manifest" href="/_HOMEPAGE_/manifest.json"/><title>Back-office</title><script defer="defer" src="/_HOMEPAGE_/static/js/main.a6e3920f.js"></script><link href="/_HOMEPAGE_/static/css/main.b070e545.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
1
+ <!doctype html><html lang="fr"><head><script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script><script src="https://momentjs.com/downloads/moment-timezone-with-data-10-year-range.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/locale/fr.js"></script><script async="async" defer="defer" src="https://cdnjs.cloudflare.com/ajax/libs/spectrum/1.8.0/spectrum.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/air-datepicker/2.2.3/js/datepicker.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/air-datepicker/2.2.3/js/i18n/datepicker.fr.min.js"></script><script async="async" defer="defer" src="https://cdnjs.cloudflare.com/ajax/libs/downloadjs/1.4.8/download.min.js"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.4.0/Chart.min.js"></script><script async="async" defer="defer" src="https://cdn.jsdelivr.net/npm/sweetalert"></script><script src="https://cdnjs.cloudflare.com/ajax/libs/quill/1.3.6/quill.min.js"></script><script src="https://sdk.amazonaws.com/js/aws-sdk-2.606.0.min.js"></script><script src="https://kit.fontawesome.com/75b28933ed.js" crossorigin="anonymous" async="async" defer="defer"></script><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/air-datepicker/2.2.3/css/datepicker.min.css"/><link rel="stylesheet" href="/_HOMEPAGE_/spectrum.css"/><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/quill/1.3.6/quill.snow.min.css"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta charset="utf-8"/><link rel="icon" href="/_HOMEPAGE_/favicon.png"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><link rel="manifest" href="/_HOMEPAGE_/manifest.json"/><title>Back-office</title><script defer="defer" src="/_HOMEPAGE_/static/js/main.503d80f3.js"></script><link href="/_HOMEPAGE_/static/css/main.b070e545.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>