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.
- package/dist/js/api/ServiceRestFormalTemplate.js +19 -0
- package/dist/js/business/BusinessServer.js +4 -7
- package/dist/js/repository/RepositoryDatabasePostgres.js +17 -0
- package/dist/types/api/ServiceRestFormalTemplate.d.ts +16 -0
- package/dist/types/repository/RepositoryDatabase.d.ts +5 -0
- package/dist/types/repository/RepositoryDatabasePostgres.d.ts +5 -0
- package/package.json +1 -1
- package/src/main/node/api/ServiceRestFormalTemplate.ts +19 -0
- package/src/main/node/business/BusinessServer.ts +1 -3
- package/src/main/node/repository/RepositoryDatabase.ts +2 -0
- package/src/main/node/repository/RepositoryDatabasePostgres.ts +14 -1
|
@@ -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
|
|
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(
|
|
132
|
+
response = Service_1.HttpResponse.ko(500, null);
|
|
136
133
|
}
|
|
137
134
|
finally {
|
|
138
|
-
let status = (
|
|
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
|
-
(
|
|
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
|
@@ -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
|
-
|
|
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]);
|