@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.
@@ -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;
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"postgresstore.js","sourceRoot":"","sources":["../src/postgresstore.ts"],"names":[],"mappings":"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"}