@expo/entity 0.27.0 → 0.29.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/build/EntityDatabaseAdapter.d.ts +10 -0
- package/build/EntityDatabaseAdapter.js.map +1 -1
- package/build/EntityFields.d.ts +0 -13
- package/build/EntityFields.js +1 -20
- package/build/EntityFields.js.map +1 -1
- package/build/EntityLoader.d.ts +3 -3
- package/build/EntityLoader.js +3 -3
- package/build/EntityMutationTriggerConfiguration.d.ts +1 -1
- package/build/EntityQueryContext.d.ts +20 -0
- package/build/EntityQueryContext.js +40 -3
- package/build/EntityQueryContext.js.map +1 -1
- package/build/EntityQueryContextProvider.d.ts +9 -1
- package/build/EntityQueryContextProvider.js +18 -1
- package/build/EntityQueryContextProvider.js.map +1 -1
- package/build/__tests__/EntityFields-test.js +0 -4
- package/build/__tests__/EntityFields-test.js.map +1 -1
- package/build/__tests__/EntityQueryContext-test.js +39 -0
- package/build/__tests__/EntityQueryContext-test.js.map +1 -1
- package/build/utils/testing/StubQueryContextProvider.d.ts +1 -0
- package/build/utils/testing/StubQueryContextProvider.js +3 -0
- package/build/utils/testing/StubQueryContextProvider.js.map +1 -1
- package/package.json +2 -2
- package/src/EntityDatabaseAdapter.ts +10 -0
- package/src/EntityFields.ts +0 -19
- package/src/EntityLoader.ts +3 -3
- package/src/EntityMutationTriggerConfiguration.ts +1 -1
- package/src/EntityQueryContext.ts +60 -0
- package/src/EntityQueryContextProvider.ts +33 -1
- package/src/__tests__/EntityFields-test.ts +0 -12
- package/src/__tests__/EntityQueryContext-test.ts +50 -0
- package/src/utils/testing/StubQueryContextProvider.ts +6 -0
|
@@ -1,14 +1,24 @@
|
|
|
1
1
|
import EntityConfiguration from './EntityConfiguration';
|
|
2
2
|
import { EntityQueryContext } from './EntityQueryContext';
|
|
3
3
|
import { FieldTransformerMap } from './internal/EntityFieldTransformationUtils';
|
|
4
|
+
/**
|
|
5
|
+
* Equality operand that is used for selecting entities with a field with a single value.
|
|
6
|
+
*/
|
|
4
7
|
export interface SingleValueFieldEqualityCondition<TFields, N extends keyof TFields = keyof TFields> {
|
|
5
8
|
fieldName: N;
|
|
6
9
|
fieldValue: TFields[N];
|
|
7
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* Equality operand that is used for selecting entities with a field matching one of multiple values.
|
|
13
|
+
*/
|
|
8
14
|
export interface MultiValueFieldEqualityCondition<TFields, N extends keyof TFields = keyof TFields> {
|
|
9
15
|
fieldName: N;
|
|
10
16
|
fieldValues: readonly TFields[N][];
|
|
11
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* A single equality operand for use in a selection clause.
|
|
20
|
+
* See EntityLoader.loadManyByFieldEqualityConjunctionAsync documentation for examples.
|
|
21
|
+
*/
|
|
12
22
|
export declare type FieldEqualityCondition<TFields, N extends keyof TFields = keyof TFields> = SingleValueFieldEqualityCondition<TFields, N> | MultiValueFieldEqualityCondition<TFields, N>;
|
|
13
23
|
export declare function isSingleValueFieldEqualityCondition<TFields, N extends keyof TFields = keyof TFields>(condition: FieldEqualityCondition<TFields, N>): condition is SingleValueFieldEqualityCondition<TFields, N>;
|
|
14
24
|
export interface TableFieldSingleValueEqualityCondition {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityDatabaseAdapter.js","sourceRoot":"","sources":["../src/EntityDatabaseAdapter.ts"],"names":[],"mappings":";;;AAEA,8FAKmD;
|
|
1
|
+
{"version":3,"file":"EntityDatabaseAdapter.js","sourceRoot":"","sources":["../src/EntityDatabaseAdapter.ts"],"names":[],"mappings":"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"}
|
package/build/EntityFields.d.ts
CHANGED
|
@@ -57,16 +57,3 @@ export declare class JSONObjectField extends EntityFieldDefinition<object> {
|
|
|
57
57
|
export declare class EnumField extends EntityFieldDefinition<string | number> {
|
|
58
58
|
protected validateInputValueInternal(value: string | number): boolean;
|
|
59
59
|
}
|
|
60
|
-
/**
|
|
61
|
-
* EntityFieldDefinition for a column with a JS JSON array type.
|
|
62
|
-
*/
|
|
63
|
-
export declare class JSONArrayField extends EntityFieldDefinition<any[]> {
|
|
64
|
-
protected validateInputValueInternal(value: any[]): boolean;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* EntityFieldDefinition for a column that may be a JS JSON array type.
|
|
68
|
-
* Does not do any validation.
|
|
69
|
-
*/
|
|
70
|
-
export declare class MaybeJSONArrayField extends EntityFieldDefinition<any | any[]> {
|
|
71
|
-
protected validateInputValueInternal(_value: any): boolean;
|
|
72
|
-
}
|
package/build/EntityFields.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.EnumField = exports.JSONObjectField = exports.StringArrayField = exports.FloatField = exports.IntField = exports.BooleanField = exports.DateField = exports.UUIDField = exports.StringField = void 0;
|
|
4
4
|
const uuid_1 = require("uuid");
|
|
5
5
|
const EntityFieldDefinition_1 = require("./EntityFieldDefinition");
|
|
6
6
|
/**
|
|
@@ -88,23 +88,4 @@ class EnumField extends EntityFieldDefinition_1.EntityFieldDefinition {
|
|
|
88
88
|
}
|
|
89
89
|
}
|
|
90
90
|
exports.EnumField = EnumField;
|
|
91
|
-
/**
|
|
92
|
-
* EntityFieldDefinition for a column with a JS JSON array type.
|
|
93
|
-
*/
|
|
94
|
-
class JSONArrayField extends EntityFieldDefinition_1.EntityFieldDefinition {
|
|
95
|
-
validateInputValueInternal(value) {
|
|
96
|
-
return Array.isArray(value);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
exports.JSONArrayField = JSONArrayField;
|
|
100
|
-
/**
|
|
101
|
-
* EntityFieldDefinition for a column that may be a JS JSON array type.
|
|
102
|
-
* Does not do any validation.
|
|
103
|
-
*/
|
|
104
|
-
class MaybeJSONArrayField extends EntityFieldDefinition_1.EntityFieldDefinition {
|
|
105
|
-
validateInputValueInternal(_value) {
|
|
106
|
-
return true;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
exports.MaybeJSONArrayField = MaybeJSONArrayField;
|
|
110
91
|
//# sourceMappingURL=EntityFields.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityFields.js","sourceRoot":"","sources":["../src/EntityFields.ts"],"names":[],"mappings":";;;AAAA,+BAAgD;AAEhD,mEAAgE;AAEhE;;GAEG;AACH,MAAa,WAAY,SAAQ,6CAA6B;IAClD,0BAA0B,CAAC,KAAa;QAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;IACnC,CAAC;CACF;AAJD,kCAIC;AAED;;;GAGG;AACH,MAAa,SAAU,SAAQ,WAAW;IACrB,0BAA0B,CAAC,KAAa;QACzD,OAAO,IAAA,eAAY,EAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAJD,8BAIC;AAED;;GAEG;AACH,MAAa,SAAU,SAAQ,6CAA2B;IAC9C,0BAA0B,CAAC,KAAW;QAC9C,OAAO,KAAK,YAAY,IAAI,CAAC;IAC/B,CAAC;CACF;AAJD,8BAIC;AAED;;GAEG;AACH,MAAa,YAAa,SAAQ,6CAA8B;IACpD,0BAA0B,CAAC,KAAc;QACjD,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC;IACpC,CAAC;CACF;AAJD,oCAIC;AAED;;;GAGG;AACH,MAAa,QAAS,SAAQ,6CAA6B;IAC/C,0BAA0B,CAAC,KAAa;QAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC;CACF;AAJD,4BAIC;AAED;;;GAGG;AACH,MAAa,UAAW,SAAQ,6CAA6B;IACjD,0BAA0B,CAAC,KAAa;QAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;IACnC,CAAC;CACF;AAJD,gCAIC;AAED;;;GAGG;AACH,MAAa,gBAAiB,SAAQ,6CAA+B;IACzD,0BAA0B,CAAC,KAAe;QAClD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC;IACzF,CAAC;CACF;AAJD,4CAIC;AAED;;GAEG;AACH,MAAa,eAAgB,SAAQ,6CAA6B;IACtD,0BAA0B,CAAC,KAAa;QAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;CACF;AAJD,0CAIC;AAED;;GAEG;AACH,MAAa,SAAU,SAAQ,6CAAsC;IACzD,0BAA0B,CAAC,KAAsB;QACzD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;IAChE,CAAC;CACF;AAJD,8BAIC
|
|
1
|
+
{"version":3,"file":"EntityFields.js","sourceRoot":"","sources":["../src/EntityFields.ts"],"names":[],"mappings":";;;AAAA,+BAAgD;AAEhD,mEAAgE;AAEhE;;GAEG;AACH,MAAa,WAAY,SAAQ,6CAA6B;IAClD,0BAA0B,CAAC,KAAa;QAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;IACnC,CAAC;CACF;AAJD,kCAIC;AAED;;;GAGG;AACH,MAAa,SAAU,SAAQ,WAAW;IACrB,0BAA0B,CAAC,KAAa;QACzD,OAAO,IAAA,eAAY,EAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAJD,8BAIC;AAED;;GAEG;AACH,MAAa,SAAU,SAAQ,6CAA2B;IAC9C,0BAA0B,CAAC,KAAW;QAC9C,OAAO,KAAK,YAAY,IAAI,CAAC;IAC/B,CAAC;CACF;AAJD,8BAIC;AAED;;GAEG;AACH,MAAa,YAAa,SAAQ,6CAA8B;IACpD,0BAA0B,CAAC,KAAc;QACjD,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC;IACpC,CAAC;CACF;AAJD,oCAIC;AAED;;;GAGG;AACH,MAAa,QAAS,SAAQ,6CAA6B;IAC/C,0BAA0B,CAAC,KAAa;QAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9D,CAAC;CACF;AAJD,4BAIC;AAED;;;GAGG;AACH,MAAa,UAAW,SAAQ,6CAA6B;IACjD,0BAA0B,CAAC,KAAa;QAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC;IACnC,CAAC;CACF;AAJD,gCAIC;AAED;;;GAGG;AACH,MAAa,gBAAiB,SAAQ,6CAA+B;IACzD,0BAA0B,CAAC,KAAe;QAClD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC;IACzF,CAAC;CACF;AAJD,4CAIC;AAED;;GAEG;AACH,MAAa,eAAgB,SAAQ,6CAA6B;IACtD,0BAA0B,CAAC,KAAa;QAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;CACF;AAJD,0CAIC;AAED;;GAEG;AACH,MAAa,SAAU,SAAQ,6CAAsC;IACzD,0BAA0B,CAAC,KAAsB;QACzD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC;IAChE,CAAC;CACF;AAJD,8BAIC"}
|
package/build/EntityLoader.d.ts
CHANGED
|
@@ -72,16 +72,16 @@ export default class EntityLoader<TFields, TID extends NonNullable<TFields[TSele
|
|
|
72
72
|
*/
|
|
73
73
|
loadManyByIDsAsync(ids: readonly TID[]): Promise<ReadonlyMap<TID, Result<TEntity>>>;
|
|
74
74
|
/**
|
|
75
|
-
* Loads many entities matching the
|
|
75
|
+
* Loads many entities matching the selection constructed from the conjunction of specified operands.
|
|
76
76
|
* Entities loaded using this method are not batched or cached.
|
|
77
77
|
*
|
|
78
78
|
* @example
|
|
79
79
|
* fieldEqualityOperands:
|
|
80
80
|
* `[{fieldName: 'hello', fieldValue: 1}, {fieldName: 'world', fieldValues: [2, 3]}]`
|
|
81
|
-
* Entities returned:
|
|
81
|
+
* Entities returned with a SQL EntityDatabaseAdapter:
|
|
82
82
|
* `WHERE hello = 1 AND world = ANY({2, 3})`
|
|
83
83
|
*
|
|
84
|
-
* @param fieldEqualityOperands - list of field equality
|
|
84
|
+
* @param fieldEqualityOperands - list of field equality selection operand specifications
|
|
85
85
|
* @param querySelectionModifiers - limit, offset, and orderBy for the query
|
|
86
86
|
* @returns array of entity results that match the query, where result error can be UnauthorizedError
|
|
87
87
|
*/
|
package/build/EntityLoader.js
CHANGED
|
@@ -105,16 +105,16 @@ class EntityLoader {
|
|
|
105
105
|
});
|
|
106
106
|
}
|
|
107
107
|
/**
|
|
108
|
-
* Loads many entities matching the
|
|
108
|
+
* Loads many entities matching the selection constructed from the conjunction of specified operands.
|
|
109
109
|
* Entities loaded using this method are not batched or cached.
|
|
110
110
|
*
|
|
111
111
|
* @example
|
|
112
112
|
* fieldEqualityOperands:
|
|
113
113
|
* `[{fieldName: 'hello', fieldValue: 1}, {fieldName: 'world', fieldValues: [2, 3]}]`
|
|
114
|
-
* Entities returned:
|
|
114
|
+
* Entities returned with a SQL EntityDatabaseAdapter:
|
|
115
115
|
* `WHERE hello = 1 AND world = ANY({2, 3})`
|
|
116
116
|
*
|
|
117
|
-
* @param fieldEqualityOperands - list of field equality
|
|
117
|
+
* @param fieldEqualityOperands - list of field equality selection operand specifications
|
|
118
118
|
* @param querySelectionModifiers - limit, offset, and orderBy for the query
|
|
119
119
|
* @returns array of entity results that match the query, where result error can be UnauthorizedError
|
|
120
120
|
*/
|
|
@@ -35,7 +35,7 @@ export default interface EntityMutationTriggerConfiguration<TFields, TID extends
|
|
|
35
35
|
*/
|
|
36
36
|
beforeAll?: EntityMutationTrigger<TFields, TID, TViewerContext, TEntity, TSelectedFields>[];
|
|
37
37
|
/**
|
|
38
|
-
* Trigger set that runs within the transaction but
|
|
38
|
+
* Trigger set that runs within the transaction but after the entity is created in, updated in, or deleted from
|
|
39
39
|
* the database and the cache is invalidated.
|
|
40
40
|
*/
|
|
41
41
|
afterAll?: EntityMutationTrigger<TFields, TID, TViewerContext, TEntity, TSelectedFields>[];
|
|
@@ -33,9 +33,11 @@ export declare class EntityNonTransactionalQueryContext extends EntityQueryConte
|
|
|
33
33
|
* dependent triggers and validators will run within the transaction.
|
|
34
34
|
*/
|
|
35
35
|
export declare class EntityTransactionalQueryContext extends EntityQueryContext {
|
|
36
|
+
private readonly entityQueryContextProvider;
|
|
36
37
|
private readonly postCommitInvalidationCallbacks;
|
|
37
38
|
private readonly postCommitCallbacks;
|
|
38
39
|
private readonly preCommitCallbacks;
|
|
40
|
+
constructor(queryInterface: any, entityQueryContextProvider: EntityQueryContextProvider);
|
|
39
41
|
/**
|
|
40
42
|
* Schedule a pre-commit callback. These will be run within the transaction right before it is
|
|
41
43
|
* committed, and will be run in the order specified. Ordering of callbacks scheduled with the
|
|
@@ -61,4 +63,22 @@ export declare class EntityTransactionalQueryContext extends EntityQueryContext
|
|
|
61
63
|
runPostCommitCallbacksAsync(): Promise<void>;
|
|
62
64
|
isInTransaction(): boolean;
|
|
63
65
|
runInTransactionIfNotInTransactionAsync<T>(transactionScope: (queryContext: EntityTransactionalQueryContext) => Promise<T>): Promise<T>;
|
|
66
|
+
runInNestedTransactionAsync<T>(transactionScope: (innerQueryContext: EntityTransactionalQueryContext) => Promise<T>): Promise<T>;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Entity framework representation of a nested transactional query execution unit. When supplied
|
|
70
|
+
* to EntityMutator and EntityLoader methods, those methods and their
|
|
71
|
+
* dependent triggers and validators will run within the nested transaction.
|
|
72
|
+
*
|
|
73
|
+
* This exists to forward post-commit callbacks to the parent query context.
|
|
74
|
+
*/
|
|
75
|
+
export declare class EntityNestedTransactionalQueryContext extends EntityTransactionalQueryContext {
|
|
76
|
+
private readonly parentQueryContext;
|
|
77
|
+
private readonly postCommitInvalidationCallbacksToTransfer;
|
|
78
|
+
private readonly postCommitCallbacksToTransfer;
|
|
79
|
+
constructor(queryInterface: any, parentQueryContext: EntityTransactionalQueryContext, entityQueryContextProvider: EntityQueryContextProvider);
|
|
80
|
+
appendPostCommitCallback(callback: PostCommitCallback): void;
|
|
81
|
+
appendPostCommitInvalidationCallback(callback: PostCommitCallback): void;
|
|
82
|
+
runPostCommitCallbacksAsync(): Promise<void>;
|
|
83
|
+
transferPostCommitCallbacksToParent(): void;
|
|
64
84
|
}
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.EntityTransactionalQueryContext = exports.EntityNonTransactionalQueryContext = exports.EntityQueryContext = void 0;
|
|
6
|
+
exports.EntityNestedTransactionalQueryContext = exports.EntityTransactionalQueryContext = exports.EntityNonTransactionalQueryContext = exports.EntityQueryContext = void 0;
|
|
7
7
|
const assert_1 = __importDefault(require("assert"));
|
|
8
8
|
/**
|
|
9
9
|
* Entity framework representation of transactional and non-transactional database
|
|
@@ -46,8 +46,9 @@ exports.EntityNonTransactionalQueryContext = EntityNonTransactionalQueryContext;
|
|
|
46
46
|
* dependent triggers and validators will run within the transaction.
|
|
47
47
|
*/
|
|
48
48
|
class EntityTransactionalQueryContext extends EntityQueryContext {
|
|
49
|
-
constructor() {
|
|
50
|
-
super(
|
|
49
|
+
constructor(queryInterface, entityQueryContextProvider) {
|
|
50
|
+
super(queryInterface);
|
|
51
|
+
this.entityQueryContextProvider = entityQueryContextProvider;
|
|
51
52
|
this.postCommitInvalidationCallbacks = [];
|
|
52
53
|
this.postCommitCallbacks = [];
|
|
53
54
|
this.preCommitCallbacks = [];
|
|
@@ -103,6 +104,42 @@ class EntityTransactionalQueryContext extends EntityQueryContext {
|
|
|
103
104
|
async runInTransactionIfNotInTransactionAsync(transactionScope) {
|
|
104
105
|
return await transactionScope(this);
|
|
105
106
|
}
|
|
107
|
+
async runInNestedTransactionAsync(transactionScope) {
|
|
108
|
+
return await this.entityQueryContextProvider.runInNestedTransactionAsync(this, transactionScope);
|
|
109
|
+
}
|
|
106
110
|
}
|
|
107
111
|
exports.EntityTransactionalQueryContext = EntityTransactionalQueryContext;
|
|
112
|
+
/**
|
|
113
|
+
* Entity framework representation of a nested transactional query execution unit. When supplied
|
|
114
|
+
* to EntityMutator and EntityLoader methods, those methods and their
|
|
115
|
+
* dependent triggers and validators will run within the nested transaction.
|
|
116
|
+
*
|
|
117
|
+
* This exists to forward post-commit callbacks to the parent query context.
|
|
118
|
+
*/
|
|
119
|
+
class EntityNestedTransactionalQueryContext extends EntityTransactionalQueryContext {
|
|
120
|
+
constructor(queryInterface, parentQueryContext, entityQueryContextProvider) {
|
|
121
|
+
super(queryInterface, entityQueryContextProvider);
|
|
122
|
+
this.parentQueryContext = parentQueryContext;
|
|
123
|
+
this.postCommitInvalidationCallbacksToTransfer = [];
|
|
124
|
+
this.postCommitCallbacksToTransfer = [];
|
|
125
|
+
}
|
|
126
|
+
appendPostCommitCallback(callback) {
|
|
127
|
+
this.postCommitInvalidationCallbacksToTransfer.push(callback);
|
|
128
|
+
}
|
|
129
|
+
appendPostCommitInvalidationCallback(callback) {
|
|
130
|
+
this.postCommitCallbacksToTransfer.push(callback);
|
|
131
|
+
}
|
|
132
|
+
runPostCommitCallbacksAsync() {
|
|
133
|
+
throw new Error('Must not call runPostCommitCallbacksAsync on EntityNestedTransactionalQueryContext');
|
|
134
|
+
}
|
|
135
|
+
transferPostCommitCallbacksToParent() {
|
|
136
|
+
for (const callback of this.postCommitInvalidationCallbacksToTransfer) {
|
|
137
|
+
this.parentQueryContext.appendPostCommitInvalidationCallback(callback);
|
|
138
|
+
}
|
|
139
|
+
for (const callback of this.postCommitCallbacksToTransfer) {
|
|
140
|
+
this.parentQueryContext.appendPostCommitCallback(callback);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
exports.EntityNestedTransactionalQueryContext = EntityNestedTransactionalQueryContext;
|
|
108
145
|
//# sourceMappingURL=EntityQueryContext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityQueryContext.js","sourceRoot":"","sources":["../src/EntityQueryContext.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAU5B;;;;;;GAMG;AACH,MAAsB,kBAAkB;IACtC,YAA6B,cAAmB;QAAnB,mBAAc,GAAd,cAAc,CAAK;IAAG,CAAC;IAIpD,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;CAKF;AAZD,gDAYC;AAED;;;;;GAKG;AACH,MAAa,kCAAmC,SAAQ,kBAAkB;IACxE,YACE,cAAmB,EACF,0BAAsD;QAEvE,KAAK,CAAC,cAAc,CAAC,CAAC;QAFL,+BAA0B,GAA1B,0BAA0B,CAA4B;IAGzE,CAAC;IAED,eAAe;QACb,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK,CAAC,uCAAuC,CAC3C,gBAA+E;QAE/E,OAAO,MAAM,IAAI,CAAC,0BAA0B,CAAC,qBAAqB,CAAC,gBAAgB,CAAC,CAAC;IACvF,CAAC;CACF;AAjBD,gFAiBC;AAED;;;;GAIG;AACH,MAAa,+BAAgC,SAAQ,kBAAkB;
|
|
1
|
+
{"version":3,"file":"EntityQueryContext.js","sourceRoot":"","sources":["../src/EntityQueryContext.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EntityTransactionalQueryContext, EntityNonTransactionalQueryContext } from './EntityQueryContext';
|
|
1
|
+
import { EntityTransactionalQueryContext, EntityNonTransactionalQueryContext, EntityNestedTransactionalQueryContext } from './EntityQueryContext';
|
|
2
2
|
/**
|
|
3
3
|
* A query context provider vends transactional and non-transactional query contexts.
|
|
4
4
|
*/
|
|
@@ -15,9 +15,17 @@ export default abstract class EntityQueryContextProvider {
|
|
|
15
15
|
* Vend a transaction runner for use in runInTransactionAsync.
|
|
16
16
|
*/
|
|
17
17
|
protected abstract createTransactionRunner<T>(): (transactionScope: (queryInterface: any) => Promise<T>) => Promise<T>;
|
|
18
|
+
protected abstract createNestedTransactionRunner<T>(outerQueryInterface: any): (transactionScope: (queryInterface: any) => Promise<T>) => Promise<T>;
|
|
18
19
|
/**
|
|
19
20
|
* Start a transaction and execute the provided transaction-scoped closure within the transaction.
|
|
20
21
|
* @param transactionScope - async callback to execute within the transaction
|
|
21
22
|
*/
|
|
22
23
|
runInTransactionAsync<T>(transactionScope: (queryContext: EntityTransactionalQueryContext) => Promise<T>): Promise<T>;
|
|
24
|
+
/**
|
|
25
|
+
* Start a nested transaction from the specified parent transaction and execure the
|
|
26
|
+
* provided nested-transaction-scoped closure within the nested transaction.
|
|
27
|
+
* @param outerQueryContext - the query context of the parent transaction
|
|
28
|
+
* @param transactionScope - async callback to execute within the nested transaction
|
|
29
|
+
*/
|
|
30
|
+
runInNestedTransactionAsync<T>(outerQueryContext: EntityTransactionalQueryContext, transactionScope: (innerQueryContext: EntityNestedTransactionalQueryContext) => Promise<T>): Promise<T>;
|
|
23
31
|
}
|
|
@@ -17,7 +17,7 @@ class EntityQueryContextProvider {
|
|
|
17
17
|
*/
|
|
18
18
|
async runInTransactionAsync(transactionScope) {
|
|
19
19
|
const [returnedValue, queryContext] = await this.createTransactionRunner()(async (queryInterface) => {
|
|
20
|
-
const queryContext = new EntityQueryContext_1.EntityTransactionalQueryContext(queryInterface);
|
|
20
|
+
const queryContext = new EntityQueryContext_1.EntityTransactionalQueryContext(queryInterface, this);
|
|
21
21
|
const result = await transactionScope(queryContext);
|
|
22
22
|
await queryContext.runPreCommitCallbacksAsync();
|
|
23
23
|
return [result, queryContext];
|
|
@@ -25,6 +25,23 @@ class EntityQueryContextProvider {
|
|
|
25
25
|
await queryContext.runPostCommitCallbacksAsync();
|
|
26
26
|
return returnedValue;
|
|
27
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Start a nested transaction from the specified parent transaction and execure the
|
|
30
|
+
* provided nested-transaction-scoped closure within the nested transaction.
|
|
31
|
+
* @param outerQueryContext - the query context of the parent transaction
|
|
32
|
+
* @param transactionScope - async callback to execute within the nested transaction
|
|
33
|
+
*/
|
|
34
|
+
async runInNestedTransactionAsync(outerQueryContext, transactionScope) {
|
|
35
|
+
const [returnedValue, innerQueryContext] = await this.createNestedTransactionRunner(outerQueryContext.getQueryInterface())(async (innerQueryInterface) => {
|
|
36
|
+
const innerQueryContext = new EntityQueryContext_1.EntityNestedTransactionalQueryContext(innerQueryInterface, outerQueryContext, this);
|
|
37
|
+
const result = await transactionScope(innerQueryContext);
|
|
38
|
+
await innerQueryContext.runPreCommitCallbacksAsync();
|
|
39
|
+
return [result, innerQueryContext];
|
|
40
|
+
});
|
|
41
|
+
// post-commit callbacks are appended to parent transaction instead of run, but only after the transaction has succeeded
|
|
42
|
+
innerQueryContext.transferPostCommitCallbacksToParent();
|
|
43
|
+
return returnedValue;
|
|
44
|
+
}
|
|
28
45
|
}
|
|
29
46
|
exports.default = EntityQueryContextProvider;
|
|
30
47
|
//# sourceMappingURL=EntityQueryContextProvider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityQueryContextProvider.js","sourceRoot":"","sources":["../src/EntityQueryContextProvider.ts"],"names":[],"mappings":";;AAAA,
|
|
1
|
+
{"version":3,"file":"EntityQueryContextProvider.js","sourceRoot":"","sources":["../src/EntityQueryContextProvider.ts"],"names":[],"mappings":";;AAAA,6DAI8B;AAE9B;;GAEG;AACH,MAA8B,0BAA0B;IACtD;;OAEG;IACI,eAAe;QACpB,OAAO,IAAI,uDAAkC,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,CAAC,CAAC;IAChF,CAAC;IAkBD;;;OAGG;IACH,KAAK,CAAC,qBAAqB,CACzB,gBAA+E;QAE/E,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,GAAG,MAAM,IAAI,CAAC,uBAAuB,EAErE,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE;YAC3B,MAAM,YAAY,GAAG,IAAI,oDAA+B,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YAC/E,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAC;YACpD,MAAM,YAAY,CAAC,0BAA0B,EAAE,CAAC;YAChD,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,MAAM,YAAY,CAAC,2BAA2B,EAAE,CAAC;QACjD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,2BAA2B,CAC/B,iBAAkD,EAClD,gBAA0F;QAE1F,MAAM,CAAC,aAAa,EAAE,iBAAiB,CAAC,GAAG,MAAM,IAAI,CAAC,6BAA6B,CAEjF,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,CAAC,KAAK,EAAE,mBAAmB,EAAE,EAAE;YACrE,MAAM,iBAAiB,GAAG,IAAI,0DAAqC,CACjE,mBAAmB,EACnB,iBAAiB,EACjB,IAAI,CACL,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;YACzD,MAAM,iBAAiB,CAAC,0BAA0B,EAAE,CAAC;YACrD,OAAO,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,wHAAwH;QACxH,iBAAiB,CAAC,mCAAmC,EAAE,CAAC;QACxD,OAAO,aAAa,CAAC;IACvB,CAAC;CACF;AArED,6CAqEC"}
|
|
@@ -48,8 +48,4 @@ describe(EntityFieldDefinition_1.EntityFieldDefinition, () => {
|
|
|
48
48
|
['hello']);
|
|
49
49
|
(0, describeFieldTestCase_1.default)(new EntityFields_1.JSONObjectField({ columnName: 'wat' }), [{}], [true, 'hello']);
|
|
50
50
|
(0, describeFieldTestCase_1.default)(new EntityFields_1.EnumField({ columnName: 'wat' }), ['hello', 1], [true]);
|
|
51
|
-
(0, describeFieldTestCase_1.default)(new EntityFields_1.JSONArrayField({ columnName: 'wat' }), [[[1, 2]], [['hello']]], // jest test cases need extra wrapping array
|
|
52
|
-
[1, 'hello']);
|
|
53
|
-
(0, describeFieldTestCase_1.default)(new EntityFields_1.MaybeJSONArrayField({ columnName: 'wat' }), [1, 'hello', [['hello']]], // jest test cases need extra wrapping array
|
|
54
|
-
[]);
|
|
55
51
|
//# sourceMappingURL=EntityFields-test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityFields-test.js","sourceRoot":"","sources":["../../src/__tests__/EntityFields-test.ts"],"names":[],"mappings":";;;;;AAAA,+BAA8E;AAE9E,oEAAiE;AACjE,
|
|
1
|
+
{"version":3,"file":"EntityFields-test.js","sourceRoot":"","sources":["../../src/__tests__/EntityFields-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -51,6 +51,45 @@ describe(EntityQueryContext_1.EntityQueryContext, () => {
|
|
|
51
51
|
expect(postCommitCallback).toHaveBeenCalledTimes(0);
|
|
52
52
|
expect(postCommitInvalidationCallback).toHaveBeenCalledTimes(0);
|
|
53
53
|
});
|
|
54
|
+
it('calls callbacks correctly for nested transactions', async () => {
|
|
55
|
+
const companionProvider = (0, createUnitTestEntityCompanionProvider_1.createUnitTestEntityCompanionProvider)();
|
|
56
|
+
const viewerContext = new ViewerContext_1.default(companionProvider);
|
|
57
|
+
const preCommitCallback = jest.fn(async () => { });
|
|
58
|
+
const preCommitNestedCallback = jest.fn(async () => { });
|
|
59
|
+
const preCommitNestedCallbackThrow = jest.fn(async () => {
|
|
60
|
+
throw new Error('wat');
|
|
61
|
+
});
|
|
62
|
+
const postCommitInvalidationCallback = jest.fn(async () => { });
|
|
63
|
+
const postCommitCallback = jest.fn(async () => { });
|
|
64
|
+
await viewerContext.runInTransactionForDatabaseAdaptorFlavorAsync('postgres', async (queryContext) => {
|
|
65
|
+
queryContext.appendPostCommitCallback(postCommitCallback);
|
|
66
|
+
queryContext.appendPostCommitInvalidationCallback(postCommitInvalidationCallback);
|
|
67
|
+
queryContext.appendPreCommitCallback(preCommitCallback, 0);
|
|
68
|
+
await Promise.all([
|
|
69
|
+
queryContext.runInNestedTransactionAsync(async (innerQueryContext) => {
|
|
70
|
+
innerQueryContext.appendPostCommitCallback(postCommitCallback);
|
|
71
|
+
innerQueryContext.appendPostCommitInvalidationCallback(postCommitInvalidationCallback);
|
|
72
|
+
innerQueryContext.appendPreCommitCallback(preCommitNestedCallback, 0);
|
|
73
|
+
}),
|
|
74
|
+
(async () => {
|
|
75
|
+
try {
|
|
76
|
+
await queryContext.runInNestedTransactionAsync(async (innerQueryContext) => {
|
|
77
|
+
// these two shouldn't be called
|
|
78
|
+
innerQueryContext.appendPostCommitCallback(postCommitCallback);
|
|
79
|
+
innerQueryContext.appendPostCommitInvalidationCallback(postCommitInvalidationCallback);
|
|
80
|
+
innerQueryContext.appendPreCommitCallback(preCommitNestedCallbackThrow, 0);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
catch { }
|
|
84
|
+
})(),
|
|
85
|
+
]);
|
|
86
|
+
});
|
|
87
|
+
expect(preCommitCallback).toHaveBeenCalledTimes(1);
|
|
88
|
+
expect(preCommitNestedCallback).toHaveBeenCalledTimes(1);
|
|
89
|
+
expect(preCommitNestedCallbackThrow).toHaveBeenCalledTimes(1);
|
|
90
|
+
expect(postCommitCallback).toHaveBeenCalledTimes(2);
|
|
91
|
+
expect(postCommitInvalidationCallback).toHaveBeenCalledTimes(2);
|
|
92
|
+
});
|
|
54
93
|
});
|
|
55
94
|
});
|
|
56
95
|
//# sourceMappingURL=EntityQueryContext-test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityQueryContext-test.js","sourceRoot":"","sources":["../../src/__tests__/EntityQueryContext-test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EntityQueryContext-test.js","sourceRoot":"","sources":["../../src/__tests__/EntityQueryContext-test.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import EntityQueryContextProvider from '../../EntityQueryContextProvider';
|
|
|
2
2
|
export declare class StubQueryContextProvider extends EntityQueryContextProvider {
|
|
3
3
|
protected getQueryInterface(): any;
|
|
4
4
|
protected createTransactionRunner<T>(): (transactionScope: (queryInterface: any) => Promise<T>) => Promise<T>;
|
|
5
|
+
protected createNestedTransactionRunner<T>(_outerQueryInterface: any): (transactionScope: (queryInterface: any) => Promise<T>) => Promise<T>;
|
|
5
6
|
}
|
|
6
7
|
declare const _default: StubQueryContextProvider;
|
|
7
8
|
export default _default;
|
|
@@ -12,6 +12,9 @@ class StubQueryContextProvider extends EntityQueryContextProvider_1.default {
|
|
|
12
12
|
createTransactionRunner() {
|
|
13
13
|
return (transactionScope) => Promise.resolve(transactionScope({}));
|
|
14
14
|
}
|
|
15
|
+
createNestedTransactionRunner(_outerQueryInterface) {
|
|
16
|
+
return (transactionScope) => Promise.resolve(transactionScope({}));
|
|
17
|
+
}
|
|
15
18
|
}
|
|
16
19
|
exports.StubQueryContextProvider = StubQueryContextProvider;
|
|
17
20
|
exports.default = new StubQueryContextProvider();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StubQueryContextProvider.js","sourceRoot":"","sources":["../../../src/utils/testing/StubQueryContextProvider.ts"],"names":[],"mappings":";;;;;;AAAA,kGAA0E;AAE1E,MAAa,wBAAyB,SAAQ,oCAA0B;IAC5D,iBAAiB;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;IAES,uBAAuB;QAG/B,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;CACF;
|
|
1
|
+
{"version":3,"file":"StubQueryContextProvider.js","sourceRoot":"","sources":["../../../src/utils/testing/StubQueryContextProvider.ts"],"names":[],"mappings":";;;;;;AAAA,kGAA0E;AAE1E,MAAa,wBAAyB,SAAQ,oCAA0B;IAC5D,iBAAiB;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;IAES,uBAAuB;QAG/B,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;IAES,6BAA6B,CACrC,oBAAyB;QAEzB,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;CACF;AAhBD,4DAgBC;AAED,kBAAe,IAAI,wBAAwB,EAAE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@expo/entity",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.29.0",
|
|
4
4
|
"description": "A privacy-first data model",
|
|
5
5
|
"files": [
|
|
6
6
|
"build",
|
|
@@ -33,5 +33,5 @@
|
|
|
33
33
|
"invariant": "^2.2.4",
|
|
34
34
|
"uuid": "^8.3.0"
|
|
35
35
|
},
|
|
36
|
-
"gitHead": "
|
|
36
|
+
"gitHead": "b11bd24351ae34afd71a1572c8d023dde03fbdf3"
|
|
37
37
|
}
|
|
@@ -7,6 +7,9 @@ import {
|
|
|
7
7
|
FieldTransformerMap,
|
|
8
8
|
} from './internal/EntityFieldTransformationUtils';
|
|
9
9
|
|
|
10
|
+
/**
|
|
11
|
+
* Equality operand that is used for selecting entities with a field with a single value.
|
|
12
|
+
*/
|
|
10
13
|
export interface SingleValueFieldEqualityCondition<
|
|
11
14
|
TFields,
|
|
12
15
|
N extends keyof TFields = keyof TFields
|
|
@@ -15,6 +18,9 @@ export interface SingleValueFieldEqualityCondition<
|
|
|
15
18
|
fieldValue: TFields[N];
|
|
16
19
|
}
|
|
17
20
|
|
|
21
|
+
/**
|
|
22
|
+
* Equality operand that is used for selecting entities with a field matching one of multiple values.
|
|
23
|
+
*/
|
|
18
24
|
export interface MultiValueFieldEqualityCondition<
|
|
19
25
|
TFields,
|
|
20
26
|
N extends keyof TFields = keyof TFields
|
|
@@ -23,6 +29,10 @@ export interface MultiValueFieldEqualityCondition<
|
|
|
23
29
|
fieldValues: readonly TFields[N][];
|
|
24
30
|
}
|
|
25
31
|
|
|
32
|
+
/**
|
|
33
|
+
* A single equality operand for use in a selection clause.
|
|
34
|
+
* See EntityLoader.loadManyByFieldEqualityConjunctionAsync documentation for examples.
|
|
35
|
+
*/
|
|
26
36
|
export type FieldEqualityCondition<TFields, N extends keyof TFields = keyof TFields> =
|
|
27
37
|
| SingleValueFieldEqualityCondition<TFields, N>
|
|
28
38
|
| MultiValueFieldEqualityCondition<TFields, N>;
|
package/src/EntityFields.ts
CHANGED
|
@@ -86,22 +86,3 @@ export class EnumField extends EntityFieldDefinition<string | number> {
|
|
|
86
86
|
return typeof value === 'number' || typeof value === 'string';
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
|
-
|
|
90
|
-
/**
|
|
91
|
-
* EntityFieldDefinition for a column with a JS JSON array type.
|
|
92
|
-
*/
|
|
93
|
-
export class JSONArrayField extends EntityFieldDefinition<any[]> {
|
|
94
|
-
protected validateInputValueInternal(value: any[]): boolean {
|
|
95
|
-
return Array.isArray(value);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* EntityFieldDefinition for a column that may be a JS JSON array type.
|
|
101
|
-
* Does not do any validation.
|
|
102
|
-
*/
|
|
103
|
-
export class MaybeJSONArrayField extends EntityFieldDefinition<any | any[]> {
|
|
104
|
-
protected validateInputValueInternal(_value: any): boolean {
|
|
105
|
-
return true;
|
|
106
|
-
}
|
|
107
|
-
}
|
package/src/EntityLoader.ts
CHANGED
|
@@ -183,16 +183,16 @@ export default class EntityLoader<
|
|
|
183
183
|
}
|
|
184
184
|
|
|
185
185
|
/**
|
|
186
|
-
* Loads many entities matching the
|
|
186
|
+
* Loads many entities matching the selection constructed from the conjunction of specified operands.
|
|
187
187
|
* Entities loaded using this method are not batched or cached.
|
|
188
188
|
*
|
|
189
189
|
* @example
|
|
190
190
|
* fieldEqualityOperands:
|
|
191
191
|
* `[{fieldName: 'hello', fieldValue: 1}, {fieldName: 'world', fieldValues: [2, 3]}]`
|
|
192
|
-
* Entities returned:
|
|
192
|
+
* Entities returned with a SQL EntityDatabaseAdapter:
|
|
193
193
|
* `WHERE hello = 1 AND world = ANY({2, 3})`
|
|
194
194
|
*
|
|
195
|
-
* @param fieldEqualityOperands - list of field equality
|
|
195
|
+
* @param fieldEqualityOperands - list of field equality selection operand specifications
|
|
196
196
|
* @param querySelectionModifiers - limit, offset, and orderBy for the query
|
|
197
197
|
* @returns array of entity results that match the query, where result error can be UnauthorizedError
|
|
198
198
|
*/
|
|
@@ -45,7 +45,7 @@ export default interface EntityMutationTriggerConfiguration<
|
|
|
45
45
|
*/
|
|
46
46
|
beforeAll?: EntityMutationTrigger<TFields, TID, TViewerContext, TEntity, TSelectedFields>[];
|
|
47
47
|
/**
|
|
48
|
-
* Trigger set that runs within the transaction but
|
|
48
|
+
* Trigger set that runs within the transaction but after the entity is created in, updated in, or deleted from
|
|
49
49
|
* the database and the cache is invalidated.
|
|
50
50
|
*/
|
|
51
51
|
afterAll?: EntityMutationTrigger<TFields, TID, TViewerContext, TEntity, TSelectedFields>[];
|
|
@@ -65,6 +65,13 @@ export class EntityTransactionalQueryContext extends EntityQueryContext {
|
|
|
65
65
|
|
|
66
66
|
private readonly preCommitCallbacks: { callback: PreCommitCallback; order: number }[] = [];
|
|
67
67
|
|
|
68
|
+
constructor(
|
|
69
|
+
queryInterface: any,
|
|
70
|
+
private readonly entityQueryContextProvider: EntityQueryContextProvider
|
|
71
|
+
) {
|
|
72
|
+
super(queryInterface);
|
|
73
|
+
}
|
|
74
|
+
|
|
68
75
|
/**
|
|
69
76
|
* Schedule a pre-commit callback. These will be run within the transaction right before it is
|
|
70
77
|
* committed, and will be run in the order specified. Ordering of callbacks scheduled with the
|
|
@@ -129,4 +136,57 @@ export class EntityTransactionalQueryContext extends EntityQueryContext {
|
|
|
129
136
|
): Promise<T> {
|
|
130
137
|
return await transactionScope(this);
|
|
131
138
|
}
|
|
139
|
+
|
|
140
|
+
async runInNestedTransactionAsync<T>(
|
|
141
|
+
transactionScope: (innerQueryContext: EntityTransactionalQueryContext) => Promise<T>
|
|
142
|
+
): Promise<T> {
|
|
143
|
+
return await this.entityQueryContextProvider.runInNestedTransactionAsync(
|
|
144
|
+
this,
|
|
145
|
+
transactionScope
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Entity framework representation of a nested transactional query execution unit. When supplied
|
|
152
|
+
* to EntityMutator and EntityLoader methods, those methods and their
|
|
153
|
+
* dependent triggers and validators will run within the nested transaction.
|
|
154
|
+
*
|
|
155
|
+
* This exists to forward post-commit callbacks to the parent query context.
|
|
156
|
+
*/
|
|
157
|
+
export class EntityNestedTransactionalQueryContext extends EntityTransactionalQueryContext {
|
|
158
|
+
private readonly postCommitInvalidationCallbacksToTransfer: PostCommitCallback[] = [];
|
|
159
|
+
private readonly postCommitCallbacksToTransfer: PostCommitCallback[] = [];
|
|
160
|
+
|
|
161
|
+
constructor(
|
|
162
|
+
queryInterface: any,
|
|
163
|
+
private readonly parentQueryContext: EntityTransactionalQueryContext,
|
|
164
|
+
entityQueryContextProvider: EntityQueryContextProvider
|
|
165
|
+
) {
|
|
166
|
+
super(queryInterface, entityQueryContextProvider);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
public override appendPostCommitCallback(callback: PostCommitCallback): void {
|
|
170
|
+
this.postCommitInvalidationCallbacksToTransfer.push(callback);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
public override appendPostCommitInvalidationCallback(callback: PostCommitCallback): void {
|
|
174
|
+
this.postCommitCallbacksToTransfer.push(callback);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
public override runPostCommitCallbacksAsync(): Promise<void> {
|
|
178
|
+
throw new Error(
|
|
179
|
+
'Must not call runPostCommitCallbacksAsync on EntityNestedTransactionalQueryContext'
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
public transferPostCommitCallbacksToParent(): void {
|
|
184
|
+
for (const callback of this.postCommitInvalidationCallbacksToTransfer) {
|
|
185
|
+
this.parentQueryContext.appendPostCommitInvalidationCallback(callback);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
for (const callback of this.postCommitCallbacksToTransfer) {
|
|
189
|
+
this.parentQueryContext.appendPostCommitCallback(callback);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
132
192
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
EntityTransactionalQueryContext,
|
|
3
3
|
EntityNonTransactionalQueryContext,
|
|
4
|
+
EntityNestedTransactionalQueryContext,
|
|
4
5
|
} from './EntityQueryContext';
|
|
5
6
|
|
|
6
7
|
/**
|
|
@@ -26,6 +27,10 @@ export default abstract class EntityQueryContextProvider {
|
|
|
26
27
|
transactionScope: (queryInterface: any) => Promise<T>
|
|
27
28
|
) => Promise<T>;
|
|
28
29
|
|
|
30
|
+
protected abstract createNestedTransactionRunner<T>(
|
|
31
|
+
outerQueryInterface: any
|
|
32
|
+
): (transactionScope: (queryInterface: any) => Promise<T>) => Promise<T>;
|
|
33
|
+
|
|
29
34
|
/**
|
|
30
35
|
* Start a transaction and execute the provided transaction-scoped closure within the transaction.
|
|
31
36
|
* @param transactionScope - async callback to execute within the transaction
|
|
@@ -36,7 +41,7 @@ export default abstract class EntityQueryContextProvider {
|
|
|
36
41
|
const [returnedValue, queryContext] = await this.createTransactionRunner<
|
|
37
42
|
[T, EntityTransactionalQueryContext]
|
|
38
43
|
>()(async (queryInterface) => {
|
|
39
|
-
const queryContext = new EntityTransactionalQueryContext(queryInterface);
|
|
44
|
+
const queryContext = new EntityTransactionalQueryContext(queryInterface, this);
|
|
40
45
|
const result = await transactionScope(queryContext);
|
|
41
46
|
await queryContext.runPreCommitCallbacksAsync();
|
|
42
47
|
return [result, queryContext];
|
|
@@ -44,4 +49,31 @@ export default abstract class EntityQueryContextProvider {
|
|
|
44
49
|
await queryContext.runPostCommitCallbacksAsync();
|
|
45
50
|
return returnedValue;
|
|
46
51
|
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Start a nested transaction from the specified parent transaction and execure the
|
|
55
|
+
* provided nested-transaction-scoped closure within the nested transaction.
|
|
56
|
+
* @param outerQueryContext - the query context of the parent transaction
|
|
57
|
+
* @param transactionScope - async callback to execute within the nested transaction
|
|
58
|
+
*/
|
|
59
|
+
async runInNestedTransactionAsync<T>(
|
|
60
|
+
outerQueryContext: EntityTransactionalQueryContext,
|
|
61
|
+
transactionScope: (innerQueryContext: EntityNestedTransactionalQueryContext) => Promise<T>
|
|
62
|
+
): Promise<T> {
|
|
63
|
+
const [returnedValue, innerQueryContext] = await this.createNestedTransactionRunner<
|
|
64
|
+
[T, EntityNestedTransactionalQueryContext]
|
|
65
|
+
>(outerQueryContext.getQueryInterface())(async (innerQueryInterface) => {
|
|
66
|
+
const innerQueryContext = new EntityNestedTransactionalQueryContext(
|
|
67
|
+
innerQueryInterface,
|
|
68
|
+
outerQueryContext,
|
|
69
|
+
this
|
|
70
|
+
);
|
|
71
|
+
const result = await transactionScope(innerQueryContext);
|
|
72
|
+
await innerQueryContext.runPreCommitCallbacksAsync();
|
|
73
|
+
return [result, innerQueryContext];
|
|
74
|
+
});
|
|
75
|
+
// post-commit callbacks are appended to parent transaction instead of run, but only after the transaction has succeeded
|
|
76
|
+
innerQueryContext.transferPostCommitCallbacksToParent();
|
|
77
|
+
return returnedValue;
|
|
78
|
+
}
|
|
47
79
|
}
|
|
@@ -11,8 +11,6 @@ import {
|
|
|
11
11
|
StringArrayField,
|
|
12
12
|
JSONObjectField,
|
|
13
13
|
EnumField,
|
|
14
|
-
JSONArrayField,
|
|
15
|
-
MaybeJSONArrayField,
|
|
16
14
|
} from '../EntityFields';
|
|
17
15
|
import describeFieldTestCase from '../utils/testing/describeFieldTestCase';
|
|
18
16
|
|
|
@@ -71,13 +69,3 @@ describeFieldTestCase(
|
|
|
71
69
|
);
|
|
72
70
|
describeFieldTestCase(new JSONObjectField({ columnName: 'wat' }), [{}], [true, 'hello']);
|
|
73
71
|
describeFieldTestCase(new EnumField({ columnName: 'wat' }), ['hello', 1], [true]);
|
|
74
|
-
describeFieldTestCase(
|
|
75
|
-
new JSONArrayField({ columnName: 'wat' }),
|
|
76
|
-
[[[1, 2]] as any, [['hello']] as any], // jest test cases need extra wrapping array
|
|
77
|
-
[1, 'hello']
|
|
78
|
-
);
|
|
79
|
-
describeFieldTestCase(
|
|
80
|
-
new MaybeJSONArrayField({ columnName: 'wat' }),
|
|
81
|
-
[1, 'hello', [['hello']]], // jest test cases need extra wrapping array
|
|
82
|
-
[]
|
|
83
|
-
);
|
|
@@ -78,5 +78,55 @@ describe(EntityQueryContext, () => {
|
|
|
78
78
|
expect(postCommitCallback).toHaveBeenCalledTimes(0);
|
|
79
79
|
expect(postCommitInvalidationCallback).toHaveBeenCalledTimes(0);
|
|
80
80
|
});
|
|
81
|
+
|
|
82
|
+
it('calls callbacks correctly for nested transactions', async () => {
|
|
83
|
+
const companionProvider = createUnitTestEntityCompanionProvider();
|
|
84
|
+
const viewerContext = new ViewerContext(companionProvider);
|
|
85
|
+
|
|
86
|
+
const preCommitCallback = jest.fn(async (): Promise<void> => {});
|
|
87
|
+
const preCommitNestedCallback = jest.fn(async (): Promise<void> => {});
|
|
88
|
+
const preCommitNestedCallbackThrow = jest.fn(async (): Promise<void> => {
|
|
89
|
+
throw new Error('wat');
|
|
90
|
+
});
|
|
91
|
+
const postCommitInvalidationCallback = jest.fn(async (): Promise<void> => {});
|
|
92
|
+
const postCommitCallback = jest.fn(async (): Promise<void> => {});
|
|
93
|
+
|
|
94
|
+
await viewerContext.runInTransactionForDatabaseAdaptorFlavorAsync(
|
|
95
|
+
'postgres',
|
|
96
|
+
async (queryContext) => {
|
|
97
|
+
queryContext.appendPostCommitCallback(postCommitCallback);
|
|
98
|
+
queryContext.appendPostCommitInvalidationCallback(postCommitInvalidationCallback);
|
|
99
|
+
queryContext.appendPreCommitCallback(preCommitCallback, 0);
|
|
100
|
+
|
|
101
|
+
await Promise.all([
|
|
102
|
+
queryContext.runInNestedTransactionAsync(async (innerQueryContext) => {
|
|
103
|
+
innerQueryContext.appendPostCommitCallback(postCommitCallback);
|
|
104
|
+
innerQueryContext.appendPostCommitInvalidationCallback(
|
|
105
|
+
postCommitInvalidationCallback
|
|
106
|
+
);
|
|
107
|
+
innerQueryContext.appendPreCommitCallback(preCommitNestedCallback, 0);
|
|
108
|
+
}),
|
|
109
|
+
(async () => {
|
|
110
|
+
try {
|
|
111
|
+
await queryContext.runInNestedTransactionAsync(async (innerQueryContext) => {
|
|
112
|
+
// these two shouldn't be called
|
|
113
|
+
innerQueryContext.appendPostCommitCallback(postCommitCallback);
|
|
114
|
+
innerQueryContext.appendPostCommitInvalidationCallback(
|
|
115
|
+
postCommitInvalidationCallback
|
|
116
|
+
);
|
|
117
|
+
innerQueryContext.appendPreCommitCallback(preCommitNestedCallbackThrow, 0);
|
|
118
|
+
});
|
|
119
|
+
} catch {}
|
|
120
|
+
})(),
|
|
121
|
+
]);
|
|
122
|
+
}
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
expect(preCommitCallback).toHaveBeenCalledTimes(1);
|
|
126
|
+
expect(preCommitNestedCallback).toHaveBeenCalledTimes(1);
|
|
127
|
+
expect(preCommitNestedCallbackThrow).toHaveBeenCalledTimes(1);
|
|
128
|
+
expect(postCommitCallback).toHaveBeenCalledTimes(2);
|
|
129
|
+
expect(postCommitInvalidationCallback).toHaveBeenCalledTimes(2);
|
|
130
|
+
});
|
|
81
131
|
});
|
|
82
132
|
});
|
|
@@ -10,6 +10,12 @@ export class StubQueryContextProvider extends EntityQueryContextProvider {
|
|
|
10
10
|
) => Promise<T> {
|
|
11
11
|
return (transactionScope) => Promise.resolve(transactionScope({}));
|
|
12
12
|
}
|
|
13
|
+
|
|
14
|
+
protected createNestedTransactionRunner<T>(
|
|
15
|
+
_outerQueryInterface: any
|
|
16
|
+
): (transactionScope: (queryInterface: any) => Promise<T>) => Promise<T> {
|
|
17
|
+
return (transactionScope) => Promise.resolve(transactionScope({}));
|
|
18
|
+
}
|
|
13
19
|
}
|
|
14
20
|
|
|
15
21
|
export default new StubQueryContextProvider();
|