@expo/entity 0.25.1 → 0.26.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/Entity.js +4 -4
- package/build/Entity.js.map +1 -1
- package/build/EntityFieldDefinition.d.ts +16 -8
- package/build/EntityFieldDefinition.js +12 -5
- package/build/EntityFieldDefinition.js.map +1 -1
- package/build/EntityLoader.js +2 -2
- package/build/EntityLoader.js.map +1 -1
- package/build/EntityMutationInfo.d.ts +2 -0
- package/build/EntityMutator.d.ts +6 -8
- package/build/EntityMutator.js +58 -46
- package/build/EntityMutator.js.map +1 -1
- package/build/EntityMutatorFactory.d.ts +4 -4
- package/build/EntityMutatorFactory.js +6 -6
- package/build/EntityMutatorFactory.js.map +1 -1
- package/build/EntityPrivacyPolicy.d.ts +13 -0
- package/build/EntityPrivacyPolicy.js +13 -0
- package/build/EntityPrivacyPolicy.js.map +1 -1
- package/build/EntityQueryContext.d.ts +11 -0
- package/build/EntityQueryContext.js +11 -0
- package/build/EntityQueryContext.js.map +1 -1
- package/build/ViewerScopedEntityMutatorFactory.d.ts +4 -4
- package/build/ViewerScopedEntityMutatorFactory.js +6 -6
- package/build/ViewerScopedEntityMutatorFactory.js.map +1 -1
- package/build/__tests__/ComposedCacheAdapter-test.js +1 -1
- package/build/__tests__/ComposedCacheAdapter-test.js.map +1 -1
- package/build/__tests__/EntityCommonUseCases-test.js +5 -1
- package/build/__tests__/EntityCommonUseCases-test.js.map +1 -1
- package/build/__tests__/EntityCompanion-test.js +5 -1
- package/build/__tests__/EntityCompanion-test.js.map +1 -1
- package/build/__tests__/EntityCompanionProvider-test.js +5 -1
- package/build/__tests__/EntityCompanionProvider-test.js.map +1 -1
- package/build/__tests__/EntityEdges-test.js +199 -33
- package/build/__tests__/EntityEdges-test.js.map +1 -1
- package/build/__tests__/EntityLoader-test.js +5 -1
- package/build/__tests__/EntityLoader-test.js.map +1 -1
- package/build/__tests__/EntityMutator-test.js +38 -53
- package/build/__tests__/EntityMutator-test.js.map +1 -1
- package/build/__tests__/EntityPrivacyPolicy-test.js +5 -1
- package/build/__tests__/EntityPrivacyPolicy-test.js.map +1 -1
- package/build/__tests__/EntitySelfReferentialEdges-test.js +2 -2
- package/build/__tests__/EntitySelfReferentialEdges-test.js.map +1 -1
- package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js +5 -1
- package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js.map +1 -1
- package/build/__tests__/ViewerScopedEntityMutatorFactory-test.js +2 -3
- package/build/__tests__/ViewerScopedEntityMutatorFactory-test.js.map +1 -1
- package/build/errors/EntityCacheAdapterError.js +5 -1
- package/build/errors/EntityCacheAdapterError.js.map +1 -1
- package/build/errors/EntityDatabaseAdapterError.js +5 -1
- package/build/errors/EntityDatabaseAdapterError.js.map +1 -1
- package/build/errors/EntityInvalidFieldValueError.js +6 -2
- package/build/errors/EntityInvalidFieldValueError.js.map +1 -1
- package/build/errors/EntityNotAuthorizedError.js +5 -1
- package/build/errors/EntityNotAuthorizedError.js.map +1 -1
- package/build/errors/EntityNotFoundError.js +6 -2
- package/build/errors/EntityNotFoundError.js.map +1 -1
- package/build/index.js +5 -1
- package/build/index.js.map +1 -1
- package/build/internal/EntityDataManager.js +7 -4
- package/build/internal/EntityDataManager.js.map +1 -1
- package/build/internal/EntityFieldTransformationUtils.js +1 -1
- package/build/internal/EntityFieldTransformationUtils.js.map +1 -1
- package/build/internal/ReadThroughEntityCache.js +1 -1
- package/build/internal/ReadThroughEntityCache.js.map +1 -1
- package/build/internal/__tests__/EntityDataManager-test.js +12 -7
- package/build/internal/__tests__/EntityDataManager-test.js.map +1 -1
- package/build/internal/__tests__/ReadThroughEntityCache-test.js +5 -1
- package/build/internal/__tests__/ReadThroughEntityCache-test.js.map +1 -1
- package/build/metrics/IEntityMetricsAdapter.d.ts +62 -17
- package/build/metrics/IEntityMetricsAdapter.js +17 -1
- package/build/metrics/IEntityMetricsAdapter.js.map +1 -1
- package/build/metrics/NoOpEntityMetricsAdapter.d.ts +1 -3
- package/build/metrics/NoOpEntityMetricsAdapter.js +1 -3
- package/build/metrics/NoOpEntityMetricsAdapter.js.map +1 -1
- package/build/rules/AlwaysAllowPrivacyPolicyRule.js +5 -1
- package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -1
- package/build/rules/AlwaysDenyPrivacyPolicyRule.js +5 -1
- package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -1
- package/build/rules/AlwaysSkipPrivacyPolicyRule.js +5 -1
- package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -1
- package/build/utils/testing/StubDatabaseAdapter.js +6 -2
- package/build/utils/testing/StubDatabaseAdapter.js.map +1 -1
- package/package.json +1 -1
- package/src/Entity.ts +4 -4
- package/src/EntityFieldDefinition.ts +15 -6
- package/src/EntityLoader.ts +4 -2
- package/src/EntityMutationInfo.ts +2 -0
- package/src/EntityMutator.ts +98 -67
- package/src/EntityMutatorFactory.ts +4 -10
- package/src/EntityPrivacyPolicy.ts +15 -0
- package/src/EntityQueryContext.ts +11 -0
- package/src/ViewerScopedEntityMutatorFactory.ts +7 -22
- package/src/__tests__/ComposedCacheAdapter-test.ts +1 -1
- package/src/__tests__/EntityEdges-test.ts +287 -32
- package/src/__tests__/EntityMutator-test.ts +33 -54
- package/src/__tests__/EntitySelfReferentialEdges-test.ts +2 -2
- package/src/__tests__/ViewerScopedEntityMutatorFactory-test.ts +2 -6
- package/src/errors/EntityInvalidFieldValueError.ts +1 -1
- package/src/errors/EntityNotFoundError.ts +1 -1
- package/src/internal/EntityDataManager.ts +13 -5
- package/src/internal/EntityFieldTransformationUtils.ts +1 -1
- package/src/internal/ReadThroughEntityCache.ts +3 -1
- package/src/internal/__tests__/EntityDataManager-test.ts +11 -8
- package/src/metrics/IEntityMetricsAdapter.ts +72 -19
- package/src/metrics/NoOpEntityMetricsAdapter.ts +1 -5
- package/src/utils/testing/StubDatabaseAdapter.ts +4 -1
|
@@ -4,9 +4,7 @@ class NoOpEntityMetricsAdapter {
|
|
|
4
4
|
logAuthorizationEvent(_authorizationEvent) { }
|
|
5
5
|
logDataManagerLoadEvent(_loadEvent) { }
|
|
6
6
|
logMutatorMutationEvent(_mutationEvent) { }
|
|
7
|
-
|
|
8
|
-
incrementDataManagerCacheLoadCount(_incrementLoadCountEvent) { }
|
|
9
|
-
incrementDataManagerDatabaseLoadCount(_incrementLoadCountEvent) { }
|
|
7
|
+
incrementDataManagerLoadCount(_incrementLoadCountEvent) { }
|
|
10
8
|
}
|
|
11
9
|
exports.default = NoOpEntityMetricsAdapter;
|
|
12
10
|
//# sourceMappingURL=NoOpEntityMetricsAdapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NoOpEntityMetricsAdapter.js","sourceRoot":"","sources":["../../src/metrics/NoOpEntityMetricsAdapter.ts"],"names":[],"mappings":";;AAOA,MAAqB,wBAAwB;IAC3C,qBAAqB,CAAC,mBAAoD,IAAS,CAAC;IACpF,uBAAuB,CAAC,UAAkC,IAAS,CAAC;IACpE,uBAAuB,CAAC,cAA0C,IAAS,CAAC;IAC5E,
|
|
1
|
+
{"version":3,"file":"NoOpEntityMetricsAdapter.js","sourceRoot":"","sources":["../../src/metrics/NoOpEntityMetricsAdapter.ts"],"names":[],"mappings":";;AAOA,MAAqB,wBAAwB;IAC3C,qBAAqB,CAAC,mBAAoD,IAAS,CAAC;IACpF,uBAAuB,CAAC,UAAkC,IAAS,CAAC;IACpE,uBAAuB,CAAC,cAA0C,IAAS,CAAC;IAC5E,6BAA6B,CAAC,wBAAiD,IAAS,CAAC;CAC1F;AALD,2CAKC"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AlwaysAllowPrivacyPolicyRule.js","sourceRoot":"","sources":["../../src/rules/AlwaysAllowPrivacyPolicyRule.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AlwaysAllowPrivacyPolicyRule.js","sourceRoot":"","sources":["../../src/rules/AlwaysAllowPrivacyPolicyRule.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAIA,yEAA8E;AAE9E;;GAEG;AACH,MAAqB,4BAMnB,SAAQ,2BAAyE;IACjF,KAAK,CAAC,aAAa,CACjB,cAA8B,EAC9B,aAAiC,EACjC,kBAAwD,EACxD,OAAgB;QAEhB,OAAO,wCAAoB,CAAC,KAAK,CAAC;IACpC,CAAC;CACF;AAfD,+CAeC"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AlwaysDenyPrivacyPolicyRule.js","sourceRoot":"","sources":["../../src/rules/AlwaysDenyPrivacyPolicyRule.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AlwaysDenyPrivacyPolicyRule.js","sourceRoot":"","sources":["../../src/rules/AlwaysDenyPrivacyPolicyRule.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAIA,yEAA8E;AAE9E;;GAEG;AACH,MAAqB,2BAMnB,SAAQ,2BAAyE;IACjF,KAAK,CAAC,aAAa,CACjB,cAA8B,EAC9B,aAAiC,EACjC,kBAAwD,EACxD,OAAgB;QAEhB,OAAO,wCAAoB,CAAC,IAAI,CAAC;IACnC,CAAC;CACF;AAfD,8CAeC"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AlwaysSkipPrivacyPolicyRule.js","sourceRoot":"","sources":["../../src/rules/AlwaysSkipPrivacyPolicyRule.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AlwaysSkipPrivacyPolicyRule.js","sourceRoot":"","sources":["../../src/rules/AlwaysSkipPrivacyPolicyRule.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAIA,yEAA8E;AAE9E;;GAEG;AACH,MAAqB,2BAMnB,SAAQ,2BAAyE;IACjF,KAAK,CAAC,aAAa,CACjB,cAA8B,EAC9B,aAAiC,EACjC,kBAAwD,EACxD,OAAgB;QAEhB,OAAO,wCAAoB,CAAC,IAAI,CAAC;IACnC,CAAC;CACF;AAfD,8CAeC"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -122,7 +126,7 @@ class StubDatabaseAdapter extends EntityDatabaseAdapter_1.default {
|
|
|
122
126
|
}
|
|
123
127
|
generateRandomID() {
|
|
124
128
|
const idSchemaField = this.entityConfiguration2.schema.get(this.entityConfiguration2.idField);
|
|
125
|
-
(0, invariant_1.default)(idSchemaField, `No schema field found for ${this.entityConfiguration2.idField}`);
|
|
129
|
+
(0, invariant_1.default)(idSchemaField, `No schema field found for ${String(this.entityConfiguration2.idField)}`);
|
|
126
130
|
if (idSchemaField instanceof EntityFields_1.StringField) {
|
|
127
131
|
return (0, uuid_1.v4)();
|
|
128
132
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StubDatabaseAdapter.js","sourceRoot":"","sources":["../../../src/utils/testing/StubDatabaseAdapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"StubDatabaseAdapter.js","sourceRoot":"","sources":["../../../src/utils/testing/StubDatabaseAdapter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/Entity.ts
CHANGED
|
@@ -69,7 +69,7 @@ export default abstract class Entity<
|
|
|
69
69
|
return viewerContext
|
|
70
70
|
.getViewerScopedEntityCompanionForClass(this)
|
|
71
71
|
.getMutatorFactory()
|
|
72
|
-
.forCreate(queryContext
|
|
72
|
+
.forCreate(queryContext);
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
/**
|
|
@@ -111,7 +111,7 @@ export default abstract class Entity<
|
|
|
111
111
|
.getViewerContext()
|
|
112
112
|
.getViewerScopedEntityCompanionForClass(this)
|
|
113
113
|
.getMutatorFactory()
|
|
114
|
-
.forUpdate(existingEntity, queryContext
|
|
114
|
+
.forUpdate(existingEntity, queryContext);
|
|
115
115
|
}
|
|
116
116
|
|
|
117
117
|
/**
|
|
@@ -152,7 +152,7 @@ export default abstract class Entity<
|
|
|
152
152
|
.getViewerContext()
|
|
153
153
|
.getViewerScopedEntityCompanionForClass(this)
|
|
154
154
|
.getMutatorFactory()
|
|
155
|
-
.forDelete(existingEntity, queryContext
|
|
155
|
+
.forDelete(existingEntity, queryContext)
|
|
156
156
|
.deleteAsync();
|
|
157
157
|
}
|
|
158
158
|
|
|
@@ -194,7 +194,7 @@ export default abstract class Entity<
|
|
|
194
194
|
.getViewerContext()
|
|
195
195
|
.getViewerScopedEntityCompanionForClass(this)
|
|
196
196
|
.getMutatorFactory()
|
|
197
|
-
.forDelete(existingEntity, queryContext
|
|
197
|
+
.forDelete(existingEntity, queryContext)
|
|
198
198
|
.enforceDeleteAsync();
|
|
199
199
|
}
|
|
200
200
|
|
|
@@ -5,13 +5,21 @@ import ViewerContext from './ViewerContext';
|
|
|
5
5
|
|
|
6
6
|
export enum EntityEdgeDeletionBehavior {
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
8
|
+
* Invalidate the cache for all entities that reference the entity
|
|
9
9
|
* being deleted through this field, and transitively run deletions on those entities.
|
|
10
10
|
* This is most useful when the database itself expresses foreign
|
|
11
|
-
* keys and cascading deletes
|
|
11
|
+
* keys and cascading deletes and the entity framework just needs to
|
|
12
12
|
* be kept consistent with the state of the database.
|
|
13
13
|
*/
|
|
14
|
-
|
|
14
|
+
CASCADE_DELETE_INVALIDATE_CACHE_ONLY,
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Invalidate the cache for all entities that reference the entity
|
|
18
|
+
* being deleted through this field. This is most useful when the database itself expresses
|
|
19
|
+
* foreign keys and cascading "SET NULL"s and the entity framework just needs to be
|
|
20
|
+
* kept consistent with the state of the database.
|
|
21
|
+
*/
|
|
22
|
+
SET_NULL_INVALIDATE_CACHE_ONLY,
|
|
15
23
|
|
|
16
24
|
/**
|
|
17
25
|
* Delete all entities that reference the entity being deleted through this field. This is very similar
|
|
@@ -74,16 +82,17 @@ export interface EntityAssociationDefinition<
|
|
|
74
82
|
*
|
|
75
83
|
* @remarks
|
|
76
84
|
* The entity framework doesn't prescribe a one-size-fits-all solution for referential
|
|
77
|
-
* integrity; instead it exposes mechanisms that
|
|
85
|
+
* integrity; instead it exposes mechanisms that support both database foreign key constraints
|
|
78
86
|
* and implicit entity-specified foreign keys. Choosing which approach to use often depends on
|
|
79
87
|
* application requirements, and sometimes even a mix-and-match is the right choice.
|
|
80
88
|
*
|
|
81
89
|
* - If referential integrity is critical to your application, database foreign key constraints
|
|
82
|
-
* combined with {@link EntityEdgeDeletionBehavior.
|
|
90
|
+
* combined with {@link EntityEdgeDeletionBehavior.CASCADE_DELETE_INVALIDATE_CACHE_ONLY} or
|
|
91
|
+
* {@link EntityEdgeDeletionBehavior.SET_NULL_INVALIDATE_CACHE_ONLY} are recommended.
|
|
83
92
|
* - If the database being used doesn't support foreign keys, then using the entity framework for referential
|
|
84
93
|
* integrity is recommended.
|
|
85
94
|
*/
|
|
86
|
-
edgeDeletionBehavior
|
|
95
|
+
edgeDeletionBehavior: EntityEdgeDeletionBehavior;
|
|
87
96
|
}
|
|
88
97
|
|
|
89
98
|
/**
|
package/src/EntityLoader.ts
CHANGED
|
@@ -126,7 +126,9 @@ export default class EntityLoader<
|
|
|
126
126
|
const entityResults = await this.loadManyByFieldEqualingAsync(uniqueFieldName, fieldValue);
|
|
127
127
|
invariant(
|
|
128
128
|
entityResults.length <= 1,
|
|
129
|
-
`loadByFieldEqualing: Multiple entities of type ${this.entityClass.name} found for ${
|
|
129
|
+
`loadByFieldEqualing: Multiple entities of type ${this.entityClass.name} found for ${String(
|
|
130
|
+
uniqueFieldName
|
|
131
|
+
)}=${fieldValue}`
|
|
130
132
|
);
|
|
131
133
|
return entityResults[0] ?? null;
|
|
132
134
|
}
|
|
@@ -350,7 +352,7 @@ export default class EntityLoader<
|
|
|
350
352
|
fieldValues: readonly TFields[N][]
|
|
351
353
|
): void {
|
|
352
354
|
const fieldDefinition = this.entityConfiguration.schema.get(fieldName);
|
|
353
|
-
invariant(fieldDefinition, `must have field definition for field = ${fieldName}`);
|
|
355
|
+
invariant(fieldDefinition, `must have field definition for field = ${String(fieldName)}`);
|
|
354
356
|
for (const fieldValue of fieldValues) {
|
|
355
357
|
const isInputValid = fieldDefinition.validateInputValue(fieldValue);
|
|
356
358
|
if (!isInputValid) {
|
|
@@ -20,6 +20,7 @@ export type EntityValidatorMutationInfo<
|
|
|
20
20
|
| {
|
|
21
21
|
type: EntityMutationType.UPDATE;
|
|
22
22
|
previousValue: TEntity;
|
|
23
|
+
cascadingDeleteCause: EntityCascadingDeletionInfo | null;
|
|
23
24
|
};
|
|
24
25
|
|
|
25
26
|
/**
|
|
@@ -50,6 +51,7 @@ export type EntityTriggerMutationInfo<
|
|
|
50
51
|
| {
|
|
51
52
|
type: EntityMutationType.UPDATE;
|
|
52
53
|
previousValue: TEntity;
|
|
54
|
+
cascadingDeleteCause: EntityCascadingDeletionInfo | null;
|
|
53
55
|
}
|
|
54
56
|
| {
|
|
55
57
|
type: EntityMutationType.DELETE;
|
package/src/EntityMutator.ts
CHANGED
|
@@ -18,7 +18,7 @@ import EntityMutationTriggerConfiguration, {
|
|
|
18
18
|
EntityNonTransactionalMutationTrigger,
|
|
19
19
|
} from './EntityMutationTriggerConfiguration';
|
|
20
20
|
import EntityMutationValidator from './EntityMutationValidator';
|
|
21
|
-
import EntityPrivacyPolicy
|
|
21
|
+
import EntityPrivacyPolicy from './EntityPrivacyPolicy';
|
|
22
22
|
import { EntityQueryContext, EntityTransactionalQueryContext } from './EntityQueryContext';
|
|
23
23
|
import ReadonlyEntity from './ReadonlyEntity';
|
|
24
24
|
import ViewerContext from './ViewerContext';
|
|
@@ -44,7 +44,6 @@ abstract class BaseMutator<
|
|
|
44
44
|
constructor(
|
|
45
45
|
protected readonly viewerContext: TViewerContext,
|
|
46
46
|
protected readonly queryContext: EntityQueryContext,
|
|
47
|
-
protected readonly privacyPolicyEvaluationContext: EntityPrivacyPolicyEvaluationContext,
|
|
48
47
|
protected readonly entityConfiguration: EntityConfiguration<TFields>,
|
|
49
48
|
protected readonly entityClass: IEntityClass<
|
|
50
49
|
TFields,
|
|
@@ -183,7 +182,7 @@ export class CreateMutator<
|
|
|
183
182
|
|
|
184
183
|
/**
|
|
185
184
|
* Commit the new entity after authorizing against creation privacy rules. Invalidates all caches for
|
|
186
|
-
* queries that would return new entity
|
|
185
|
+
* queries that would return new entity.
|
|
187
186
|
* @returns authorized, cached, newly-created entity result, where result error can be UnauthorizedError
|
|
188
187
|
*/
|
|
189
188
|
async createAsync(): Promise<Result<TEntity>> {
|
|
@@ -221,7 +220,7 @@ export class CreateMutator<
|
|
|
221
220
|
this.privacyPolicy.authorizeCreateAsync(
|
|
222
221
|
this.viewerContext,
|
|
223
222
|
queryContext,
|
|
224
|
-
|
|
223
|
+
{ cascadingDeleteCause: null },
|
|
225
224
|
temporaryEntityForPrivacyCheck,
|
|
226
225
|
this.metricsAdapter
|
|
227
226
|
)
|
|
@@ -251,11 +250,9 @@ export class CreateMutator<
|
|
|
251
250
|
|
|
252
251
|
const insertResult = await this.databaseAdapter.insertAsync(queryContext, this.fieldsForEntity);
|
|
253
252
|
|
|
254
|
-
const entityLoader = this.entityLoaderFactory.forLoad(
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
this.privacyPolicyEvaluationContext
|
|
258
|
-
);
|
|
253
|
+
const entityLoader = this.entityLoaderFactory.forLoad(this.viewerContext, queryContext, {
|
|
254
|
+
cascadingDeleteCause: null,
|
|
255
|
+
});
|
|
259
256
|
queryContext.appendPostCommitInvalidationCallback(
|
|
260
257
|
entityLoader.invalidateFieldsAsync.bind(entityLoader, insertResult)
|
|
261
258
|
);
|
|
@@ -315,7 +312,6 @@ export class UpdateMutator<
|
|
|
315
312
|
constructor(
|
|
316
313
|
viewerContext: TViewerContext,
|
|
317
314
|
queryContext: EntityQueryContext,
|
|
318
|
-
privacyPolicyEvaluationContext: EntityPrivacyPolicyEvaluationContext,
|
|
319
315
|
entityConfiguration: EntityConfiguration<TFields>,
|
|
320
316
|
entityClass: IEntityClass<
|
|
321
317
|
TFields,
|
|
@@ -355,7 +351,6 @@ export class UpdateMutator<
|
|
|
355
351
|
super(
|
|
356
352
|
viewerContext,
|
|
357
353
|
queryContext,
|
|
358
|
-
privacyPolicyEvaluationContext,
|
|
359
354
|
entityConfiguration,
|
|
360
355
|
entityClass,
|
|
361
356
|
privacyPolicy,
|
|
@@ -382,8 +377,7 @@ export class UpdateMutator<
|
|
|
382
377
|
|
|
383
378
|
/**
|
|
384
379
|
* Commit the changes to the entity after authorizing against update privacy rules.
|
|
385
|
-
* Invalidates all caches for pre-update entity
|
|
386
|
-
* transactional query context.
|
|
380
|
+
* Invalidates all caches for pre-update entity.
|
|
387
381
|
* @returns authorized updated entity result, where result error can be UnauthorizedError
|
|
388
382
|
*/
|
|
389
383
|
async updateAsync(): Promise<Result<TEntity>> {
|
|
@@ -391,7 +385,7 @@ export class UpdateMutator<
|
|
|
391
385
|
this.metricsAdapter,
|
|
392
386
|
EntityMetricsMutationType.UPDATE,
|
|
393
387
|
this.entityClass.name
|
|
394
|
-
)(this.updateInTransactionAsync());
|
|
388
|
+
)(this.updateInTransactionAsync(false, null));
|
|
395
389
|
}
|
|
396
390
|
|
|
397
391
|
/**
|
|
@@ -401,14 +395,27 @@ export class UpdateMutator<
|
|
|
401
395
|
return await enforceAsyncResult(this.updateAsync());
|
|
402
396
|
}
|
|
403
397
|
|
|
404
|
-
private async updateInTransactionAsync(
|
|
398
|
+
private async updateInTransactionAsync(
|
|
399
|
+
skipDatabaseUpdate: true,
|
|
400
|
+
cascadingDeleteCause: EntityCascadingDeletionInfo
|
|
401
|
+
): Promise<Result<TEntity>>;
|
|
402
|
+
private async updateInTransactionAsync(
|
|
403
|
+
skipDatabaseUpdate: false,
|
|
404
|
+
cascadingDeleteCause: EntityCascadingDeletionInfo | null
|
|
405
|
+
): Promise<Result<TEntity>>;
|
|
406
|
+
private async updateInTransactionAsync(
|
|
407
|
+
skipDatabaseUpdate: boolean,
|
|
408
|
+
cascadingDeleteCause: EntityCascadingDeletionInfo | null
|
|
409
|
+
): Promise<Result<TEntity>> {
|
|
405
410
|
return await this.queryContext.runInTransactionIfNotInTransactionAsync((innerQueryContext) =>
|
|
406
|
-
this.updateInternalAsync(innerQueryContext)
|
|
411
|
+
this.updateInternalAsync(innerQueryContext, skipDatabaseUpdate, cascadingDeleteCause)
|
|
407
412
|
);
|
|
408
413
|
}
|
|
409
414
|
|
|
410
415
|
private async updateInternalAsync(
|
|
411
|
-
queryContext: EntityTransactionalQueryContext
|
|
416
|
+
queryContext: EntityTransactionalQueryContext,
|
|
417
|
+
skipDatabaseUpdate: boolean,
|
|
418
|
+
cascadingDeleteCause: EntityCascadingDeletionInfo | null
|
|
412
419
|
): Promise<Result<TEntity>> {
|
|
413
420
|
this.validateFields(this.updatedFields);
|
|
414
421
|
|
|
@@ -417,7 +424,7 @@ export class UpdateMutator<
|
|
|
417
424
|
this.privacyPolicy.authorizeUpdateAsync(
|
|
418
425
|
this.viewerContext,
|
|
419
426
|
queryContext,
|
|
420
|
-
|
|
427
|
+
{ cascadingDeleteCause },
|
|
421
428
|
entityAboutToBeUpdated,
|
|
422
429
|
this.metricsAdapter
|
|
423
430
|
)
|
|
@@ -430,33 +437,34 @@ export class UpdateMutator<
|
|
|
430
437
|
this.mutationValidators,
|
|
431
438
|
queryContext,
|
|
432
439
|
entityAboutToBeUpdated,
|
|
433
|
-
{ type: EntityMutationType.UPDATE, previousValue: this.originalEntity }
|
|
440
|
+
{ type: EntityMutationType.UPDATE, previousValue: this.originalEntity, cascadingDeleteCause }
|
|
434
441
|
);
|
|
435
442
|
await this.executeMutationTriggersAsync(
|
|
436
443
|
this.mutationTriggers.beforeAll,
|
|
437
444
|
queryContext,
|
|
438
445
|
entityAboutToBeUpdated,
|
|
439
|
-
{ type: EntityMutationType.UPDATE, previousValue: this.originalEntity }
|
|
446
|
+
{ type: EntityMutationType.UPDATE, previousValue: this.originalEntity, cascadingDeleteCause }
|
|
440
447
|
);
|
|
441
448
|
await this.executeMutationTriggersAsync(
|
|
442
449
|
this.mutationTriggers.beforeUpdate,
|
|
443
450
|
queryContext,
|
|
444
451
|
entityAboutToBeUpdated,
|
|
445
|
-
{ type: EntityMutationType.UPDATE, previousValue: this.originalEntity }
|
|
452
|
+
{ type: EntityMutationType.UPDATE, previousValue: this.originalEntity, cascadingDeleteCause }
|
|
446
453
|
);
|
|
447
454
|
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
455
|
+
// skip the database update when specified
|
|
456
|
+
const updateResult = skipDatabaseUpdate
|
|
457
|
+
? null
|
|
458
|
+
: await this.databaseAdapter.updateAsync(
|
|
459
|
+
queryContext,
|
|
460
|
+
this.entityConfiguration.idField,
|
|
461
|
+
entityAboutToBeUpdated.getID(),
|
|
462
|
+
this.updatedFields
|
|
463
|
+
);
|
|
454
464
|
|
|
455
|
-
const entityLoader = this.entityLoaderFactory.forLoad(
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
this.privacyPolicyEvaluationContext
|
|
459
|
-
);
|
|
465
|
+
const entityLoader = this.entityLoaderFactory.forLoad(this.viewerContext, queryContext, {
|
|
466
|
+
cascadingDeleteCause,
|
|
467
|
+
});
|
|
460
468
|
|
|
461
469
|
queryContext.appendPostCommitInvalidationCallback(
|
|
462
470
|
entityLoader.invalidateFieldsAsync.bind(
|
|
@@ -468,22 +476,25 @@ export class UpdateMutator<
|
|
|
468
476
|
entityLoader.invalidateFieldsAsync.bind(entityLoader, this.fieldsForEntity)
|
|
469
477
|
);
|
|
470
478
|
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
479
|
+
// when the database update was skipped, assume it succeeded and use the optimistic
|
|
480
|
+
// entity to execute triggers
|
|
481
|
+
const updatedEntity = updateResult
|
|
482
|
+
? await entityLoader
|
|
483
|
+
.enforcing()
|
|
484
|
+
.loadByIDAsync(new this.entityClass(this.viewerContext, updateResult).getID())
|
|
485
|
+
: entityAboutToBeUpdated;
|
|
475
486
|
|
|
476
487
|
await this.executeMutationTriggersAsync(
|
|
477
488
|
this.mutationTriggers.afterUpdate,
|
|
478
489
|
queryContext,
|
|
479
490
|
updatedEntity,
|
|
480
|
-
{ type: EntityMutationType.UPDATE, previousValue: this.originalEntity }
|
|
491
|
+
{ type: EntityMutationType.UPDATE, previousValue: this.originalEntity, cascadingDeleteCause }
|
|
481
492
|
);
|
|
482
493
|
await this.executeMutationTriggersAsync(
|
|
483
494
|
this.mutationTriggers.afterAll,
|
|
484
495
|
queryContext,
|
|
485
496
|
updatedEntity,
|
|
486
|
-
{ type: EntityMutationType.UPDATE, previousValue: this.originalEntity }
|
|
497
|
+
{ type: EntityMutationType.UPDATE, previousValue: this.originalEntity, cascadingDeleteCause }
|
|
487
498
|
);
|
|
488
499
|
|
|
489
500
|
queryContext.appendPostCommitCallback(
|
|
@@ -491,7 +502,11 @@ export class UpdateMutator<
|
|
|
491
502
|
this,
|
|
492
503
|
this.mutationTriggers.afterCommit,
|
|
493
504
|
updatedEntity,
|
|
494
|
-
{
|
|
505
|
+
{
|
|
506
|
+
type: EntityMutationType.UPDATE,
|
|
507
|
+
previousValue: this.originalEntity,
|
|
508
|
+
cascadingDeleteCause,
|
|
509
|
+
}
|
|
495
510
|
)
|
|
496
511
|
);
|
|
497
512
|
|
|
@@ -519,7 +534,6 @@ export class DeleteMutator<
|
|
|
519
534
|
constructor(
|
|
520
535
|
viewerContext: TViewerContext,
|
|
521
536
|
queryContext: EntityQueryContext,
|
|
522
|
-
privacyPolicyEvaluationContext: EntityPrivacyPolicyEvaluationContext,
|
|
523
537
|
entityConfiguration: EntityConfiguration<TFields>,
|
|
524
538
|
entityClass: IEntityClass<
|
|
525
539
|
TFields,
|
|
@@ -559,7 +573,6 @@ export class DeleteMutator<
|
|
|
559
573
|
super(
|
|
560
574
|
viewerContext,
|
|
561
575
|
queryContext,
|
|
562
|
-
privacyPolicyEvaluationContext,
|
|
563
576
|
entityConfiguration,
|
|
564
577
|
entityClass,
|
|
565
578
|
privacyPolicy,
|
|
@@ -772,19 +785,34 @@ export class DeleteMutator<
|
|
|
772
785
|
}
|
|
773
786
|
|
|
774
787
|
switch (association.edgeDeletionBehavior) {
|
|
775
|
-
case
|
|
776
|
-
|
|
788
|
+
case EntityEdgeDeletionBehavior.CASCADE_DELETE_INVALIDATE_CACHE_ONLY: {
|
|
789
|
+
await Promise.all(
|
|
790
|
+
inboundReferenceEntities.map((inboundReferenceEntity) =>
|
|
791
|
+
enforceAsyncResult(
|
|
792
|
+
mutatorFactory
|
|
793
|
+
.forDelete(inboundReferenceEntity, queryContext)
|
|
794
|
+
.deleteInTransactionAsync(
|
|
795
|
+
processedEntityIdentifiers,
|
|
796
|
+
/* skipDatabaseDeletion */ true, // deletion is handled by DB
|
|
797
|
+
newCascadingDeleteCause
|
|
798
|
+
)
|
|
799
|
+
)
|
|
800
|
+
)
|
|
801
|
+
);
|
|
802
|
+
break;
|
|
803
|
+
}
|
|
804
|
+
case EntityEdgeDeletionBehavior.SET_NULL_INVALIDATE_CACHE_ONLY: {
|
|
777
805
|
await Promise.all(
|
|
778
806
|
inboundReferenceEntities.map((inboundReferenceEntity) =>
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
807
|
+
enforceAsyncResult(
|
|
808
|
+
mutatorFactory
|
|
809
|
+
.forUpdate(inboundReferenceEntity, queryContext)
|
|
810
|
+
.setField(fieldName, null)
|
|
811
|
+
['updateInTransactionAsync'](
|
|
812
|
+
/* skipDatabaseUpdate */ true,
|
|
813
|
+
newCascadingDeleteCause
|
|
814
|
+
)
|
|
815
|
+
)
|
|
788
816
|
)
|
|
789
817
|
);
|
|
790
818
|
break;
|
|
@@ -792,12 +820,15 @@ export class DeleteMutator<
|
|
|
792
820
|
case EntityEdgeDeletionBehavior.SET_NULL: {
|
|
793
821
|
await Promise.all(
|
|
794
822
|
inboundReferenceEntities.map((inboundReferenceEntity) =>
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
823
|
+
enforceAsyncResult(
|
|
824
|
+
mutatorFactory
|
|
825
|
+
.forUpdate(inboundReferenceEntity, queryContext)
|
|
826
|
+
.setField(fieldName, null)
|
|
827
|
+
['updateInTransactionAsync'](
|
|
828
|
+
/* skipDatabaseUpdate */ false,
|
|
829
|
+
newCascadingDeleteCause
|
|
830
|
+
)
|
|
831
|
+
)
|
|
801
832
|
)
|
|
802
833
|
);
|
|
803
834
|
break;
|
|
@@ -805,15 +836,15 @@ export class DeleteMutator<
|
|
|
805
836
|
case EntityEdgeDeletionBehavior.CASCADE_DELETE: {
|
|
806
837
|
await Promise.all(
|
|
807
838
|
inboundReferenceEntities.map((inboundReferenceEntity) =>
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
839
|
+
enforceAsyncResult(
|
|
840
|
+
mutatorFactory
|
|
841
|
+
.forDelete(inboundReferenceEntity, queryContext)
|
|
842
|
+
.deleteInTransactionAsync(
|
|
843
|
+
processedEntityIdentifiers,
|
|
844
|
+
/* skipDatabaseDeletion */ false,
|
|
845
|
+
newCascadingDeleteCause
|
|
846
|
+
)
|
|
847
|
+
)
|
|
817
848
|
)
|
|
818
849
|
);
|
|
819
850
|
}
|
|
@@ -5,7 +5,7 @@ import EntityLoaderFactory from './EntityLoaderFactory';
|
|
|
5
5
|
import EntityMutationTriggerConfiguration from './EntityMutationTriggerConfiguration';
|
|
6
6
|
import EntityMutationValidator from './EntityMutationValidator';
|
|
7
7
|
import { CreateMutator, UpdateMutator, DeleteMutator } from './EntityMutator';
|
|
8
|
-
import EntityPrivacyPolicy
|
|
8
|
+
import EntityPrivacyPolicy from './EntityPrivacyPolicy';
|
|
9
9
|
import { EntityQueryContext } from './EntityQueryContext';
|
|
10
10
|
import ViewerContext from './ViewerContext';
|
|
11
11
|
import IEntityMetricsAdapter from './metrics/IEntityMetricsAdapter';
|
|
@@ -72,13 +72,11 @@ export default class EntityMutatorFactory<
|
|
|
72
72
|
*/
|
|
73
73
|
forCreate(
|
|
74
74
|
viewerContext: TViewerContext,
|
|
75
|
-
queryContext: EntityQueryContext
|
|
76
|
-
privacyPolicyEvaluationContext: EntityPrivacyPolicyEvaluationContext
|
|
75
|
+
queryContext: EntityQueryContext
|
|
77
76
|
): CreateMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields> {
|
|
78
77
|
return new CreateMutator(
|
|
79
78
|
viewerContext,
|
|
80
79
|
queryContext,
|
|
81
|
-
privacyPolicyEvaluationContext,
|
|
82
80
|
this.entityConfiguration,
|
|
83
81
|
this.entityClass,
|
|
84
82
|
this.privacyPolicy,
|
|
@@ -98,13 +96,11 @@ export default class EntityMutatorFactory<
|
|
|
98
96
|
*/
|
|
99
97
|
forUpdate(
|
|
100
98
|
existingEntity: TEntity,
|
|
101
|
-
queryContext: EntityQueryContext
|
|
102
|
-
privacyPolicyEvaluationContext: EntityPrivacyPolicyEvaluationContext
|
|
99
|
+
queryContext: EntityQueryContext
|
|
103
100
|
): UpdateMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields> {
|
|
104
101
|
return new UpdateMutator(
|
|
105
102
|
existingEntity.getViewerContext(),
|
|
106
103
|
queryContext,
|
|
107
|
-
privacyPolicyEvaluationContext,
|
|
108
104
|
this.entityConfiguration,
|
|
109
105
|
this.entityClass,
|
|
110
106
|
this.privacyPolicy,
|
|
@@ -124,13 +120,11 @@ export default class EntityMutatorFactory<
|
|
|
124
120
|
*/
|
|
125
121
|
forDelete(
|
|
126
122
|
existingEntity: TEntity,
|
|
127
|
-
queryContext: EntityQueryContext
|
|
128
|
-
privacyPolicyEvaluationContext: EntityPrivacyPolicyEvaluationContext
|
|
123
|
+
queryContext: EntityQueryContext
|
|
129
124
|
): DeleteMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields> {
|
|
130
125
|
return new DeleteMutator(
|
|
131
126
|
existingEntity.getViewerContext(),
|
|
132
127
|
queryContext,
|
|
133
|
-
privacyPolicyEvaluationContext,
|
|
134
128
|
this.entityConfiguration,
|
|
135
129
|
this.entityClass,
|
|
136
130
|
this.privacyPolicy,
|