ismx-nexo-node-app 0.3.70 → 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/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/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);
|
|
@@ -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
|
}
|
|
@@ -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]);
|