@webda/postgres 4.0.0-beta.1 → 4.0.0-beta.3
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/README.md +125 -0
- package/lib/index.d.ts +4 -1
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +3 -1
- package/lib/index.js.map +1 -1
- package/lib/pgpool.d.ts +40 -0
- package/lib/pgpool.d.ts.map +1 -0
- package/lib/pgpool.js +101 -0
- package/lib/pgpool.js.map +1 -0
- package/lib/postgrespubsub.service.d.ts +131 -0
- package/lib/postgrespubsub.service.d.ts.map +1 -0
- package/lib/postgrespubsub.service.js +208 -0
- package/lib/postgrespubsub.service.js.map +1 -0
- package/lib/postgresqueue.service.d.ts +144 -0
- package/lib/postgresqueue.service.d.ts.map +1 -0
- package/lib/postgresqueue.service.js +210 -0
- package/lib/postgresqueue.service.js.map +1 -0
- package/lib/postgresstore.service.d.ts +132 -0
- package/lib/postgresstore.service.d.ts.map +1 -0
- package/lib/postgresstore.service.js +327 -0
- package/lib/postgresstore.service.js.map +1 -0
- package/lib/sqlstore.d.ts +122 -40
- package/lib/sqlstore.d.ts.map +1 -0
- package/lib/sqlstore.js +313 -103
- package/lib/sqlstore.js.map +1 -1
- package/package.json +33 -30
- package/test/config.json +2 -53
- package/webda.module.json +2386 -2414
- package/lib/postgresstore.d.ts +0 -114
- package/lib/postgresstore.js +0 -271
- package/lib/postgresstore.js.map +0 -1
package/lib/postgresstore.d.ts
DELETED
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import { CoreModel } from "@webda/core";
|
|
2
|
-
import pg, { ClientConfig, PoolConfig } from "pg";
|
|
3
|
-
import { SQLResult, SQLStore, SQLStoreParameters } from "./sqlstore.js";
|
|
4
|
-
/**
|
|
5
|
-
*
|
|
6
|
-
*/
|
|
7
|
-
export declare class PostgresParameters extends SQLStoreParameters {
|
|
8
|
-
/**
|
|
9
|
-
* @default true
|
|
10
|
-
*/
|
|
11
|
-
usePool?: boolean;
|
|
12
|
-
/**
|
|
13
|
-
* By default use environment variables
|
|
14
|
-
*/
|
|
15
|
-
postgresqlServer?: ClientConfig | PoolConfig;
|
|
16
|
-
/**
|
|
17
|
-
* Auto create table if not exists
|
|
18
|
-
* @default true
|
|
19
|
-
*/
|
|
20
|
-
autoCreateTable?: boolean;
|
|
21
|
-
/**
|
|
22
|
-
* View name prefix
|
|
23
|
-
*/
|
|
24
|
-
viewPrefix?: string;
|
|
25
|
-
/**
|
|
26
|
-
* Regexp of models to include
|
|
27
|
-
*
|
|
28
|
-
* @default [".*"]
|
|
29
|
-
*/
|
|
30
|
-
views?: string[];
|
|
31
|
-
constructor(params: any, store: PostgresStore);
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Store data within PostgreSQL with JSONB
|
|
35
|
-
*
|
|
36
|
-
* The table should be created before with
|
|
37
|
-
|
|
38
|
-
* ```sql
|
|
39
|
-
* CREATE TABLE IF NOT EXISTS ${tableName}
|
|
40
|
-
* (
|
|
41
|
-
* uuid uuid NOT NULL,
|
|
42
|
-
* data jsonb,
|
|
43
|
-
* CONSTRAINT ${tableName}_pkey PRIMARY KEY (uuid)
|
|
44
|
-
* );
|
|
45
|
-
* ```
|
|
46
|
-
*
|
|
47
|
-
* @WebdaModda
|
|
48
|
-
*/
|
|
49
|
-
export declare class PostgresStore<T extends CoreModel = CoreModel, K extends PostgresParameters = PostgresParameters> extends SQLStore<T, K> {
|
|
50
|
-
client: pg.Client | pg.Pool;
|
|
51
|
-
/**
|
|
52
|
-
* @override
|
|
53
|
-
*/
|
|
54
|
-
loadParameters(params: any): PostgresParameters;
|
|
55
|
-
/**
|
|
56
|
-
* @override
|
|
57
|
-
*/
|
|
58
|
-
init(): Promise<this>;
|
|
59
|
-
/**
|
|
60
|
-
* Ensure your table exists
|
|
61
|
-
*/
|
|
62
|
-
checkTable(): Promise<void>;
|
|
63
|
-
/**
|
|
64
|
-
* Return the postgresql client
|
|
65
|
-
* @returns
|
|
66
|
-
*/
|
|
67
|
-
getClient(): pg.Client | pg.Pool;
|
|
68
|
-
/**
|
|
69
|
-
* Execute a query on the server
|
|
70
|
-
*
|
|
71
|
-
* @param query
|
|
72
|
-
* @returns
|
|
73
|
-
*/
|
|
74
|
-
executeQuery(query: string, values?: any[]): Promise<SQLResult<T>>;
|
|
75
|
-
/**
|
|
76
|
-
* Create views for each models
|
|
77
|
-
*
|
|
78
|
-
* @param [prefix=""] prefix to add to the view name
|
|
79
|
-
* @param [skips=[]] list of models to skip
|
|
80
|
-
*/
|
|
81
|
-
createViews(): Promise<void>;
|
|
82
|
-
/**
|
|
83
|
-
* @override
|
|
84
|
-
*/
|
|
85
|
-
mapExpressionAttribute(attribute: string[]): string;
|
|
86
|
-
/**
|
|
87
|
-
* @override
|
|
88
|
-
*/
|
|
89
|
-
_patch(object: any, uid: string, itemWriteCondition?: any, itemWriteConditionField?: string): Promise<any>;
|
|
90
|
-
/**
|
|
91
|
-
* @override
|
|
92
|
-
*/
|
|
93
|
-
_removeAttribute(uuid: string, attribute: string, itemWriteCondition?: any, itemWriteConditionField?: string): Promise<void>;
|
|
94
|
-
/**
|
|
95
|
-
* @override
|
|
96
|
-
*/
|
|
97
|
-
getQueryCondition(itemWriteCondition: any, itemWriteConditionField: string, params: any[]): string;
|
|
98
|
-
/**
|
|
99
|
-
* @override
|
|
100
|
-
*/
|
|
101
|
-
_incrementAttributes(uid: string, params: {
|
|
102
|
-
property: string;
|
|
103
|
-
value: number;
|
|
104
|
-
}[], updateDate: Date): Promise<any>;
|
|
105
|
-
/**
|
|
106
|
-
* @override
|
|
107
|
-
*/
|
|
108
|
-
_upsertItemToCollection(uuid: string, attribute: string, item: any, index: number, itemWriteCondition: any, itemWriteConditionField: string, updateDate: Date): Promise<any>;
|
|
109
|
-
/**
|
|
110
|
-
* @override
|
|
111
|
-
*/
|
|
112
|
-
_deleteItemFromCollection(uuid: string, attribute: string, index: number, itemWriteCondition: any, itemWriteConditionField: string, updateDate: Date): Promise<any>;
|
|
113
|
-
}
|
|
114
|
-
export default PostgresStore;
|
package/lib/postgresstore.js
DELETED
|
@@ -1,271 +0,0 @@
|
|
|
1
|
-
import { RegExpStringValidator, StoreNotFoundError, UpdateConditionFailError } from "@webda/core";
|
|
2
|
-
import pg from "pg";
|
|
3
|
-
import { SQLStore, SQLStoreParameters } from "./sqlstore.js";
|
|
4
|
-
/*
|
|
5
|
-
* Ideas:
|
|
6
|
-
* - Make views for each models to have a better query: https://dba.stackexchange.com/questions/151838/postgresql-json-column-to-view
|
|
7
|
-
* - CREATE VIEW my_view AS SELECT uuid,data->>'status' as status from table;
|
|
8
|
-
* - could auto resolve FK
|
|
9
|
-
* - Use STORED generated model to define FK: https://stackoverflow.com/questions/24489647/json-foreign-keys-in-postgresql
|
|
10
|
-
* - FKs should be defined based on relationship
|
|
11
|
-
* - Define colums dynamically based on the schema -> benchmark to see if it is useful
|
|
12
|
-
* - Allow to define indexes on fields
|
|
13
|
-
*/
|
|
14
|
-
/**
|
|
15
|
-
*
|
|
16
|
-
*/
|
|
17
|
-
export class PostgresParameters extends SQLStoreParameters {
|
|
18
|
-
constructor(params, store) {
|
|
19
|
-
super(params, store);
|
|
20
|
-
this.autoCreateTable ?? (this.autoCreateTable = true);
|
|
21
|
-
this.usePool ?? (this.usePool = false);
|
|
22
|
-
this.viewPrefix ?? (this.viewPrefix = "");
|
|
23
|
-
this.views ?? (this.views = ["regex:.*"]);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* Store data within PostgreSQL with JSONB
|
|
28
|
-
*
|
|
29
|
-
* The table should be created before with
|
|
30
|
-
|
|
31
|
-
* ```sql
|
|
32
|
-
* CREATE TABLE IF NOT EXISTS ${tableName}
|
|
33
|
-
* (
|
|
34
|
-
* uuid uuid NOT NULL,
|
|
35
|
-
* data jsonb,
|
|
36
|
-
* CONSTRAINT ${tableName}_pkey PRIMARY KEY (uuid)
|
|
37
|
-
* );
|
|
38
|
-
* ```
|
|
39
|
-
*
|
|
40
|
-
* @WebdaModda
|
|
41
|
-
*/
|
|
42
|
-
export class PostgresStore extends SQLStore {
|
|
43
|
-
/**
|
|
44
|
-
* @override
|
|
45
|
-
*/
|
|
46
|
-
loadParameters(params) {
|
|
47
|
-
return new PostgresParameters(params, this);
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* @override
|
|
51
|
-
*/
|
|
52
|
-
async init() {
|
|
53
|
-
if (this.parameters.usePool) {
|
|
54
|
-
this.client = new pg.Pool(this.parameters.postgresqlServer);
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
this.client = new pg.Client(this.parameters.postgresqlServer);
|
|
58
|
-
}
|
|
59
|
-
await this.client.connect();
|
|
60
|
-
await this.checkTable();
|
|
61
|
-
await super.init();
|
|
62
|
-
return this;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Ensure your table exists
|
|
66
|
-
*/
|
|
67
|
-
async checkTable() {
|
|
68
|
-
if (!this.parameters.autoCreateTable) {
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
this.log("DEBUG", `CREATE TABLE IF NOT EXISTS ${this.parameters.table} (uuid VARCHAR(255) NOT NULL, data jsonb, CONSTRAINT ${this.parameters.table}_pkey PRIMARY KEY (uuid))`);
|
|
72
|
-
await this.client.query(`CREATE TABLE IF NOT EXISTS ${this.parameters.table} (uuid VARCHAR(255) NOT NULL, data jsonb, CONSTRAINT ${this.parameters.table}_pkey PRIMARY KEY (uuid))`);
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Return the postgresql client
|
|
76
|
-
* @returns
|
|
77
|
-
*/
|
|
78
|
-
getClient() {
|
|
79
|
-
return this.client;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Execute a query on the server
|
|
83
|
-
*
|
|
84
|
-
* @param query
|
|
85
|
-
* @returns
|
|
86
|
-
*/
|
|
87
|
-
async executeQuery(query, values = []) {
|
|
88
|
-
this.log("DEBUG", "Query", query);
|
|
89
|
-
let res = await this.client.query(query, values);
|
|
90
|
-
return {
|
|
91
|
-
rows: res.rows.map(r => this.initModel(r.data)),
|
|
92
|
-
rowCount: res.rowCount
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Create views for each models
|
|
97
|
-
*
|
|
98
|
-
* @param [prefix=""] prefix to add to the view name
|
|
99
|
-
* @param [skips=[]] list of models to skip
|
|
100
|
-
*/
|
|
101
|
-
async createViews() {
|
|
102
|
-
// CREATE VIEW my_view AS SELECT uuid,data->>'status' as status from table;
|
|
103
|
-
const webda = this.getWebda();
|
|
104
|
-
const models = webda.getModels();
|
|
105
|
-
const app = webda.getApplication();
|
|
106
|
-
const validator = new RegExpStringValidator(this.parameters.views);
|
|
107
|
-
for (let model of Object.values(models)) {
|
|
108
|
-
const store = webda.getModelStore(model);
|
|
109
|
-
if (!(store instanceof PostgresStore)) {
|
|
110
|
-
continue;
|
|
111
|
-
}
|
|
112
|
-
const fields = ["uuid"];
|
|
113
|
-
const schema = model.getSchema();
|
|
114
|
-
console.log("SCHEMA", schema, model.getIdentifier(false), validator.validate(model.getIdentifier(false)), this.parameters.views);
|
|
115
|
-
if (!schema || !validator.validate(model.getIdentifier(false))) {
|
|
116
|
-
continue;
|
|
117
|
-
}
|
|
118
|
-
const plural = webda.getApplication().getModelPlural(model.getIdentifier());
|
|
119
|
-
for (let field of Object.keys(schema.properties)) {
|
|
120
|
-
if (field === "uuid" || !field.match(/^[0-9a-zA-Z-_$]+$/)) {
|
|
121
|
-
continue;
|
|
122
|
-
}
|
|
123
|
-
let cast = "";
|
|
124
|
-
let type = schema.properties[field].type;
|
|
125
|
-
if (type === "number") {
|
|
126
|
-
cast = "::bigint";
|
|
127
|
-
}
|
|
128
|
-
else if (type === "boolean") {
|
|
129
|
-
cast = "::boolean";
|
|
130
|
-
}
|
|
131
|
-
else if (type === "string") {
|
|
132
|
-
cast = "::text";
|
|
133
|
-
}
|
|
134
|
-
else if (type === "array") {
|
|
135
|
-
cast = "::jsonb";
|
|
136
|
-
}
|
|
137
|
-
else if (type === "object") {
|
|
138
|
-
cast = "::jsonb";
|
|
139
|
-
}
|
|
140
|
-
fields.push(`(data->>'${field}')${cast} as ${field}`);
|
|
141
|
-
}
|
|
142
|
-
let query = `CREATE OR REPLACE VIEW ${this.parameters.viewPrefix}${plural} AS SELECT ${fields.join(",")} FROM ${store.getParameters().table}`;
|
|
143
|
-
if (store.handleModel(model) > 0) {
|
|
144
|
-
query += ` WHERE (data#>>'{__types}')::jsonb ? '${app.getShortId(app.getModelName(model))}'`;
|
|
145
|
-
}
|
|
146
|
-
try {
|
|
147
|
-
this.log("INFO", "Dropping view");
|
|
148
|
-
await store.getClient().query(`DROP VIEW IF EXISTS ${this.parameters.viewPrefix}${plural}`);
|
|
149
|
-
this.log("INFO", query);
|
|
150
|
-
await store.getClient().query(query);
|
|
151
|
-
}
|
|
152
|
-
catch (err) {
|
|
153
|
-
this.log("ERROR", err);
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* @override
|
|
159
|
-
*/
|
|
160
|
-
mapExpressionAttribute(attribute) {
|
|
161
|
-
return `data#>>'{${attribute.join(",")}}'`;
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* @override
|
|
165
|
-
*/
|
|
166
|
-
async _patch(object, uid, itemWriteCondition, itemWriteConditionField) {
|
|
167
|
-
let query = `UPDATE ${this.parameters.table} SET data = data || $1::jsonb WHERE uuid = $2`;
|
|
168
|
-
const args = [JSON.stringify(object), this.getUuid(uid)];
|
|
169
|
-
if (itemWriteCondition) {
|
|
170
|
-
query += this.getQueryCondition(itemWriteCondition, itemWriteConditionField, args);
|
|
171
|
-
}
|
|
172
|
-
let res = await this.sqlQuery(query, args);
|
|
173
|
-
if (res.rowCount === 0) {
|
|
174
|
-
throw new UpdateConditionFailError(uid, itemWriteConditionField, itemWriteCondition);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* @override
|
|
179
|
-
*/
|
|
180
|
-
async _removeAttribute(uuid, attribute, itemWriteCondition, itemWriteConditionField) {
|
|
181
|
-
let query = `UPDATE ${this.parameters.table} SET data = data - $1 WHERE uuid = $2`;
|
|
182
|
-
const args = [attribute, this.getUuid(uuid)];
|
|
183
|
-
if (itemWriteCondition) {
|
|
184
|
-
query += this.getQueryCondition(itemWriteCondition, itemWriteConditionField, args);
|
|
185
|
-
}
|
|
186
|
-
let res = await this.sqlQuery(query, args);
|
|
187
|
-
if (res.rowCount === 0) {
|
|
188
|
-
if (itemWriteCondition) {
|
|
189
|
-
throw new UpdateConditionFailError(uuid, itemWriteConditionField, itemWriteCondition);
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
throw new StoreNotFoundError(uuid, this.getName());
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
/**
|
|
197
|
-
* @override
|
|
198
|
-
*/
|
|
199
|
-
getQueryCondition(itemWriteCondition, itemWriteConditionField, params) {
|
|
200
|
-
let condition = itemWriteCondition instanceof Date ? itemWriteCondition.toISOString() : itemWriteCondition;
|
|
201
|
-
params.push(condition);
|
|
202
|
-
return ` AND data->>'${itemWriteConditionField}'=$${params.length}`;
|
|
203
|
-
}
|
|
204
|
-
/**
|
|
205
|
-
* @override
|
|
206
|
-
*/
|
|
207
|
-
async _incrementAttributes(uid, params, updateDate) {
|
|
208
|
-
let data = "data";
|
|
209
|
-
const args = [this.getUuid(uid)];
|
|
210
|
-
params.forEach((p, index) => {
|
|
211
|
-
args.push(p.value);
|
|
212
|
-
data = `jsonb_set(${data}, '{${p.property}}', (COALESCE(data->>'${p.property}','0')::int + $${index + 2})::text::jsonb)::jsonb`;
|
|
213
|
-
});
|
|
214
|
-
let query = `UPDATE ${this.parameters.table} SET data = jsonb_set(${data}, '{_lastUpdate}', '"${updateDate.toISOString()}"'::jsonb) WHERE uuid = $1`;
|
|
215
|
-
let res = await this.sqlQuery(query, args);
|
|
216
|
-
if (res.rowCount === 0) {
|
|
217
|
-
throw new StoreNotFoundError(uid, this.getName());
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* @override
|
|
222
|
-
*/
|
|
223
|
-
async _upsertItemToCollection(uuid, attribute, item, index, itemWriteCondition, itemWriteConditionField, updateDate) {
|
|
224
|
-
let query = `UPDATE ${this.parameters.table} SET data = jsonb_set(jsonb_set(data::jsonb, array['${attribute}'],`;
|
|
225
|
-
const args = [this.getUuid(uuid)];
|
|
226
|
-
if (index === undefined) {
|
|
227
|
-
query += `COALESCE((data->'${attribute}')::jsonb, '[]'::jsonb) || '[${JSON.stringify(item)}]'::jsonb)::jsonb`;
|
|
228
|
-
}
|
|
229
|
-
else {
|
|
230
|
-
query += `jsonb_set(COALESCE((data->'${attribute}')::jsonb, '[]'::jsonb), '{${index}}', '${JSON.stringify(item)}'::jsonb)::jsonb)`;
|
|
231
|
-
}
|
|
232
|
-
query += `, '{_lastUpdate}', '"${updateDate.toISOString()}"'::jsonb) WHERE uuid = $1`;
|
|
233
|
-
if (itemWriteCondition) {
|
|
234
|
-
args.push(itemWriteCondition);
|
|
235
|
-
query += ` AND (data#>>'{${attribute}, ${index}}')::jsonb->>'${itemWriteConditionField}'=$${args.length}`;
|
|
236
|
-
}
|
|
237
|
-
let res = await this.sqlQuery(query, args);
|
|
238
|
-
if (res.rowCount === 0) {
|
|
239
|
-
if (itemWriteCondition) {
|
|
240
|
-
throw new UpdateConditionFailError(uuid, itemWriteConditionField, itemWriteCondition);
|
|
241
|
-
}
|
|
242
|
-
else {
|
|
243
|
-
throw new StoreNotFoundError(uuid, this.getName());
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
/**
|
|
248
|
-
* @override
|
|
249
|
-
*/
|
|
250
|
-
async _deleteItemFromCollection(uuid, attribute, index, itemWriteCondition, itemWriteConditionField, updateDate) {
|
|
251
|
-
let query = `UPDATE ${this.parameters.table} SET data = jsonb_set(jsonb_set(data::jsonb, array['${attribute}'], COALESCE(`;
|
|
252
|
-
const args = [this.getUuid(uuid)];
|
|
253
|
-
query += `((data->'${attribute}')::jsonb - ${index})`;
|
|
254
|
-
query += `, '[]'::jsonb))::jsonb, '{_lastUpdate}', '"${updateDate.toISOString()}"'::jsonb) WHERE uuid = $1`;
|
|
255
|
-
if (itemWriteCondition) {
|
|
256
|
-
args.push(itemWriteCondition);
|
|
257
|
-
query += ` AND (data#>>'{${attribute}, ${index}}')::jsonb->>'${itemWriteConditionField}'=$2`;
|
|
258
|
-
}
|
|
259
|
-
let res = await this.sqlQuery(query, args);
|
|
260
|
-
if (res.rowCount === 0) {
|
|
261
|
-
if (itemWriteCondition) {
|
|
262
|
-
throw new UpdateConditionFailError(uuid, itemWriteConditionField, itemWriteCondition);
|
|
263
|
-
}
|
|
264
|
-
else {
|
|
265
|
-
throw new StoreNotFoundError(uuid, this.getName());
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
export default PostgresStore;
|
|
271
|
-
//# sourceMappingURL=postgresstore.js.map
|
package/lib/postgresstore.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"postgresstore.js","sourceRoot":"","sources":["../src/postgresstore.ts"],"names":[],"mappings":"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"}
|