jinaga-server 2.1.8 → 2.2.0
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/jinaga-server.d.ts +2 -0
- package/dist/jinaga-server.js +13 -2
- package/dist/jinaga-server.js.map +1 -1
- package/dist/postgres/postgres-keystore.d.ts +2 -1
- package/dist/postgres/postgres-keystore.js +5 -4
- package/dist/postgres/postgres-keystore.js.map +1 -1
- package/dist/postgres/postgres-store.d.ts +2 -1
- package/dist/postgres/postgres-store.js +54 -53
- package/dist/postgres/postgres-store.js.map +1 -1
- package/dist/postgres/specification-result-sql.d.ts +1 -1
- package/dist/postgres/specification-result-sql.js +21 -21
- package/dist/postgres/specification-result-sql.js.map +1 -1
- package/dist/postgres/specification-sql.d.ts +2 -2
- package/dist/postgres/specification-sql.js +19 -19
- package/dist/postgres/specification-sql.js.map +1 -1
- package/dist/postgres/sql.d.ts +1 -1
- package/dist/postgres/sql.js +14 -14
- package/dist/postgres/sql.js.map +1 -1
- package/package.json +2 -2
- package/src/jinaga-server.ts +19 -3
- package/src/postgres/postgres-keystore.ts +4 -4
- package/src/postgres/postgres-store.ts +53 -53
- package/src/postgres/specification-result-sql.ts +21 -21
- package/src/postgres/specification-sql.ts +19 -19
- package/src/postgres/sql.ts +14 -14
- package/test/postgres/postgresReadSpec.ts +1 -1
- package/test/postgres/postgresSpec.ts +1 -1
- package/test/postgres/postgresSpecificationSpec.ts +1 -1
package/dist/jinaga-server.d.ts
CHANGED
|
@@ -3,7 +3,9 @@ import { AuthorizationRules, Jinaga, Model } from "jinaga";
|
|
|
3
3
|
import { Pool } from "pg";
|
|
4
4
|
export declare type JinagaServerConfig = {
|
|
5
5
|
pgStore?: string | Pool;
|
|
6
|
+
pgStoreSchema?: string;
|
|
6
7
|
pgKeystore?: string | Pool;
|
|
8
|
+
pgKeystoreSchema?: string;
|
|
7
9
|
httpEndpoint?: string;
|
|
8
10
|
model?: Model;
|
|
9
11
|
authorization?: (a: AuthorizationRules) => AuthorizationRules;
|
package/dist/jinaga-server.js
CHANGED
|
@@ -61,7 +61,7 @@ exports.JinagaServer = JinagaServer;
|
|
|
61
61
|
function createStore(config, pools) {
|
|
62
62
|
if (config.pgStore) {
|
|
63
63
|
const pool = getPool(config.pgStore, pools);
|
|
64
|
-
const store = new postgres_store_1.PostgresStore(pool);
|
|
64
|
+
const store = new postgres_store_1.PostgresStore(pool, validateSchema(config.pgStoreSchema));
|
|
65
65
|
return store;
|
|
66
66
|
}
|
|
67
67
|
else {
|
|
@@ -86,7 +86,7 @@ function createKeystore(config, pools) {
|
|
|
86
86
|
const uriOrPool = config.pgKeystore;
|
|
87
87
|
if (uriOrPool) {
|
|
88
88
|
const pool = getPool(uriOrPool, pools);
|
|
89
|
-
const keystore = new postgres_keystore_1.PostgresKeystore(pool);
|
|
89
|
+
const keystore = new postgres_keystore_1.PostgresKeystore(pool, validateSchema(config.pgKeystoreSchema));
|
|
90
90
|
return keystore;
|
|
91
91
|
}
|
|
92
92
|
else {
|
|
@@ -183,4 +183,15 @@ function withSession(store, keystore, authorizationRules, req, callback) {
|
|
|
183
183
|
yield callback(j);
|
|
184
184
|
});
|
|
185
185
|
}
|
|
186
|
+
function validateSchema(schema) {
|
|
187
|
+
if (!schema) {
|
|
188
|
+
return "public";
|
|
189
|
+
}
|
|
190
|
+
// Verify that the schema is a valid Postgres schema name.
|
|
191
|
+
// https://www.postgresql.org/docs/9.1/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS
|
|
192
|
+
if (!/^[a-z_][a-z0-9_$]*$/.test(schema)) {
|
|
193
|
+
throw new Error(`Invalid schema name: ${schema}. Schema names must start with a letter or underscore, and contain only letters, numbers, and underscores.`);
|
|
194
|
+
}
|
|
195
|
+
return schema;
|
|
196
|
+
}
|
|
186
197
|
//# sourceMappingURL=jinaga-server.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jinaga-server.js","sourceRoot":"","sources":["../src/jinaga-server.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,mCAsBgB;AAChB,2BAA0B;AAE1B,kFAA8E;AAC9E,oFAAgF;AAChF,mFAA+E;AAC/E,gDAAsD;AACtD,0CAAwD;AAExD,kEAA6D;AAC7D,oEAAgE;AAChE,8DAA0D;
|
|
1
|
+
{"version":3,"file":"jinaga-server.js","sourceRoot":"","sources":["../src/jinaga-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,9 +2,10 @@ import { FactEnvelope, FactRecord, UserIdentity } from "jinaga";
|
|
|
2
2
|
import { Pool } from "pg";
|
|
3
3
|
import { Keystore } from "../keystore";
|
|
4
4
|
export declare class PostgresKeystore implements Keystore {
|
|
5
|
+
private schema;
|
|
5
6
|
private connectionFactory;
|
|
6
7
|
private cache;
|
|
7
|
-
constructor(pool: Pool);
|
|
8
|
+
constructor(pool: Pool, schema: string);
|
|
8
9
|
getOrCreateUserFact(userIdentity: UserIdentity): Promise<FactRecord>;
|
|
9
10
|
getOrCreateDeviceFact(deviceIdentity: UserIdentity): Promise<FactRecord>;
|
|
10
11
|
getUserFact(userIdentity: UserIdentity): Promise<FactRecord>;
|
|
@@ -15,7 +15,8 @@ const node_forge_1 = require("node-forge");
|
|
|
15
15
|
const connection_1 = require("./connection");
|
|
16
16
|
;
|
|
17
17
|
class PostgresKeystore {
|
|
18
|
-
constructor(pool) {
|
|
18
|
+
constructor(pool, schema) {
|
|
19
|
+
this.schema = schema;
|
|
19
20
|
this.cache = new Map();
|
|
20
21
|
this.connectionFactory = new connection_1.ConnectionFactory(pool);
|
|
21
22
|
}
|
|
@@ -77,7 +78,7 @@ class PostgresKeystore {
|
|
|
77
78
|
}
|
|
78
79
|
selectKeyPair(connection, userIdentity) {
|
|
79
80
|
return __awaiter(this, void 0, void 0, function* () {
|
|
80
|
-
const { rows } = yield connection.query(
|
|
81
|
+
const { rows } = yield connection.query(`SELECT public_key, private_key FROM ${this.schema}.user WHERE provider = $1 AND user_identifier = $2`, [userIdentity.provider, userIdentity.id]);
|
|
81
82
|
if (rows.length > 1) {
|
|
82
83
|
throw new Error('Duplicate entries found in the keystore');
|
|
83
84
|
}
|
|
@@ -104,7 +105,7 @@ class PostgresKeystore {
|
|
|
104
105
|
}
|
|
105
106
|
selectOrInsertKeyPair(connection, userIdentity) {
|
|
106
107
|
return __awaiter(this, void 0, void 0, function* () {
|
|
107
|
-
const { rows } = yield connection.query(
|
|
108
|
+
const { rows } = yield connection.query(`SELECT public_key, private_key FROM ${this.schema}.user WHERE provider = $1 AND user_identifier = $2`, [userIdentity.provider, userIdentity.id]);
|
|
108
109
|
if (rows.length > 1) {
|
|
109
110
|
throw new Error('Duplicate entries found in the keystore');
|
|
110
111
|
}
|
|
@@ -124,7 +125,7 @@ class PostgresKeystore {
|
|
|
124
125
|
const keypair = node_forge_1.pki.rsa.generateKeyPair({ bits: 2048 });
|
|
125
126
|
const privatePem = node_forge_1.pki.privateKeyToPem(keypair.privateKey);
|
|
126
127
|
const publicPem = node_forge_1.pki.publicKeyToPem(keypair.publicKey);
|
|
127
|
-
yield connection.query(
|
|
128
|
+
yield connection.query(`INSERT INTO ${this.schema}.user (provider, user_identifier, private_key, public_key) VALUES ($1, $2, $3, $4)`, [userIdentity.provider, userIdentity.id, privatePem, publicPem]);
|
|
128
129
|
return { publicPem, privatePem };
|
|
129
130
|
});
|
|
130
131
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres-keystore.js","sourceRoot":"","sources":["../../src/postgres/postgres-keystore.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,mCAA6H;AAC7H,2CAA2C;AAI3C,6CAAiD;AAKhD,CAAC;AAEF,MAAa,gBAAgB;IAIzB,YAAa,IAAU;
|
|
1
|
+
{"version":3,"file":"postgres-keystore.js","sourceRoot":"","sources":["../../src/postgres/postgres-keystore.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,10 +2,11 @@ import { FactEnvelope, FactFeed, FactPath, FactRecord, FactReference, Feed, Quer
|
|
|
2
2
|
import { Pool } from "pg";
|
|
3
3
|
import { FactTypeMap, RoleMap } from "./maps";
|
|
4
4
|
export declare class PostgresStore implements Storage {
|
|
5
|
+
private schema;
|
|
5
6
|
private connectionFactory;
|
|
6
7
|
private factTypeMap;
|
|
7
8
|
private roleMap;
|
|
8
|
-
constructor(pool: Pool);
|
|
9
|
+
constructor(pool: Pool, schema: string);
|
|
9
10
|
close(): Promise<void>;
|
|
10
11
|
save(envelopes: FactEnvelope[]): Promise<FactEnvelope[]>;
|
|
11
12
|
query(start: FactReference, query: Query): Promise<FactPath[]>;
|
|
@@ -53,7 +53,8 @@ function loadFactPath(pathLength, factTypeNames, r) {
|
|
|
53
53
|
return path;
|
|
54
54
|
}
|
|
55
55
|
class PostgresStore {
|
|
56
|
-
constructor(pool) {
|
|
56
|
+
constructor(pool, schema) {
|
|
57
|
+
this.schema = schema;
|
|
57
58
|
this.factTypeMap = (0, maps_1.emptyFactTypeMap)();
|
|
58
59
|
this.roleMap = (0, maps_1.emptyRoleMap)();
|
|
59
60
|
this.connectionFactory = new connection_1.ConnectionFactory(pool);
|
|
@@ -69,8 +70,8 @@ class PostgresStore {
|
|
|
69
70
|
throw new Error('Attempted to save a fact with no hash or type.');
|
|
70
71
|
}
|
|
71
72
|
const { newEnvelopes, factTypes, roles } = yield this.connectionFactory.withTransaction((connection) => __awaiter(this, void 0, void 0, function* () {
|
|
72
|
-
const factTypes = yield storeFactTypes(facts, this.factTypeMap, connection);
|
|
73
|
-
const existingFacts = yield findExistingFacts(facts, factTypes, connection);
|
|
73
|
+
const factTypes = yield storeFactTypes(facts, this.factTypeMap, connection, this.schema);
|
|
74
|
+
const existingFacts = yield findExistingFacts(facts, factTypes, connection, this.schema);
|
|
74
75
|
const newFacts = facts.filter(f => !(0, maps_1.hasFact)(existingFacts, f.hash, (0, maps_1.ensureGetFactTypeId)(factTypes, f.type)));
|
|
75
76
|
if (newFacts.length === 0) {
|
|
76
77
|
return {
|
|
@@ -79,8 +80,8 @@ class PostgresStore {
|
|
|
79
80
|
roles: (0, maps_1.emptyRoleMap)()
|
|
80
81
|
};
|
|
81
82
|
}
|
|
82
|
-
const roles = yield storeRoles(newFacts, factTypes, (0, maps_1.copyRoleMap)(this.roleMap), connection);
|
|
83
|
-
const allFacts = yield insertFactsEdgesAndAncestors(newFacts, factTypes, existingFacts, connection, roles);
|
|
83
|
+
const roles = yield storeRoles(newFacts, factTypes, (0, maps_1.copyRoleMap)(this.roleMap), connection, this.schema);
|
|
84
|
+
const allFacts = yield insertFactsEdgesAndAncestors(newFacts, factTypes, existingFacts, connection, roles, this.schema);
|
|
84
85
|
const newEnvelopes = envelopes.filter(envelope => newFacts.some((0, jinaga_1.factReferenceEquals)(envelope.fact)));
|
|
85
86
|
if (newEnvelopes.length === 0) {
|
|
86
87
|
return {
|
|
@@ -89,8 +90,8 @@ class PostgresStore {
|
|
|
89
90
|
roles
|
|
90
91
|
};
|
|
91
92
|
}
|
|
92
|
-
const publicKeys = yield storePublicKeys(newEnvelopes, connection);
|
|
93
|
-
yield insertSignatures(newEnvelopes, allFacts, factTypes, publicKeys, connection);
|
|
93
|
+
const publicKeys = yield storePublicKeys(newEnvelopes, connection, this.schema);
|
|
94
|
+
yield insertSignatures(newEnvelopes, allFacts, factTypes, publicKeys, connection, this.schema);
|
|
94
95
|
return {
|
|
95
96
|
newEnvelopes,
|
|
96
97
|
factTypes,
|
|
@@ -114,7 +115,7 @@ class PostgresStore {
|
|
|
114
115
|
try {
|
|
115
116
|
const factTypes = yield this.loadFactTypesFromSteps(query.steps, start.type);
|
|
116
117
|
const roleMap = yield this.loadRolesFromSteps(query.steps, factTypes, start.type);
|
|
117
|
-
const sqlQuery = (0, sql_1.sqlFromSteps)(start, query.steps, factTypes, roleMap);
|
|
118
|
+
const sqlQuery = (0, sql_1.sqlFromSteps)(start, query.steps, factTypes, roleMap, this.schema);
|
|
118
119
|
if (!sqlQuery) {
|
|
119
120
|
throw new Error(`Could not generate SQL for query "${query.toDescriptiveString()}" starting at "${start.type}"`);
|
|
120
121
|
}
|
|
@@ -139,7 +140,7 @@ class PostgresStore {
|
|
|
139
140
|
if (start.filter(f => (0, maps_1.getFactTypeId)(factTypes, f.type) === undefined).length > 0) {
|
|
140
141
|
return [];
|
|
141
142
|
}
|
|
142
|
-
const composer = (0, specification_result_sql_1.resultSqlFromSpecification)(start, specification, factTypes, roleMap);
|
|
143
|
+
const composer = (0, specification_result_sql_1.resultSqlFromSpecification)(start, specification, factTypes, roleMap, this.schema);
|
|
143
144
|
if (composer === null) {
|
|
144
145
|
return [];
|
|
145
146
|
}
|
|
@@ -154,7 +155,7 @@ class PostgresStore {
|
|
|
154
155
|
return __awaiter(this, void 0, void 0, function* () {
|
|
155
156
|
const factTypes = yield this.loadFactTypesFromFeed(feed);
|
|
156
157
|
const roleMap = yield this.loadRolesFromFeed(feed, factTypes);
|
|
157
|
-
const sql = (0, specification_sql_1.sqlFromFeed)(feed, bookmark, 100, factTypes, roleMap);
|
|
158
|
+
const sql = (0, specification_sql_1.sqlFromFeed)(feed, this.schema, bookmark, 100, factTypes, roleMap);
|
|
158
159
|
if (!sql) {
|
|
159
160
|
return {
|
|
160
161
|
tuples: [],
|
|
@@ -179,7 +180,7 @@ class PostgresStore {
|
|
|
179
180
|
.filter(fn_1.distinct);
|
|
180
181
|
if (unknownFactTypes.length > 0) {
|
|
181
182
|
const loadedFactTypes = yield this.connectionFactory.with((connection) => __awaiter(this, void 0, void 0, function* () {
|
|
182
|
-
return yield loadFactTypes(unknownFactTypes, connection);
|
|
183
|
+
return yield loadFactTypes(unknownFactTypes, connection, this.schema);
|
|
183
184
|
}));
|
|
184
185
|
const merged = (0, maps_1.mergeFactTypes)(this.factTypeMap, loadedFactTypes);
|
|
185
186
|
this.factTypeMap = merged;
|
|
@@ -195,7 +196,7 @@ class PostgresStore {
|
|
|
195
196
|
.filter(factType => !factTypes.has(factType));
|
|
196
197
|
if (unknownFactTypes.length > 0) {
|
|
197
198
|
const loadedFactTypes = yield this.connectionFactory.with((connection) => __awaiter(this, void 0, void 0, function* () {
|
|
198
|
-
return yield loadFactTypes(unknownFactTypes, connection);
|
|
199
|
+
return yield loadFactTypes(unknownFactTypes, connection, this.schema);
|
|
199
200
|
}));
|
|
200
201
|
const merged = (0, maps_1.mergeFactTypes)(this.factTypeMap, loadedFactTypes);
|
|
201
202
|
this.factTypeMap = merged;
|
|
@@ -211,7 +212,7 @@ class PostgresStore {
|
|
|
211
212
|
.filter(factType => !factTypes.has(factType));
|
|
212
213
|
if (unknownFactTypes.length > 0) {
|
|
213
214
|
const loadedFactTypes = yield this.connectionFactory.with((connection) => __awaiter(this, void 0, void 0, function* () {
|
|
214
|
-
return yield loadFactTypes(unknownFactTypes, connection);
|
|
215
|
+
return yield loadFactTypes(unknownFactTypes, connection, this.schema);
|
|
215
216
|
}));
|
|
216
217
|
const merged = (0, maps_1.mergeFactTypes)(this.factTypeMap, loadedFactTypes);
|
|
217
218
|
this.factTypeMap = merged;
|
|
@@ -227,7 +228,7 @@ class PostgresStore {
|
|
|
227
228
|
.filter(r => !(0, maps_1.hasRole)(roleMap, r.successor_type_id, r.role));
|
|
228
229
|
if (unknownRoles.length > 0) {
|
|
229
230
|
const loadedRoles = yield this.connectionFactory.with((connection) => __awaiter(this, void 0, void 0, function* () {
|
|
230
|
-
return yield loadRoles(unknownRoles, roleMap, connection);
|
|
231
|
+
return yield loadRoles(unknownRoles, roleMap, connection, this.schema);
|
|
231
232
|
}));
|
|
232
233
|
const merged = (0, maps_1.mergeRoleMaps)(this.roleMap, loadedRoles);
|
|
233
234
|
this.roleMap = merged;
|
|
@@ -248,7 +249,7 @@ class PostgresStore {
|
|
|
248
249
|
.filter(r => r.successor_type_id && !(0, maps_1.hasRole)(roleMap, r.successor_type_id, r.role));
|
|
249
250
|
if (unknownRoles.length > 0) {
|
|
250
251
|
const loadedRoles = yield this.connectionFactory.with((connection) => __awaiter(this, void 0, void 0, function* () {
|
|
251
|
-
return yield loadRoles(unknownRoles, roleMap, connection);
|
|
252
|
+
return yield loadRoles(unknownRoles, roleMap, connection, this.schema);
|
|
252
253
|
}));
|
|
253
254
|
const merged = (0, maps_1.mergeRoleMaps)(this.roleMap, loadedRoles);
|
|
254
255
|
this.roleMap = merged;
|
|
@@ -268,7 +269,7 @@ class PostgresStore {
|
|
|
268
269
|
.filter(r => r.successor_type_id && !(0, maps_1.hasRole)(roleMap, r.successor_type_id, r.role));
|
|
269
270
|
if (unknownRoles.length > 0) {
|
|
270
271
|
const loadedRoles = yield this.connectionFactory.with((connection) => __awaiter(this, void 0, void 0, function* () {
|
|
271
|
-
return yield loadRoles(unknownRoles, roleMap, connection);
|
|
272
|
+
return yield loadRoles(unknownRoles, roleMap, connection, this.schema);
|
|
272
273
|
}));
|
|
273
274
|
const merged = (0, maps_1.mergeRoleMaps)(this.roleMap, loadedRoles);
|
|
274
275
|
this.roleMap = merged;
|
|
@@ -286,7 +287,7 @@ class PostgresStore {
|
|
|
286
287
|
const factValues = references.map((f, i) => `(\$${i * 2 + 1}, \$${i * 2 + 2}::integer)`);
|
|
287
288
|
const factParameters = (0, fn_1.flatten)(references, (f) => [f.hash, factTypes.get(f.type)]);
|
|
288
289
|
const sql = 'SELECT f.fact_type_id, f.hash ' +
|
|
289
|
-
|
|
290
|
+
`FROM ${this.schema}.fact f ` +
|
|
290
291
|
'JOIN (VALUES ' + factValues.join(', ') + ') AS v (hash, fact_type_id) ' +
|
|
291
292
|
' ON v.fact_type_id = f.fact_type_id AND v.hash = f.hash ';
|
|
292
293
|
const result = yield this.connectionFactory.with((connection) => __awaiter(this, void 0, void 0, function* () {
|
|
@@ -305,21 +306,21 @@ class PostgresStore {
|
|
|
305
306
|
const factValues = references.map((f, i) => `(\$${i * 2 + 1}, \$${i * 2 + 2}::integer)`);
|
|
306
307
|
const factParameters = (0, fn_1.flatten)(references, (f) => [f.hash, factTypes.get(f.type)]);
|
|
307
308
|
const sql = 'SELECT f.fact_type_id, t.name, f.hash, f.data ' +
|
|
308
|
-
|
|
309
|
-
|
|
309
|
+
`FROM ${this.schema}.fact f ` +
|
|
310
|
+
`JOIN ${this.schema}.fact_type t ` +
|
|
310
311
|
' ON f.fact_type_id = t.fact_type_id ' +
|
|
311
312
|
'JOIN (VALUES ' + factValues.join(', ') + ') AS v (hash, fact_type_id) ' +
|
|
312
313
|
' ON v.fact_type_id = f.fact_type_id AND v.hash = f.hash ' +
|
|
313
314
|
'UNION ' +
|
|
314
315
|
'SELECT f2.fact_type_id, t.name, f2.hash, f2.data ' +
|
|
315
|
-
|
|
316
|
+
`FROM ${this.schema}.fact f1 ` +
|
|
316
317
|
'JOIN (VALUES ' + factValues.join(', ') + ') AS v (hash, fact_type_id) ' +
|
|
317
318
|
' ON v.fact_type_id = f1.fact_type_id AND v.hash = f1.hash ' +
|
|
318
|
-
|
|
319
|
+
`JOIN ${this.schema}.ancestor a ` +
|
|
319
320
|
' ON a.fact_id = f1.fact_id ' +
|
|
320
|
-
|
|
321
|
+
`JOIN ${this.schema}.fact f2 ` +
|
|
321
322
|
' ON f2.fact_id = a.ancestor_fact_id ' +
|
|
322
|
-
|
|
323
|
+
`JOIN ${this.schema}.fact_type t ` +
|
|
323
324
|
' ON t.fact_type_id = f2.fact_type_id;';
|
|
324
325
|
const result = yield this.connectionFactory.with((connection) => __awaiter(this, void 0, void 0, function* () {
|
|
325
326
|
return yield connection.query(sql, factParameters);
|
|
@@ -348,7 +349,7 @@ class PostgresStore {
|
|
|
348
349
|
.filter(fn_1.distinct);
|
|
349
350
|
if (newFactTypes.length > 0) {
|
|
350
351
|
const loadedFactTypes = yield this.connectionFactory.with((connection) => __awaiter(this, void 0, void 0, function* () {
|
|
351
|
-
return yield loadFactTypes(newFactTypes, connection);
|
|
352
|
+
return yield loadFactTypes(newFactTypes, connection, this.schema);
|
|
352
353
|
}));
|
|
353
354
|
const mergedFactTypes = (0, maps_1.mergeFactTypes)(factTypes, loadedFactTypes);
|
|
354
355
|
this.factTypeMap = mergedFactTypes;
|
|
@@ -389,7 +390,7 @@ function predecessorTypes(predecessor) {
|
|
|
389
390
|
function predecessorCollectionTypes(predecessors) {
|
|
390
391
|
return Object.keys(predecessors).flatMap(key => predecessorTypes(predecessors[key]));
|
|
391
392
|
}
|
|
392
|
-
function storeFactTypes(facts, factTypes, connection) {
|
|
393
|
+
function storeFactTypes(facts, factTypes, connection, schema) {
|
|
393
394
|
return __awaiter(this, void 0, void 0, function* () {
|
|
394
395
|
const newFactTypes = facts
|
|
395
396
|
.flatMap(fact => [fact.type, ...predecessorCollectionTypes(fact.predecessors)])
|
|
@@ -399,14 +400,14 @@ function storeFactTypes(facts, factTypes, connection) {
|
|
|
399
400
|
return factTypes;
|
|
400
401
|
}
|
|
401
402
|
// Look up existing fact types
|
|
402
|
-
const loadedFactTypes = yield loadFactTypes(newFactTypes, connection);
|
|
403
|
+
const loadedFactTypes = yield loadFactTypes(newFactTypes, connection, schema);
|
|
403
404
|
const remainingNames = newFactTypes.filter(type => !loadedFactTypes.has(type));
|
|
404
405
|
if (remainingNames.length === 0) {
|
|
405
406
|
return (0, maps_1.mergeFactTypes)(loadedFactTypes, factTypes);
|
|
406
407
|
}
|
|
407
408
|
// Insert new fact types
|
|
408
409
|
const values = remainingNames.map((name, index) => `($${index + 1})`);
|
|
409
|
-
const insertSql =
|
|
410
|
+
const insertSql = `INSERT INTO ${schema}.fact_type (name) VALUES ` + values.join(', ') +
|
|
410
411
|
' RETURNING fact_type_id, name;';
|
|
411
412
|
const { rows: newRows } = yield connection.query(insertSql, remainingNames);
|
|
412
413
|
if (newRows.length !== remainingNames.length) {
|
|
@@ -416,15 +417,15 @@ function storeFactTypes(facts, factTypes, connection) {
|
|
|
416
417
|
return allFactTypes;
|
|
417
418
|
});
|
|
418
419
|
}
|
|
419
|
-
function loadFactTypes(factTypeNames, connection) {
|
|
420
|
+
function loadFactTypes(factTypeNames, connection, schema) {
|
|
420
421
|
return __awaiter(this, void 0, void 0, function* () {
|
|
421
|
-
const lookUpSql =
|
|
422
|
+
const lookUpSql = `SELECT name, fact_type_id FROM ${schema}.fact_type WHERE name=ANY($1);`;
|
|
422
423
|
const { rows: existingRows } = yield connection.query(lookUpSql, [factTypeNames]);
|
|
423
424
|
const factTypeIds = existingRows.reduce((map, row) => (0, maps_1.addFactType)(map, row.name, row.fact_type_id), (0, maps_1.emptyFactTypeMap)());
|
|
424
425
|
return factTypeIds;
|
|
425
426
|
});
|
|
426
427
|
}
|
|
427
|
-
function storeRoles(facts, factTypes, roleMap, connection) {
|
|
428
|
+
function storeRoles(facts, factTypes, roleMap, connection, schema) {
|
|
428
429
|
return __awaiter(this, void 0, void 0, function* () {
|
|
429
430
|
// Find distinct roles
|
|
430
431
|
const roles = (0, fn_1.flatten)(facts, fact => {
|
|
@@ -437,14 +438,14 @@ function storeRoles(facts, factTypes, roleMap, connection) {
|
|
|
437
438
|
r.successor_type_id === role.successor_type_id) === index);
|
|
438
439
|
if (roles.length > 0) {
|
|
439
440
|
// Look up existing roles
|
|
440
|
-
const roleIds = yield loadRoles(roles, roleMap, connection);
|
|
441
|
+
const roleIds = yield loadRoles(roles, roleMap, connection, schema);
|
|
441
442
|
const remainingRoles = roles.filter(role => !(0, maps_1.hasRole)(roleIds, role.successor_type_id, role.role));
|
|
442
443
|
if (remainingRoles.length === 0) {
|
|
443
444
|
return roleIds;
|
|
444
445
|
}
|
|
445
446
|
// Insert new roles
|
|
446
447
|
const remainingRoleValues = remainingRoles.map((role, index) => `($${index * 2 + 1}, $${index * 2 + 2}::integer)`);
|
|
447
|
-
const insertSql =
|
|
448
|
+
const insertSql = `INSERT INTO ${schema}.role (name, defining_fact_type_id) VALUES ` +
|
|
448
449
|
remainingRoleValues.join(', ') +
|
|
449
450
|
' RETURNING role_id, name, defining_fact_type_id;';
|
|
450
451
|
const remainingRoleParameters = (0, fn_1.flatten)(remainingRoles, (role) => [
|
|
@@ -463,7 +464,7 @@ function storeRoles(facts, factTypes, roleMap, connection) {
|
|
|
463
464
|
}
|
|
464
465
|
});
|
|
465
466
|
}
|
|
466
|
-
function loadRoles(roles, roleMap, connection) {
|
|
467
|
+
function loadRoles(roles, roleMap, connection, schema) {
|
|
467
468
|
return __awaiter(this, void 0, void 0, function* () {
|
|
468
469
|
const roleValues = roles.map((role, index) => `($${index * 2 + 1}, $${index * 2 + 2}::integer)`);
|
|
469
470
|
const roleParameters = (0, fn_1.flatten)(roles, (role) => [
|
|
@@ -471,7 +472,7 @@ function loadRoles(roles, roleMap, connection) {
|
|
|
471
472
|
role.successor_type_id
|
|
472
473
|
]);
|
|
473
474
|
const lookUpSql = 'SELECT role.name, role.defining_fact_type_id, role.role_id' +
|
|
474
|
-
|
|
475
|
+
` FROM ${schema}.role` +
|
|
475
476
|
' JOIN (VALUES ' + roleValues.join(', ') + ') AS v (name, defining_fact_type_id)' +
|
|
476
477
|
' ON v.name = role.name AND v.defining_fact_type_id = role.defining_fact_type_id;';
|
|
477
478
|
const { rows } = yield connection.query(lookUpSql, roleParameters);
|
|
@@ -479,7 +480,7 @@ function loadRoles(roles, roleMap, connection) {
|
|
|
479
480
|
return roleIds;
|
|
480
481
|
});
|
|
481
482
|
}
|
|
482
|
-
function findExistingFacts(facts, factTypes, connection) {
|
|
483
|
+
function findExistingFacts(facts, factTypes, connection, schema) {
|
|
483
484
|
return __awaiter(this, void 0, void 0, function* () {
|
|
484
485
|
if (facts.length > 0) {
|
|
485
486
|
const factReferences = facts.flatMap(fact => [
|
|
@@ -489,7 +490,7 @@ function findExistingFacts(facts, factTypes, connection) {
|
|
|
489
490
|
const factValues = factReferences.map((f, i) => `(\$${i * 2 + 1}, \$${i * 2 + 2}::integer)`);
|
|
490
491
|
const factParameters = factReferences.flatMap((f) => [f.hash, factTypes.get(f.type)]);
|
|
491
492
|
const sql = 'SELECT fact_id, fact.fact_type_id, fact.hash' +
|
|
492
|
-
|
|
493
|
+
` FROM ${schema}.fact` +
|
|
493
494
|
' JOIN (VALUES ' + factValues.join(', ') + ') AS v (hash, fact_type_id)' +
|
|
494
495
|
' ON v.fact_type_id = fact.fact_type_id AND v.hash = fact.hash;';
|
|
495
496
|
const { rows } = yield connection.query(sql, factParameters);
|
|
@@ -501,12 +502,12 @@ function findExistingFacts(facts, factTypes, connection) {
|
|
|
501
502
|
}
|
|
502
503
|
});
|
|
503
504
|
}
|
|
504
|
-
function insertFactsEdgesAndAncestors(facts, factTypes, existingFacts, connection, roles) {
|
|
505
|
+
function insertFactsEdgesAndAncestors(facts, factTypes, existingFacts, connection, roles, schema) {
|
|
505
506
|
return __awaiter(this, void 0, void 0, function* () {
|
|
506
507
|
if (facts.length === 0) {
|
|
507
508
|
return (0, maps_1.emptyFactMap)();
|
|
508
509
|
}
|
|
509
|
-
const { sql, parameters } = sqlInsertFacts(facts, roles, factTypes);
|
|
510
|
+
const { sql, parameters } = sqlInsertFacts(facts, roles, factTypes, schema);
|
|
510
511
|
const { rows } = yield connection.query(sql, parameters);
|
|
511
512
|
if (rows.length !== facts.length) {
|
|
512
513
|
throw new Error('Failed to insert all new facts.');
|
|
@@ -515,7 +516,7 @@ function insertFactsEdgesAndAncestors(facts, factTypes, existingFacts, connectio
|
|
|
515
516
|
return allFacts;
|
|
516
517
|
});
|
|
517
518
|
}
|
|
518
|
-
function sqlInsertFacts(facts, roles, factTypes) {
|
|
519
|
+
function sqlInsertFacts(facts, roles, factTypes, schema) {
|
|
519
520
|
const factValues = facts.map((f, i) => `(\$${i * 3 + 1}, \$${i * 3 + 2}::integer, \$${i * 3 + 3}::jsonb)`);
|
|
520
521
|
const factParameters = (0, fn_1.flatten)(facts, (f) => [f.hash, (0, maps_1.ensureGetFactTypeId)(factTypes, f.type), {
|
|
521
522
|
fields: f.fields,
|
|
@@ -523,18 +524,18 @@ function sqlInsertFacts(facts, roles, factTypes) {
|
|
|
523
524
|
}]);
|
|
524
525
|
const edgeRecords = (0, fn_1.flatten)(facts, fact => (0, edge_record_1.makeEdgeRecords)(fact));
|
|
525
526
|
if (edgeRecords.length > 0) {
|
|
526
|
-
return sqlInsertFactsEdgesAndAncestors(facts, factParameters, edgeRecords, factTypes, roles, factValues);
|
|
527
|
+
return sqlInsertFactsEdgesAndAncestors(facts, factParameters, edgeRecords, factTypes, roles, factValues, schema);
|
|
527
528
|
}
|
|
528
529
|
else {
|
|
529
530
|
return {
|
|
530
|
-
sql:
|
|
531
|
+
sql: `INSERT INTO ${schema}.fact (hash, fact_type_id, data) VALUES ` +
|
|
531
532
|
factValues.join(', ') +
|
|
532
533
|
' RETURNING fact_id, hash, fact_type_id;',
|
|
533
534
|
parameters: factParameters
|
|
534
535
|
};
|
|
535
536
|
}
|
|
536
537
|
}
|
|
537
|
-
function sqlInsertFactsEdgesAndAncestors(facts, factParameters, edgeRecords, factTypes, roles, factValues) {
|
|
538
|
+
function sqlInsertFactsEdgesAndAncestors(facts, factParameters, edgeRecords, factTypes, roles, factValues, schema) {
|
|
538
539
|
let parameterOffset = factParameters.length;
|
|
539
540
|
const edgeValues = edgeRecords.map((e, i) => `(\$${i * 5 + 1 + parameterOffset}, \$${i * 5 + 2 + parameterOffset}::integer, \$${i * 5 + 3 + parameterOffset}, \$${i * 5 + 4 + parameterOffset}::integer, \$${i * 5 + 5 + parameterOffset}::integer)`);
|
|
540
541
|
const edgeParameters = (0, fn_1.flatten)(edgeRecords, (e) => {
|
|
@@ -573,13 +574,13 @@ new_ancestor AS (
|
|
|
573
574
|
AS ev (hash, fact_type_id, ancestor_hash, ancestor_fact_type_id)
|
|
574
575
|
),
|
|
575
576
|
inserted_fact AS (
|
|
576
|
-
INSERT INTO
|
|
577
|
+
INSERT INTO ${schema}.fact (hash, fact_type_id, data)
|
|
577
578
|
SELECT hash, fact_type_id, data
|
|
578
579
|
FROM new_fact
|
|
579
580
|
RETURNING fact_id, fact_type_id, hash
|
|
580
581
|
),
|
|
581
582
|
inserted_edge AS (
|
|
582
|
-
INSERT INTO
|
|
583
|
+
INSERT INTO ${schema}.edge
|
|
583
584
|
(role_id, successor_fact_id, predecessor_fact_id)
|
|
584
585
|
SELECT
|
|
585
586
|
new_edge.role_id,
|
|
@@ -594,7 +595,7 @@ inserted_edge AS (
|
|
|
594
595
|
FROM inserted_fact
|
|
595
596
|
UNION ALL
|
|
596
597
|
SELECT fact_id, fact_type_id, hash
|
|
597
|
-
FROM
|
|
598
|
+
FROM ${schema}.fact
|
|
598
599
|
) AS predecessor
|
|
599
600
|
ON predecessor.hash = new_edge.predecessor_hash
|
|
600
601
|
AND predecessor.fact_type_id = new_edge.predecessor_fact_type_id
|
|
@@ -613,20 +614,20 @@ ancestor_id AS (
|
|
|
613
614
|
FROM inserted_fact
|
|
614
615
|
UNION ALL
|
|
615
616
|
SELECT fact_id, fact_type_id, hash
|
|
616
|
-
FROM
|
|
617
|
+
FROM ${schema}.fact
|
|
617
618
|
) AS ancestor
|
|
618
619
|
ON ancestor.hash = new_ancestor.ancestor_hash
|
|
619
620
|
AND ancestor.fact_type_id = new_ancestor.ancestor_fact_type_id
|
|
620
621
|
),
|
|
621
622
|
inserted_ancestor AS (
|
|
622
|
-
INSERT INTO
|
|
623
|
+
INSERT INTO ${schema}.ancestor
|
|
623
624
|
(fact_id, ancestor_fact_id)
|
|
624
625
|
SELECT ancestor_id.fact_id, ancestor_id.ancestor_fact_id
|
|
625
626
|
FROM ancestor_id
|
|
626
627
|
UNION ALL
|
|
627
628
|
SELECT ancestor_id.fact_id, ancestor.ancestor_fact_id
|
|
628
629
|
FROM ancestor_id
|
|
629
|
-
JOIN
|
|
630
|
+
JOIN ${schema}.ancestor
|
|
630
631
|
ON ancestor.fact_id = ancestor_id.ancestor_fact_id
|
|
631
632
|
ON CONFLICT DO NOTHING
|
|
632
633
|
)
|
|
@@ -662,12 +663,12 @@ function recursivePredecessors(factReference, facts) {
|
|
|
662
663
|
return [...predecessorReferences, ...ancestorReferences];
|
|
663
664
|
});
|
|
664
665
|
}
|
|
665
|
-
function storePublicKeys(envelopes, connection) {
|
|
666
|
+
function storePublicKeys(envelopes, connection, schema) {
|
|
666
667
|
return __awaiter(this, void 0, void 0, function* () {
|
|
667
668
|
// Look up existing fact types
|
|
668
669
|
const publicKeys = (0, fn_1.flatten)(envelopes, e => e.signatures.map(s => s.publicKey))
|
|
669
670
|
.filter(fn_1.distinct);
|
|
670
|
-
const lookUpSql =
|
|
671
|
+
const lookUpSql = `SELECT public_key, public_key_id FROM ${schema}.public_key WHERE public_key=ANY($1);`;
|
|
671
672
|
const { rows: existingRows } = yield connection.query(lookUpSql, [publicKeys]);
|
|
672
673
|
const publicKeyIds = existingRows.reduce((map, row) => (0, maps_1.addFactType)(map, row.public_key, row.public_key_id), (0, maps_1.emptyPublicKeyMap)());
|
|
673
674
|
const remainingPublicKeys = publicKeys.filter(pk => !publicKeyIds.has(pk));
|
|
@@ -676,7 +677,7 @@ function storePublicKeys(envelopes, connection) {
|
|
|
676
677
|
}
|
|
677
678
|
// Insert new fact types
|
|
678
679
|
const values = remainingPublicKeys.map((name, index) => `($${index + 1})`);
|
|
679
|
-
const insertSql =
|
|
680
|
+
const insertSql = `INSERT INTO ${schema}.public_key (public_key) VALUES ` + values.join(', ') +
|
|
680
681
|
' RETURNING public_key, public_key_id;';
|
|
681
682
|
const { rows: newRows } = yield connection.query(insertSql, remainingPublicKeys);
|
|
682
683
|
if (newRows.length !== remainingPublicKeys.length) {
|
|
@@ -686,7 +687,7 @@ function storePublicKeys(envelopes, connection) {
|
|
|
686
687
|
return allPublicKeyIds;
|
|
687
688
|
});
|
|
688
689
|
}
|
|
689
|
-
function insertSignatures(envelopes, allFacts, factTypes, publicKey, connection) {
|
|
690
|
+
function insertSignatures(envelopes, allFacts, factTypes, publicKey, connection, schema) {
|
|
690
691
|
return __awaiter(this, void 0, void 0, function* () {
|
|
691
692
|
const signatureRecords = (0, fn_1.flatten)(envelopes, envelope => envelope.signatures.map(signature => ({
|
|
692
693
|
factId: (0, maps_1.getFactId)(allFacts, envelope.fact.hash, (0, maps_1.ensureGetFactTypeId)(factTypes, envelope.fact.type)),
|
|
@@ -696,7 +697,7 @@ function insertSignatures(envelopes, allFacts, factTypes, publicKey, connection)
|
|
|
696
697
|
if (signatureRecords.length > 0) {
|
|
697
698
|
const signatureValues = signatureRecords.map((s, i) => `($${i * 3 + 1}::integer, $${i * 3 + 2}::integer, $${i * 3 + 3})`);
|
|
698
699
|
const signatureParameters = (0, fn_1.flatten)(signatureRecords, s => [s.factId, s.publicKeyId, s.signature]);
|
|
699
|
-
const sql = `INSERT INTO
|
|
700
|
+
const sql = `INSERT INTO ${schema}.signature
|
|
700
701
|
(fact_id, public_key_id, signature)
|
|
701
702
|
(SELECT fact_id, public_key_id, signature
|
|
702
703
|
FROM (VALUES ${signatureValues.join(', ')}) AS v(fact_id, public_key_id, signature))
|