ismx-nexo-node-app 0.3.69 → 0.3.71

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.
@@ -24,8 +24,10 @@ class ServiceRestFormalTemplate {
24
24
  this.get.serveRestFormal = this.serveGet.bind(this);
25
25
  this.getList = new ServiceRestFormal_1.default("GET", `${resource}/list`);
26
26
  this.getList.serveRestFormal = this.serveGetList.bind(this);
27
+ this.getKeymap.serveRestFormal = this.serveGetKeymap.bind(this);
27
28
  this.postList = new ServiceRestFormal_1.default("POST", `${resource}/list`);
28
29
  this.postList.serveRestFormal = this.servePostList.bind(this);
30
+ this.postKeymap.serveRestFormal = this.servePostKeymap.bind(this);
29
31
  this.full = new ServiceRestFormal_1.default("GET", `${resource}/full`);
30
32
  this.full.serveRestFormal = this.serveFull.bind(this);
31
33
  this.fullList = new ServiceRestFormal_1.default("GET", `${resource}/full/list`);
@@ -79,6 +81,18 @@ class ServiceRestFormalTemplate {
79
81
  return Service_1.HttpResponse.ok(yield this.database.find(this.tableName, Object.assign({}, request.query)));
80
82
  });
81
83
  }
84
+ serveGetKeymap(request) {
85
+ return __awaiter(this, void 0, void 0, function* () {
86
+ var _a, _b, _c, _d;
87
+ let key = (_a = this.indexer) !== null && _a !== void 0 ? _a : (_b = request.query) === null || _b === void 0 ? void 0 : _b["key"];
88
+ let value = (_c = this.indexer) !== null && _c !== void 0 ? _c : (_d = request.query) === null || _d === void 0 ? void 0 : _d["value"];
89
+ let keymap = yield this.database.group(this.tableName, key, value, Object.assign({}, request.query));
90
+ let result = {};
91
+ for (let key of Object.keys(keymap))
92
+ result[key] = keymap[key][0];
93
+ return Service_1.HttpResponse.ok(result);
94
+ });
95
+ }
82
96
  servePost(request) {
83
97
  return __awaiter(this, void 0, void 0, function* () {
84
98
  let entity = this.database.add(this.tableName, request.body);
@@ -93,6 +107,11 @@ class ServiceRestFormalTemplate {
93
107
  return Service_1.HttpResponse.ok(this.database.addAll(this.tableName, list));
94
108
  });
95
109
  }
110
+ servePostKeymap(request) {
111
+ return __awaiter(this, void 0, void 0, function* () {
112
+ throw new Error();
113
+ });
114
+ }
96
115
  serveFull(request) {
97
116
  return __awaiter(this, void 0, void 0, function* () {
98
117
  return this.serveGet(request);
@@ -37,7 +37,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
37
37
  Object.defineProperty(exports, "__esModule", { value: true });
38
38
  const Service_1 = require("../api/Service");
39
39
  const Business_1 = __importDefault(require("./Business"));
40
- const BusinessErrors_1 = require("../business/BusinessErrors");
41
40
  class BusinessServer extends Business_1.default {
42
41
  constructor() {
43
42
  super();
@@ -101,7 +100,7 @@ class BusinessServer extends Business_1.default {
101
100
  }
102
101
  run(service) {
103
102
  return (request, socket) => __awaiter(this, void 0, void 0, function* () {
104
- var _a, _b, _c, _d, _e, _f, _g, _h, _j;
103
+ var _a, _b, _c, _d, _e, _f, _g, _h;
105
104
  let code;
106
105
  let response = Service_1.HttpResponse.ko(500, "Internal server error");
107
106
  // Asigna un valor único a la llamada de la API.
@@ -129,16 +128,14 @@ class BusinessServer extends Business_1.default {
129
128
  catch (e) { }
130
129
  if (error instanceof Service_1.HttpResponse)
131
130
  response = error;
132
- if (error instanceof BusinessErrors_1.FormalError)
133
- response = error.type;
134
131
  else
135
- response = Service_1.HttpResponse.ko((_g = error.httpCode) !== null && _g !== void 0 ? _g : 500, error.content);
132
+ response = Service_1.HttpResponse.ko(500, null);
136
133
  }
137
134
  finally {
138
- let status = (_h = response === null || response === void 0 ? void 0 : response.httpCode) !== null && _h !== void 0 ? _h : 500;
135
+ let status = (_g = response === null || response === void 0 ? void 0 : response.httpCode) !== null && _g !== void 0 ? _g : 500;
139
136
  socket.status(status).send(response === null || response === void 0 ? void 0 : response.content);
140
137
  try {
141
- (_j = this.onEnd) === null || _j === void 0 ? void 0 : _j.call(this, request, response);
138
+ (_h = this.onEnd) === null || _h === void 0 ? void 0 : _h.call(this, request, response);
142
139
  }
143
140
  catch (e) { }
144
141
  }
@@ -101,6 +101,23 @@ class RepositoryDatabasePostgres extends RepositoryDatabase_1.default {
101
101
  return this.query(query, values);
102
102
  });
103
103
  }
104
+ group(tableName, key, value, filters) {
105
+ return __awaiter(this, void 0, void 0, function* () {
106
+ if (!this.tables[tableName])
107
+ throw new Error(`table ${tableName} does not exist`);
108
+ let schema = this.tables[tableName][0].schema;
109
+ let { where, values } = this.toWhere(tableName, filters);
110
+ let query = `SELECT ${key} as key, array_agg(${value}) as values
111
+ FROM ${schema}.${tableName}
112
+ WHERE ${where} GROUP BY ${key}`;
113
+ return this.query(query).then((map) => {
114
+ let group = {};
115
+ for (let elem of map)
116
+ group[elem.key] = elem.values;
117
+ return group;
118
+ });
119
+ });
120
+ }
104
121
  add(tableName, object, id) {
105
122
  return __awaiter(this, void 0, void 0, function* () {
106
123
  return this.addAll(tableName, [Object.assign({ id: id }, object)]).then((rows) => rows[0]);
@@ -8,8 +8,16 @@ export default class ServiceRestFormalTemplate<Model = any> {
8
8
  readonly database: RepositoryDatabase;
9
9
  readonly get: ServiceRestFormal<any, Model>;
10
10
  readonly getList: ServiceRestFormal<any, Model[]>;
11
+ readonly getKeymap: ServiceRestFormal<any, {
12
+ [key: string]: any;
13
+ }>;
11
14
  readonly post: ServiceRestFormal<Model, Model>;
12
15
  readonly postList: ServiceRestFormal<Model[], Model[]>;
16
+ readonly postKeymap: ServiceRestFormal<{
17
+ [key: string]: any;
18
+ }, {
19
+ [key: string]: any;
20
+ }>;
13
21
  readonly full: ServiceRestFormal<any, Model>;
14
22
  readonly fullList: ServiceRestFormal<any, Model[]>;
15
23
  readonly put: ServiceRestFormal<Model, Model>;
@@ -30,8 +38,16 @@ export default class ServiceRestFormalTemplate<Model = any> {
30
38
  };
31
39
  protected serveGet(request: HttpRequest): Promise<HttpResponse<Model>>;
32
40
  protected serveGetList(request: HttpRequest): Promise<HttpResponse<Model[]>>;
41
+ protected serveGetKeymap(request: HttpRequest): Promise<HttpResponse<{
42
+ [key: string]: any;
43
+ }>>;
33
44
  protected servePost(request: HttpRequest<Model>): Promise<HttpResponse<Model>>;
34
45
  protected servePostList(request: HttpRequest<Model[]>): Promise<HttpResponse<Model[]>>;
46
+ protected servePostKeymap(request: HttpRequest<{
47
+ [key: string]: any;
48
+ }>): Promise<HttpResponse<{
49
+ [key: string]: any;
50
+ }>>;
35
51
  protected serveFull(request: HttpRequest): Promise<HttpResponse<Model>>;
36
52
  protected serveFullList(request: HttpRequest): Promise<HttpResponse<Model[]>>;
37
53
  protected servePage(request: HttpRequest): Promise<HttpResponse<Pagination<Model>>>;
@@ -32,6 +32,11 @@ export default abstract class RepositoryDatabase extends Repository {
32
32
  abstract find<E>(tableName: string, filters: {
33
33
  [key: string]: Primitive | Array<any>;
34
34
  }): Promise<E[]>;
35
+ abstract group(tableName: string, key: string, value: string, filters: {
36
+ [p: string]: Primitive | Array<any>;
37
+ }): Promise<{
38
+ [p: string]: string[];
39
+ }>;
35
40
  abstract add<E>(tableName: string, object: {
36
41
  [key: string]: Primitive;
37
42
  } | any, id?: string): Promise<E>;
@@ -25,6 +25,11 @@ export default class RepositoryDatabasePostgres extends RepositoryDatabase {
25
25
  find<T>(tableName: string, filters?: {
26
26
  [key: string]: Primitive | Array<any>;
27
27
  }): Promise<T[]>;
28
+ group(tableName: string, key: string, value: string, filters: {
29
+ [p: string]: Primitive | Array<any>;
30
+ }): Promise<{
31
+ [p: string]: any[];
32
+ }>;
28
33
  add<E>(tableName: string, object: {
29
34
  [key: string]: Primitive;
30
35
  } | any, id?: string): Promise<E>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ismx-nexo-node-app",
3
- "version": "0.3.69",
3
+ "version": "0.3.71",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "build": "rm -rf ./dist && npx tsc",
@@ -11,8 +11,12 @@ export default class ServiceRestFormalTemplate<Model=any>
11
11
 
12
12
  readonly get!: ServiceRestFormal<any, Model>;
13
13
  readonly getList!: ServiceRestFormal<any, Model[]>;
14
+ readonly getKeymap!: ServiceRestFormal<any, { [key:string]:any }>;
15
+
14
16
  readonly post!: ServiceRestFormal<Model, Model>;
15
17
  readonly postList!: ServiceRestFormal<Model[], Model[]>;
18
+ readonly postKeymap!: ServiceRestFormal<{ [key:string]:any }, { [key:string]:any }>;
19
+
16
20
  readonly full!: ServiceRestFormal<any, Model>
17
21
  readonly fullList!: ServiceRestFormal<any, Model[]>
18
22
 
@@ -35,9 +39,11 @@ export default class ServiceRestFormalTemplate<Model=any>
35
39
 
36
40
  this.getList = new ServiceRestFormal("GET", `${resource}/list`);
37
41
  this.getList.serveRestFormal = this.serveGetList.bind(this);
42
+ this.getKeymap.serveRestFormal = this.serveGetKeymap.bind(this);
38
43
 
39
44
  this.postList = new ServiceRestFormal("POST", `${resource}/list`);
40
45
  this.postList.serveRestFormal = this.servePostList.bind(this);
46
+ this.postKeymap.serveRestFormal = this.servePostKeymap.bind(this);
41
47
 
42
48
  this.full = new ServiceRestFormal("GET", `${resource}/full`);
43
49
  this.full.serveRestFormal = this.serveFull.bind(this);
@@ -97,6 +103,15 @@ export default class ServiceRestFormalTemplate<Model=any>
97
103
  return HttpResponse.ok(await this.database.find<Model>(this.tableName, { ...request.query }));
98
104
  }
99
105
 
106
+ protected async serveGetKeymap(request: HttpRequest): Promise<HttpResponse<{ [key:string]:any }>> {
107
+ let key = this.indexer ?? request.query?.["key"];
108
+ let value = this.indexer ?? request.query?.["value"];
109
+ let keymap = await this.database.group(this.tableName, key, value, { ...request.query });
110
+ let result: { [key:string]:any } = {};
111
+ for (let key of Object.keys(keymap)) result[key] = keymap[key][0];
112
+ return HttpResponse.ok(result);
113
+ }
114
+
100
115
  protected async servePost(request: HttpRequest<Model>): Promise<HttpResponse<Model>> {
101
116
  let entity = this.database.add<Model>(this.tableName, request.body);
102
117
  return HttpResponse.ok(entity);
@@ -108,6 +123,10 @@ export default class ServiceRestFormalTemplate<Model=any>
108
123
  return HttpResponse.ok(this.database.addAll<Model>(this.tableName, list as any));
109
124
  }
110
125
 
126
+ protected async servePostKeymap(request: HttpRequest<{ [key:string]:any }>): Promise<HttpResponse<{ [key:string]:any }>> {
127
+ throw new Error();
128
+ }
129
+
111
130
  protected async serveFull(request: HttpRequest): Promise<HttpResponse<Model>> {
112
131
  return this.serveGet(request);
113
132
  }
@@ -1,6 +1,5 @@
1
1
  import Service, {HttpRequest, HttpResponse} from "../api/Service";
2
2
  import Business from "./Business";
3
- import {FormalError} from "../business/BusinessErrors";
4
3
 
5
4
  export default class BusinessServer extends Business
6
5
  {
@@ -90,8 +89,7 @@ export default class BusinessServer extends Business
90
89
  } catch (error: any) {
91
90
  try { error = this.onError?.(request, error); } catch (e) { }
92
91
  if (error instanceof HttpResponse) response = error;
93
- if (error instanceof FormalError) response = error.type;
94
- else response = HttpResponse.ko(error.httpCode ?? 500, error.content);
92
+ else response = HttpResponse.ko(500, null);
95
93
 
96
94
  } finally {
97
95
  let status = response?.httpCode ?? 500;
@@ -56,6 +56,8 @@ export default abstract class RepositoryDatabase extends Repository
56
56
 
57
57
  abstract find<E>(tableName: string, filters: { [key: string]: Primitive | Array<any> }): Promise<E[]>;
58
58
 
59
+ abstract group(tableName: string, key: string, value: string, filters: { [p: string]: Primitive | Array<any> }): Promise<{ [p: string]: string[] }>
60
+
59
61
  abstract add<E>(tableName: string, object: {[key:string]:Primitive}|any, id?: string): Promise<E>;
60
62
 
61
63
  abstract addAll<T>(tableName: string, objects: ({[key:string]:Primitive }|any)[]): Promise<T[]>;
@@ -11,7 +11,6 @@ export interface Column {
11
11
  export default class RepositoryDatabasePostgres extends RepositoryDatabase
12
12
  {
13
13
  private readonly introspectIntervalTime: number = 60 * 60 * 1000;
14
-
15
14
  protected client!: any;
16
15
 
17
16
  private tables: { [key: string]: Column[] } = {};
@@ -81,6 +80,20 @@ export default class RepositoryDatabasePostgres extends RepositoryDatabase
81
80
  return this.query<T>(query, values);
82
81
  }
83
82
 
83
+ async group(tableName: string, key: string, value: string, filters: { [p: string]: Primitive | Array<any> }): Promise<{ [p: string]: any[] }> {
84
+ if (!this.tables[tableName]) throw new Error(`table ${tableName} does not exist`);
85
+ let schema = this.tables[tableName][0].schema;
86
+ let { where, values } = this.toWhere(tableName, filters);
87
+ let query = `SELECT ${key} as key, array_agg(${value}) as values
88
+ FROM ${schema}.${tableName}
89
+ WHERE ${where} GROUP BY ${key}`
90
+ return this.query<{ key: string, values: any[] }>(query).then((map) => {
91
+ let group: { [p: string]: string[] } = {}
92
+ for (let elem of map) group[elem.key] = elem.values;
93
+ return group;
94
+ });
95
+ }
96
+
84
97
  async add<E>(tableName: string, object: {[key:string]:Primitive}|any, id?: string): Promise<E>
85
98
  {
86
99
  return this.addAll<E>(tableName, [ { id: id, ...object } ]).then((rows) => rows[0]);