@expo/entity 0.25.3 → 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.
Files changed (105) hide show
  1. package/build/Entity.js +4 -4
  2. package/build/Entity.js.map +1 -1
  3. package/build/EntityFieldDefinition.d.ts +16 -8
  4. package/build/EntityFieldDefinition.js +12 -5
  5. package/build/EntityFieldDefinition.js.map +1 -1
  6. package/build/EntityLoader.js +2 -2
  7. package/build/EntityLoader.js.map +1 -1
  8. package/build/EntityMutationInfo.d.ts +2 -0
  9. package/build/EntityMutator.d.ts +6 -8
  10. package/build/EntityMutator.js +58 -46
  11. package/build/EntityMutator.js.map +1 -1
  12. package/build/EntityMutatorFactory.d.ts +4 -4
  13. package/build/EntityMutatorFactory.js +6 -6
  14. package/build/EntityMutatorFactory.js.map +1 -1
  15. package/build/EntityPrivacyPolicy.d.ts +13 -0
  16. package/build/EntityPrivacyPolicy.js +13 -0
  17. package/build/EntityPrivacyPolicy.js.map +1 -1
  18. package/build/EntityQueryContext.d.ts +11 -0
  19. package/build/EntityQueryContext.js +11 -0
  20. package/build/EntityQueryContext.js.map +1 -1
  21. package/build/ViewerScopedEntityMutatorFactory.d.ts +4 -4
  22. package/build/ViewerScopedEntityMutatorFactory.js +6 -6
  23. package/build/ViewerScopedEntityMutatorFactory.js.map +1 -1
  24. package/build/__tests__/ComposedCacheAdapter-test.js +1 -1
  25. package/build/__tests__/ComposedCacheAdapter-test.js.map +1 -1
  26. package/build/__tests__/EntityCommonUseCases-test.js +5 -1
  27. package/build/__tests__/EntityCommonUseCases-test.js.map +1 -1
  28. package/build/__tests__/EntityCompanion-test.js +5 -1
  29. package/build/__tests__/EntityCompanion-test.js.map +1 -1
  30. package/build/__tests__/EntityCompanionProvider-test.js +5 -1
  31. package/build/__tests__/EntityCompanionProvider-test.js.map +1 -1
  32. package/build/__tests__/EntityEdges-test.js +199 -33
  33. package/build/__tests__/EntityEdges-test.js.map +1 -1
  34. package/build/__tests__/EntityLoader-test.js +5 -1
  35. package/build/__tests__/EntityLoader-test.js.map +1 -1
  36. package/build/__tests__/EntityMutator-test.js +38 -53
  37. package/build/__tests__/EntityMutator-test.js.map +1 -1
  38. package/build/__tests__/EntityPrivacyPolicy-test.js +5 -1
  39. package/build/__tests__/EntityPrivacyPolicy-test.js.map +1 -1
  40. package/build/__tests__/EntitySelfReferentialEdges-test.js +2 -2
  41. package/build/__tests__/EntitySelfReferentialEdges-test.js.map +1 -1
  42. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js +5 -1
  43. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js.map +1 -1
  44. package/build/__tests__/ViewerScopedEntityMutatorFactory-test.js +2 -3
  45. package/build/__tests__/ViewerScopedEntityMutatorFactory-test.js.map +1 -1
  46. package/build/errors/EntityCacheAdapterError.js +5 -1
  47. package/build/errors/EntityCacheAdapterError.js.map +1 -1
  48. package/build/errors/EntityDatabaseAdapterError.js +5 -1
  49. package/build/errors/EntityDatabaseAdapterError.js.map +1 -1
  50. package/build/errors/EntityInvalidFieldValueError.js +6 -2
  51. package/build/errors/EntityInvalidFieldValueError.js.map +1 -1
  52. package/build/errors/EntityNotAuthorizedError.js +5 -1
  53. package/build/errors/EntityNotAuthorizedError.js.map +1 -1
  54. package/build/errors/EntityNotFoundError.js +6 -2
  55. package/build/errors/EntityNotFoundError.js.map +1 -1
  56. package/build/index.js +5 -1
  57. package/build/index.js.map +1 -1
  58. package/build/internal/EntityDataManager.js +7 -4
  59. package/build/internal/EntityDataManager.js.map +1 -1
  60. package/build/internal/EntityFieldTransformationUtils.js +1 -1
  61. package/build/internal/EntityFieldTransformationUtils.js.map +1 -1
  62. package/build/internal/ReadThroughEntityCache.js +1 -1
  63. package/build/internal/ReadThroughEntityCache.js.map +1 -1
  64. package/build/internal/__tests__/EntityDataManager-test.js +12 -7
  65. package/build/internal/__tests__/EntityDataManager-test.js.map +1 -1
  66. package/build/internal/__tests__/ReadThroughEntityCache-test.js +5 -1
  67. package/build/internal/__tests__/ReadThroughEntityCache-test.js.map +1 -1
  68. package/build/metrics/IEntityMetricsAdapter.d.ts +62 -17
  69. package/build/metrics/IEntityMetricsAdapter.js +17 -1
  70. package/build/metrics/IEntityMetricsAdapter.js.map +1 -1
  71. package/build/metrics/NoOpEntityMetricsAdapter.d.ts +1 -3
  72. package/build/metrics/NoOpEntityMetricsAdapter.js +1 -3
  73. package/build/metrics/NoOpEntityMetricsAdapter.js.map +1 -1
  74. package/build/rules/AlwaysAllowPrivacyPolicyRule.js +5 -1
  75. package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -1
  76. package/build/rules/AlwaysDenyPrivacyPolicyRule.js +5 -1
  77. package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -1
  78. package/build/rules/AlwaysSkipPrivacyPolicyRule.js +5 -1
  79. package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -1
  80. package/build/utils/testing/StubDatabaseAdapter.js +6 -2
  81. package/build/utils/testing/StubDatabaseAdapter.js.map +1 -1
  82. package/package.json +1 -1
  83. package/src/Entity.ts +4 -4
  84. package/src/EntityFieldDefinition.ts +15 -6
  85. package/src/EntityLoader.ts +4 -2
  86. package/src/EntityMutationInfo.ts +2 -0
  87. package/src/EntityMutator.ts +98 -67
  88. package/src/EntityMutatorFactory.ts +4 -10
  89. package/src/EntityPrivacyPolicy.ts +15 -0
  90. package/src/EntityQueryContext.ts +11 -0
  91. package/src/ViewerScopedEntityMutatorFactory.ts +7 -22
  92. package/src/__tests__/ComposedCacheAdapter-test.ts +1 -1
  93. package/src/__tests__/EntityEdges-test.ts +287 -32
  94. package/src/__tests__/EntityMutator-test.ts +33 -54
  95. package/src/__tests__/EntitySelfReferentialEdges-test.ts +2 -2
  96. package/src/__tests__/ViewerScopedEntityMutatorFactory-test.ts +2 -6
  97. package/src/errors/EntityInvalidFieldValueError.ts +1 -1
  98. package/src/errors/EntityNotFoundError.ts +1 -1
  99. package/src/internal/EntityDataManager.ts +13 -5
  100. package/src/internal/EntityFieldTransformationUtils.ts +1 -1
  101. package/src/internal/ReadThroughEntityCache.ts +3 -1
  102. package/src/internal/__tests__/EntityDataManager-test.ts +11 -8
  103. package/src/metrics/IEntityMetricsAdapter.ts +72 -19
  104. package/src/metrics/NoOpEntityMetricsAdapter.ts +1 -5
  105. 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
- incrementDataManagerDataloaderLoadCount(_incrementLoadCountEvent) { }
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,uCAAuC,CACrC,wBAAiD,IAC1C,CAAC;IACV,kCAAkC,CAAC,wBAAiD,IAAS,CAAC;IAC9F,qCAAqC,CAAC,wBAAiD,IAAS,CAAC;CAClG;AATD,2CASC"}
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.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
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":";;;;;;;;;;;;;;;;;;;;;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
+ {"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.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
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":";;;;;;;;;;;;;;;;;;;;;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
+ {"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.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
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":";;;;;;;;;;;;;;;;;;;;;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
+ {"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.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
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":"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"}
1
+ {"version":3,"file":"StubDatabaseAdapter.js","sourceRoot":"","sources":["../../../src/utils/testing/StubDatabaseAdapter.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@expo/entity",
3
- "version": "0.25.3",
3
+ "version": "0.26.0",
4
4
  "description": "A privacy-first data model",
5
5
  "files": [
6
6
  "build",
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, { cascadingDeleteCause: null });
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, { cascadingDeleteCause: null });
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, { cascadingDeleteCause: null })
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, { cascadingDeleteCause: null })
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
- * Default. Invalidate the cache for all entities that reference the entity
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 or set nulls and the entity framework just needs to
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
- CASCADE_DELETE_INVALIDATE_CACHE,
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 supports both database foreign key constraints
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.CASACDE_DELETE_INVALIDATE_CACHE} are recommended.
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?: EntityEdgeDeletionBehavior;
95
+ edgeDeletionBehavior: EntityEdgeDeletionBehavior;
87
96
  }
88
97
 
89
98
  /**
@@ -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 ${uniqueFieldName}=${fieldValue}`
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;
@@ -18,7 +18,7 @@ import EntityMutationTriggerConfiguration, {
18
18
  EntityNonTransactionalMutationTrigger,
19
19
  } from './EntityMutationTriggerConfiguration';
20
20
  import EntityMutationValidator from './EntityMutationValidator';
21
- import EntityPrivacyPolicy, { EntityPrivacyPolicyEvaluationContext } from './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 and caches the new entity if not in a transactional query context.
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
- this.privacyPolicyEvaluationContext,
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
- this.viewerContext,
256
- queryContext,
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 and caches the updated entity if not in a
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(): Promise<Result<TEntity>> {
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
- this.privacyPolicyEvaluationContext,
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
- const updateResult = await this.databaseAdapter.updateAsync(
449
- queryContext,
450
- this.entityConfiguration.idField,
451
- entityAboutToBeUpdated.getID(),
452
- this.updatedFields
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
- this.viewerContext,
457
- queryContext,
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
- const unauthorizedEntityAfterUpdate = new this.entityClass(this.viewerContext, updateResult);
472
- const updatedEntity = await entityLoader
473
- .enforcing()
474
- .loadByIDAsync(unauthorizedEntityAfterUpdate.getID());
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
- { type: EntityMutationType.UPDATE, previousValue: this.originalEntity }
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 undefined:
776
- case EntityEdgeDeletionBehavior.CASCADE_DELETE_INVALIDATE_CACHE: {
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
- mutatorFactory
780
- .forDelete(inboundReferenceEntity, queryContext, {
781
- cascadingDeleteCause: newCascadingDeleteCause,
782
- })
783
- .deleteInTransactionAsync(
784
- processedEntityIdentifiers,
785
- /* skipDatabaseDeletion */ true, // deletion is handled by DB
786
- newCascadingDeleteCause
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
- mutatorFactory
796
- .forUpdate(inboundReferenceEntity, queryContext, {
797
- cascadingDeleteCause: newCascadingDeleteCause,
798
- })
799
- .setField(fieldName, null)
800
- .enforceUpdateAsync()
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
- mutatorFactory
809
- .forDelete(inboundReferenceEntity, queryContext, {
810
- cascadingDeleteCause: newCascadingDeleteCause,
811
- })
812
- .deleteInTransactionAsync(
813
- processedEntityIdentifiers,
814
- /* skipDatabaseDeletion */ false,
815
- newCascadingDeleteCause
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, { EntityPrivacyPolicyEvaluationContext } from './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,