@expo/entity 0.46.0 → 0.48.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 (215) hide show
  1. package/build/src/AuthorizationResultBasedEntityMutator.d.ts +5 -3
  2. package/build/src/AuthorizationResultBasedEntityMutator.js +75 -37
  3. package/build/src/AuthorizationResultBasedEntityMutator.js.map +1 -1
  4. package/build/src/EntityDeleter.js +1 -1
  5. package/build/src/EntityDeleter.js.map +1 -1
  6. package/build/src/EntityFields.d.ts +7 -0
  7. package/build/src/EntityFields.js +11 -1
  8. package/build/src/EntityFields.js.map +1 -1
  9. package/build/src/EntityMutatorFactory.d.ts +3 -2
  10. package/build/src/EntityMutatorFactory.js +4 -4
  11. package/build/src/EntityMutatorFactory.js.map +1 -1
  12. package/build/src/EntityUpdater.js +1 -1
  13. package/build/src/EntityUpdater.js.map +1 -1
  14. package/build/src/ViewerScopedEntityMutatorFactory.d.ts +3 -2
  15. package/build/src/ViewerScopedEntityMutatorFactory.js +4 -4
  16. package/build/src/ViewerScopedEntityMutatorFactory.js.map +1 -1
  17. package/package.json +5 -2
  18. package/src/AuthorizationResultBasedEntityMutator.ts +63 -49
  19. package/src/EntityDeleter.ts +1 -1
  20. package/src/EntityFields.ts +13 -0
  21. package/src/EntityMutatorFactory.ts +5 -0
  22. package/src/EntityUpdater.ts +1 -1
  23. package/src/ViewerScopedEntityMutatorFactory.ts +5 -2
  24. package/src/__tests__/EntityFields-test.ts +7 -0
  25. package/src/__tests__/EntityMutator-test.ts +217 -16
  26. package/build/src/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.d.ts +0 -1
  27. package/build/src/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js +0 -240
  28. package/build/src/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js.map +0 -1
  29. package/build/src/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.d.ts +0 -26
  30. package/build/src/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js +0 -109
  31. package/build/src/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js.map +0 -1
  32. package/build/src/__tests__/AuthorizationResultBasedEntityLoader-test.d.ts +0 -1
  33. package/build/src/__tests__/AuthorizationResultBasedEntityLoader-test.js +0 -590
  34. package/build/src/__tests__/AuthorizationResultBasedEntityLoader-test.js.map +0 -1
  35. package/build/src/__tests__/ComposedCacheAdapter-test.d.ts +0 -1
  36. package/build/src/__tests__/ComposedCacheAdapter-test.js +0 -259
  37. package/build/src/__tests__/ComposedCacheAdapter-test.js.map +0 -1
  38. package/build/src/__tests__/ComposedSecondaryEntityCache-test.d.ts +0 -1
  39. package/build/src/__tests__/ComposedSecondaryEntityCache-test.js +0 -67
  40. package/build/src/__tests__/ComposedSecondaryEntityCache-test.js.map +0 -1
  41. package/build/src/__tests__/EnforcingEntityAssociationLoader-test.d.ts +0 -1
  42. package/build/src/__tests__/EnforcingEntityAssociationLoader-test.js +0 -113
  43. package/build/src/__tests__/EnforcingEntityAssociationLoader-test.js.map +0 -1
  44. package/build/src/__tests__/EnforcingEntityLoader-test.d.ts +0 -1
  45. package/build/src/__tests__/EnforcingEntityLoader-test.js +0 -316
  46. package/build/src/__tests__/EnforcingEntityLoader-test.js.map +0 -1
  47. package/build/src/__tests__/Entity-test.d.ts +0 -1
  48. package/build/src/__tests__/Entity-test.js +0 -92
  49. package/build/src/__tests__/Entity-test.js.map +0 -1
  50. package/build/src/__tests__/EntityAssociationLoader-test.d.ts +0 -1
  51. package/build/src/__tests__/EntityAssociationLoader-test.js +0 -28
  52. package/build/src/__tests__/EntityAssociationLoader-test.js.map +0 -1
  53. package/build/src/__tests__/EntityCommonUseCases-test.d.ts +0 -1
  54. package/build/src/__tests__/EntityCommonUseCases-test.js +0 -111
  55. package/build/src/__tests__/EntityCommonUseCases-test.js.map +0 -1
  56. package/build/src/__tests__/EntityCompanion-test.d.ts +0 -1
  57. package/build/src/__tests__/EntityCompanion-test.js +0 -42
  58. package/build/src/__tests__/EntityCompanion-test.js.map +0 -1
  59. package/build/src/__tests__/EntityCompanionProvider-test.d.ts +0 -1
  60. package/build/src/__tests__/EntityCompanionProvider-test.js +0 -53
  61. package/build/src/__tests__/EntityCompanionProvider-test.js.map +0 -1
  62. package/build/src/__tests__/EntityConfiguration-test.d.ts +0 -1
  63. package/build/src/__tests__/EntityConfiguration-test.js +0 -164
  64. package/build/src/__tests__/EntityConfiguration-test.js.map +0 -1
  65. package/build/src/__tests__/EntityDatabaseAdapter-test.d.ts +0 -1
  66. package/build/src/__tests__/EntityDatabaseAdapter-test.js +0 -189
  67. package/build/src/__tests__/EntityDatabaseAdapter-test.js.map +0 -1
  68. package/build/src/__tests__/EntityEdges-test.d.ts +0 -1
  69. package/build/src/__tests__/EntityEdges-test.js +0 -680
  70. package/build/src/__tests__/EntityEdges-test.js.map +0 -1
  71. package/build/src/__tests__/EntityFields-test.d.ts +0 -1
  72. package/build/src/__tests__/EntityFields-test.js +0 -61
  73. package/build/src/__tests__/EntityFields-test.js.map +0 -1
  74. package/build/src/__tests__/EntityLoader-test.d.ts +0 -1
  75. package/build/src/__tests__/EntityLoader-test.js +0 -34
  76. package/build/src/__tests__/EntityLoader-test.js.map +0 -1
  77. package/build/src/__tests__/EntityMutator-MutationCacheConsistency-test.d.ts +0 -1
  78. package/build/src/__tests__/EntityMutator-MutationCacheConsistency-test.js +0 -71
  79. package/build/src/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +0 -1
  80. package/build/src/__tests__/EntityMutator-SingleCompositeFieldCacheConsistency-test.d.ts +0 -1
  81. package/build/src/__tests__/EntityMutator-SingleCompositeFieldCacheConsistency-test.js +0 -54
  82. package/build/src/__tests__/EntityMutator-SingleCompositeFieldCacheConsistency-test.js.map +0 -1
  83. package/build/src/__tests__/EntityMutator-test.d.ts +0 -1
  84. package/build/src/__tests__/EntityMutator-test.js +0 -721
  85. package/build/src/__tests__/EntityMutator-test.js.map +0 -1
  86. package/build/src/__tests__/EntityPrivacyPolicy-test.d.ts +0 -1
  87. package/build/src/__tests__/EntityPrivacyPolicy-test.js +0 -429
  88. package/build/src/__tests__/EntityPrivacyPolicy-test.js.map +0 -1
  89. package/build/src/__tests__/EntityQueryContext-test.d.ts +0 -1
  90. package/build/src/__tests__/EntityQueryContext-test.js +0 -181
  91. package/build/src/__tests__/EntityQueryContext-test.js.map +0 -1
  92. package/build/src/__tests__/EntitySecondaryCacheLoader-test.d.ts +0 -1
  93. package/build/src/__tests__/EntitySecondaryCacheLoader-test.js +0 -58
  94. package/build/src/__tests__/EntitySecondaryCacheLoader-test.js.map +0 -1
  95. package/build/src/__tests__/EntitySelfReferentialEdges-test.d.ts +0 -1
  96. package/build/src/__tests__/EntitySelfReferentialEdges-test.js +0 -196
  97. package/build/src/__tests__/EntitySelfReferentialEdges-test.js.map +0 -1
  98. package/build/src/__tests__/GenericEntityCacheAdapter-test.d.ts +0 -1
  99. package/build/src/__tests__/GenericEntityCacheAdapter-test.js +0 -95
  100. package/build/src/__tests__/GenericEntityCacheAdapter-test.js.map +0 -1
  101. package/build/src/__tests__/ReadonlyEntity-test.d.ts +0 -1
  102. package/build/src/__tests__/ReadonlyEntity-test.js +0 -209
  103. package/build/src/__tests__/ReadonlyEntity-test.js.map +0 -1
  104. package/build/src/__tests__/ViewerContext-test.d.ts +0 -1
  105. package/build/src/__tests__/ViewerContext-test.js +0 -28
  106. package/build/src/__tests__/ViewerContext-test.js.map +0 -1
  107. package/build/src/__tests__/ViewerScopedEntityCompanion-test.d.ts +0 -1
  108. package/build/src/__tests__/ViewerScopedEntityCompanion-test.js +0 -18
  109. package/build/src/__tests__/ViewerScopedEntityCompanion-test.js.map +0 -1
  110. package/build/src/__tests__/ViewerScopedEntityCompanionProvider-test.d.ts +0 -1
  111. package/build/src/__tests__/ViewerScopedEntityCompanionProvider-test.js +0 -18
  112. package/build/src/__tests__/ViewerScopedEntityCompanionProvider-test.js.map +0 -1
  113. package/build/src/__tests__/ViewerScopedEntityLoaderFactory-test.d.ts +0 -1
  114. package/build/src/__tests__/ViewerScopedEntityLoaderFactory-test.js +0 -21
  115. package/build/src/__tests__/ViewerScopedEntityLoaderFactory-test.js.map +0 -1
  116. package/build/src/__tests__/ViewerScopedEntityMutatorFactory-test.d.ts +0 -1
  117. package/build/src/__tests__/ViewerScopedEntityMutatorFactory-test.js +0 -20
  118. package/build/src/__tests__/ViewerScopedEntityMutatorFactory-test.js.map +0 -1
  119. package/build/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.d.ts +0 -1
  120. package/build/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +0 -121
  121. package/build/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +0 -1
  122. package/build/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.d.ts +0 -1
  123. package/build/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +0 -119
  124. package/build/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +0 -1
  125. package/build/src/__tests__/entityUtils-test.d.ts +0 -1
  126. package/build/src/__tests__/entityUtils-test.js +0 -88
  127. package/build/src/__tests__/entityUtils-test.js.map +0 -1
  128. package/build/src/errors/__tests__/EntityDatabaseAdapterError-test.d.ts +0 -1
  129. package/build/src/errors/__tests__/EntityDatabaseAdapterError-test.js +0 -21
  130. package/build/src/errors/__tests__/EntityDatabaseAdapterError-test.js.map +0 -1
  131. package/build/src/internal/__tests__/CompositeFieldHolder-test.d.ts +0 -1
  132. package/build/src/internal/__tests__/CompositeFieldHolder-test.js +0 -25
  133. package/build/src/internal/__tests__/CompositeFieldHolder-test.js.map +0 -1
  134. package/build/src/internal/__tests__/CompositeFieldValueMap-test.d.ts +0 -1
  135. package/build/src/internal/__tests__/CompositeFieldValueMap-test.js +0 -40
  136. package/build/src/internal/__tests__/CompositeFieldValueMap-test.js.map +0 -1
  137. package/build/src/internal/__tests__/EntityDataManager-test.d.ts +0 -1
  138. package/build/src/internal/__tests__/EntityDataManager-test.js +0 -666
  139. package/build/src/internal/__tests__/EntityDataManager-test.js.map +0 -1
  140. package/build/src/internal/__tests__/EntityFieldTransformationUtils-test.d.ts +0 -1
  141. package/build/src/internal/__tests__/EntityFieldTransformationUtils-test.js +0 -135
  142. package/build/src/internal/__tests__/EntityFieldTransformationUtils-test.js.map +0 -1
  143. package/build/src/internal/__tests__/ReadThroughEntityCache-test.d.ts +0 -1
  144. package/build/src/internal/__tests__/ReadThroughEntityCache-test.js +0 -217
  145. package/build/src/internal/__tests__/ReadThroughEntityCache-test.js.map +0 -1
  146. package/build/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.d.ts +0 -1
  147. package/build/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js +0 -18
  148. package/build/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js.map +0 -1
  149. package/build/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.d.ts +0 -1
  150. package/build/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js +0 -18
  151. package/build/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js.map +0 -1
  152. package/build/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.d.ts +0 -1
  153. package/build/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js +0 -18
  154. package/build/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js.map +0 -1
  155. package/build/src/utils/__testfixtures__/PrivacyPolicyRuleTestUtils.d.ts +0 -28
  156. package/build/src/utils/__testfixtures__/PrivacyPolicyRuleTestUtils.js +0 -53
  157. package/build/src/utils/__testfixtures__/PrivacyPolicyRuleTestUtils.js.map +0 -1
  158. package/build/src/utils/__testfixtures__/SimpleTestEntity.d.ts +0 -20
  159. package/build/src/utils/__testfixtures__/SimpleTestEntity.js +0 -46
  160. package/build/src/utils/__testfixtures__/SimpleTestEntity.js.map +0 -1
  161. package/build/src/utils/__testfixtures__/StubCacheAdapter.d.ts +0 -29
  162. package/build/src/utils/__testfixtures__/StubCacheAdapter.js +0 -103
  163. package/build/src/utils/__testfixtures__/StubCacheAdapter.js.map +0 -1
  164. package/build/src/utils/__testfixtures__/StubDatabaseAdapter.d.ts +0 -26
  165. package/build/src/utils/__testfixtures__/StubDatabaseAdapter.js +0 -173
  166. package/build/src/utils/__testfixtures__/StubDatabaseAdapter.js.map +0 -1
  167. package/build/src/utils/__testfixtures__/StubDatabaseAdapterProvider.d.ts +0 -7
  168. package/build/src/utils/__testfixtures__/StubDatabaseAdapterProvider.js +0 -12
  169. package/build/src/utils/__testfixtures__/StubDatabaseAdapterProvider.js.map +0 -1
  170. package/build/src/utils/__testfixtures__/StubQueryContextProvider.d.ts +0 -7
  171. package/build/src/utils/__testfixtures__/StubQueryContextProvider.js +0 -17
  172. package/build/src/utils/__testfixtures__/StubQueryContextProvider.js.map +0 -1
  173. package/build/src/utils/__testfixtures__/TSMockitoExtensions.d.ts +0 -9
  174. package/build/src/utils/__testfixtures__/TSMockitoExtensions.js +0 -65
  175. package/build/src/utils/__testfixtures__/TSMockitoExtensions.js.map +0 -1
  176. package/build/src/utils/__testfixtures__/TestEntity.d.ts +0 -30
  177. package/build/src/utils/__testfixtures__/TestEntity.js +0 -96
  178. package/build/src/utils/__testfixtures__/TestEntity.js.map +0 -1
  179. package/build/src/utils/__testfixtures__/TestEntity2.d.ts +0 -20
  180. package/build/src/utils/__testfixtures__/TestEntity2.js +0 -49
  181. package/build/src/utils/__testfixtures__/TestEntity2.js.map +0 -1
  182. package/build/src/utils/__testfixtures__/TestEntityWithMutationTriggers.d.ts +0 -36
  183. package/build/src/utils/__testfixtures__/TestEntityWithMutationTriggers.js +0 -80
  184. package/build/src/utils/__testfixtures__/TestEntityWithMutationTriggers.js.map +0 -1
  185. package/build/src/utils/__testfixtures__/TestViewerContext.d.ts +0 -3
  186. package/build/src/utils/__testfixtures__/TestViewerContext.js +0 -8
  187. package/build/src/utils/__testfixtures__/TestViewerContext.js.map +0 -1
  188. package/build/src/utils/__testfixtures__/createUnitTestEntityCompanionProvider.d.ts +0 -7
  189. package/build/src/utils/__testfixtures__/createUnitTestEntityCompanionProvider.js +0 -33
  190. package/build/src/utils/__testfixtures__/createUnitTestEntityCompanionProvider.js.map +0 -1
  191. package/build/src/utils/__testfixtures__/describeFieldTestCase.d.ts +0 -2
  192. package/build/src/utils/__testfixtures__/describeFieldTestCase.js +0 -19
  193. package/build/src/utils/__testfixtures__/describeFieldTestCase.js.map +0 -1
  194. package/build/src/utils/__tests__/EntityCreationUtils-test.d.ts +0 -1
  195. package/build/src/utils/__tests__/EntityCreationUtils-test.js +0 -144
  196. package/build/src/utils/__tests__/EntityCreationUtils-test.js.map +0 -1
  197. package/build/src/utils/__tests__/EntityPrivacyUtils-test.d.ts +0 -1
  198. package/build/src/utils/__tests__/EntityPrivacyUtils-test.js +0 -460
  199. package/build/src/utils/__tests__/EntityPrivacyUtils-test.js.map +0 -1
  200. package/build/src/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.d.ts +0 -1
  201. package/build/src/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js +0 -180
  202. package/build/src/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js.map +0 -1
  203. package/build/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.d.ts +0 -1
  204. package/build/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js +0 -27
  205. package/build/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js.map +0 -1
  206. package/build/src/utils/collections/__tests__/SerializableKeyMap-test.d.ts +0 -5
  207. package/build/src/utils/collections/__tests__/SerializableKeyMap-test.js +0 -99
  208. package/build/src/utils/collections/__tests__/SerializableKeyMap-test.js.map +0 -1
  209. package/build/src/utils/collections/__tests__/maps-test.d.ts +0 -1
  210. package/build/src/utils/collections/__tests__/maps-test.js +0 -121
  211. package/build/src/utils/collections/__tests__/maps-test.js.map +0 -1
  212. package/build/src/utils/collections/__tests__/sets-test.d.ts +0 -1
  213. package/build/src/utils/collections/__tests__/sets-test.js +0 -19
  214. package/build/src/utils/collections/__tests__/sets-test.js.map +0 -1
  215. package/build/tsconfig.tsbuildinfo +0 -1
@@ -1,680 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const globals_1 = require("@jest/globals");
7
- const invariant_1 = __importDefault(require("invariant"));
8
- const Entity_1 = require("../Entity");
9
- const EntityConfiguration_1 = require("../EntityConfiguration");
10
- const EntityFieldDefinition_1 = require("../EntityFieldDefinition");
11
- const EntityFields_1 = require("../EntityFields");
12
- const EntityMutationInfo_1 = require("../EntityMutationInfo");
13
- const EntityMutationTriggerConfiguration_1 = require("../EntityMutationTriggerConfiguration");
14
- const EntityPrivacyPolicy_1 = require("../EntityPrivacyPolicy");
15
- const ReadThroughEntityCache_1 = require("../internal/ReadThroughEntityCache");
16
- const SingleFieldHolder_1 = require("../internal/SingleFieldHolder");
17
- const PrivacyPolicyRule_1 = require("../rules/PrivacyPolicyRule");
18
- const TestViewerContext_1 = require("../utils/__testfixtures__/TestViewerContext");
19
- const createUnitTestEntityCompanionProvider_1 = require("../utils/__testfixtures__/createUnitTestEntityCompanionProvider");
20
- // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
21
- const makeEntityClasses = (edgeDeletionBehavior) => {
22
- const triggerExecutionCounts = {
23
- ParentEntityDeletion: 0,
24
- ChildEntityDeletion: 0,
25
- GrandChildEntityDeletion: 0,
26
- ParentEntityUpdate: 0,
27
- ChildEntityUpdate: 0,
28
- GrandChildEntityUpdate: 0,
29
- };
30
- const privacyPolicyEvaluationRecords = {
31
- shouldRecord: false,
32
- ParentEntity: {
33
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
34
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [],
35
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
36
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [],
37
- },
38
- ChildEntity: {
39
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
40
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [],
41
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
42
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [],
43
- },
44
- GrandChildEntity: {
45
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
46
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [],
47
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
48
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [],
49
- },
50
- };
51
- class AlwaysAllowPrivacyPolicyRuleThatRecords extends PrivacyPolicyRule_1.PrivacyPolicyRule {
52
- action;
53
- constructor(action) {
54
- super();
55
- this.action = action;
56
- }
57
- async evaluateAsync(_viewerContext, _queryContext, evaluationContext, entity) {
58
- if (privacyPolicyEvaluationRecords.shouldRecord) {
59
- privacyPolicyEvaluationRecords[entity.constructor.name][this.action].push(evaluationContext);
60
- }
61
- return PrivacyPolicyRule_1.RuleEvaluationResult.ALLOW;
62
- }
63
- }
64
- class TestEntityPrivacyPolicy extends EntityPrivacyPolicy_1.EntityPrivacyPolicy {
65
- readRules = [
66
- new AlwaysAllowPrivacyPolicyRuleThatRecords(EntityPrivacyPolicy_1.EntityAuthorizationAction.READ),
67
- ];
68
- createRules = [
69
- new AlwaysAllowPrivacyPolicyRuleThatRecords(EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE),
70
- ];
71
- updateRules = [
72
- new AlwaysAllowPrivacyPolicyRuleThatRecords(EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE),
73
- ];
74
- deleteRules = [
75
- new AlwaysAllowPrivacyPolicyRuleThatRecords(EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE),
76
- ];
77
- }
78
- class ParentCheckInfoDeletionTrigger extends EntityMutationTriggerConfiguration_1.EntityMutationTrigger {
79
- async executeAsync(_viewerContext, _queryContext, _entity, mutationInfo) {
80
- (0, invariant_1.default)(mutationInfo.type === EntityMutationInfo_1.EntityMutationType.DELETE, 'invalid EntityMutationType');
81
- if (mutationInfo.cascadingDeleteCause !== null) {
82
- throw new Error('Parent entity should not have casade delete cause');
83
- }
84
- triggerExecutionCounts.ParentEntityDeletion++;
85
- }
86
- }
87
- class ParentCheckInfoUpdateTrigger extends EntityMutationTriggerConfiguration_1.EntityMutationTrigger {
88
- async executeAsync(_viewerContext, _queryContext, _entity, mutationInfo) {
89
- (0, invariant_1.default)(mutationInfo.type === EntityMutationInfo_1.EntityMutationType.UPDATE, 'invalid EntityMutationType');
90
- if (mutationInfo.cascadingDeleteCause !== null) {
91
- throw new Error('Parent entity should not have casade delete cause');
92
- }
93
- triggerExecutionCounts.ParentEntityUpdate++;
94
- }
95
- }
96
- class ChildCheckInfoDeletionTrigger extends EntityMutationTriggerConfiguration_1.EntityMutationTrigger {
97
- async executeAsync(_viewerContext, _queryContext, _entity, mutationInfo) {
98
- (0, invariant_1.default)(mutationInfo.type === EntityMutationInfo_1.EntityMutationType.DELETE, 'invalid EntityMutationType');
99
- if (mutationInfo.cascadingDeleteCause === null) {
100
- throw new Error('Child entity should have casade delete cause');
101
- }
102
- const cascadingDeleteCauseEntity = mutationInfo.cascadingDeleteCause.entity;
103
- if (!(cascadingDeleteCauseEntity instanceof ParentEntity)) {
104
- throw new Error('Child entity should have casade delete cause entity of type ParentEntity');
105
- }
106
- const secondLevelCascadingDeleteCause = mutationInfo.cascadingDeleteCause.cascadingDeleteCause;
107
- if (secondLevelCascadingDeleteCause) {
108
- throw new Error('Child entity should not have two-level casade delete cause');
109
- }
110
- triggerExecutionCounts.ChildEntityDeletion++;
111
- }
112
- }
113
- class ChildCheckInfoUpdateTrigger extends EntityMutationTriggerConfiguration_1.EntityMutationTrigger {
114
- async executeAsync(_viewerContext, _queryContext, _entity, mutationInfo) {
115
- (0, invariant_1.default)(mutationInfo.type === EntityMutationInfo_1.EntityMutationType.UPDATE, 'invalid EntityMutationType');
116
- if (mutationInfo.cascadingDeleteCause === null) {
117
- throw new Error('Child entity should have casade delete cause');
118
- }
119
- const cascadingDeleteCauseEntity = mutationInfo.cascadingDeleteCause.entity;
120
- if (!(cascadingDeleteCauseEntity instanceof ParentEntity)) {
121
- throw new Error('Child entity should have casade delete cause entity of type ParentEntity');
122
- }
123
- const secondLevelCascadingDeleteCause = mutationInfo.cascadingDeleteCause.cascadingDeleteCause;
124
- if (secondLevelCascadingDeleteCause) {
125
- throw new Error('Child entity should not have two-level casade delete cause');
126
- }
127
- triggerExecutionCounts.ChildEntityUpdate++;
128
- }
129
- }
130
- class GrandChildCheckInfoDeletionTrigger extends EntityMutationTriggerConfiguration_1.EntityMutationTrigger {
131
- async executeAsync(_viewerContext, _queryContext, _entity, mutationInfo) {
132
- (0, invariant_1.default)(mutationInfo.type === EntityMutationInfo_1.EntityMutationType.DELETE, 'invalid EntityMutationType');
133
- if (mutationInfo.cascadingDeleteCause === null) {
134
- throw new Error('GrandChild entity should have cascade delete cause');
135
- }
136
- const cascadingDeleteCauseEntity = mutationInfo.cascadingDeleteCause.entity;
137
- if (!(cascadingDeleteCauseEntity instanceof ChildEntity)) {
138
- throw new Error('GrandChild entity should have cascade delete cause entity of type ChildEntity');
139
- }
140
- const secondLevelCascadingDeleteCause = mutationInfo.cascadingDeleteCause.cascadingDeleteCause;
141
- if (!secondLevelCascadingDeleteCause) {
142
- throw new Error('GrandChild entity should have two-level casade delete cause');
143
- }
144
- const secondLevelCascadingDeleteCauseEntity = secondLevelCascadingDeleteCause.entity;
145
- if (!(secondLevelCascadingDeleteCauseEntity instanceof ParentEntity)) {
146
- throw new Error('GrandChild entity should have second level casade delete cause entity of type ParentEntity');
147
- }
148
- const thirdLevelCascadingDeleteCause = secondLevelCascadingDeleteCause.cascadingDeleteCause;
149
- if (thirdLevelCascadingDeleteCause) {
150
- throw new Error('GrandChild entity should not have three-level casade delete cause');
151
- }
152
- triggerExecutionCounts.GrandChildEntityDeletion++;
153
- }
154
- }
155
- class GrandChildCheckInfoUpdateTrigger extends EntityMutationTriggerConfiguration_1.EntityMutationTrigger {
156
- async executeAsync(_viewerContext, _queryContext, _entity, mutationInfo) {
157
- (0, invariant_1.default)(mutationInfo.type === EntityMutationInfo_1.EntityMutationType.UPDATE, 'invalid EntityMutationType');
158
- if (mutationInfo.cascadingDeleteCause === null) {
159
- throw new Error('GrandChild entity should have cascade delete cause');
160
- }
161
- const cascadingDeleteCauseEntity = mutationInfo.cascadingDeleteCause.entity;
162
- if (!(cascadingDeleteCauseEntity instanceof ChildEntity)) {
163
- throw new Error('GrandChild entity should have cascade delete cause entity of type ChildEntity');
164
- }
165
- const secondLevelCascadingDeleteCause = mutationInfo.cascadingDeleteCause.cascadingDeleteCause;
166
- if (!secondLevelCascadingDeleteCause) {
167
- throw new Error('GrandChild entity should have two-level casade delete cause');
168
- }
169
- const secondLevelCascadingDeleteCauseEntity = secondLevelCascadingDeleteCause.entity;
170
- if (!(secondLevelCascadingDeleteCauseEntity instanceof ParentEntity)) {
171
- throw new Error('GrandChild entity should have second level casade delete cause entity of type ParentEntity');
172
- }
173
- const thirdLevelCascadingDeleteCause = secondLevelCascadingDeleteCause.cascadingDeleteCause;
174
- if (thirdLevelCascadingDeleteCause) {
175
- throw new Error('GrandChild entity should not have three-level casade delete cause');
176
- }
177
- triggerExecutionCounts.GrandChildEntityUpdate++;
178
- }
179
- }
180
- class OtherEntity extends Entity_1.Entity {
181
- static defineCompanionDefinition() {
182
- return {
183
- entityClass: ParentEntity,
184
- entityConfiguration: otherEntityConfiguration,
185
- privacyPolicyClass: TestEntityPrivacyPolicy,
186
- };
187
- }
188
- }
189
- class ParentEntity extends Entity_1.Entity {
190
- static defineCompanionDefinition() {
191
- return {
192
- entityClass: ParentEntity,
193
- entityConfiguration: parentEntityConfiguration,
194
- privacyPolicyClass: TestEntityPrivacyPolicy,
195
- mutationTriggers: {
196
- beforeDelete: [new ParentCheckInfoDeletionTrigger()],
197
- afterDelete: [new ParentCheckInfoDeletionTrigger()],
198
- beforeUpdate: [new ParentCheckInfoUpdateTrigger()],
199
- afterUpdate: [new ParentCheckInfoUpdateTrigger()],
200
- },
201
- };
202
- }
203
- }
204
- class ChildEntity extends Entity_1.Entity {
205
- static defineCompanionDefinition() {
206
- return {
207
- entityClass: ChildEntity,
208
- entityConfiguration: childEntityConfiguration,
209
- privacyPolicyClass: TestEntityPrivacyPolicy,
210
- mutationTriggers: {
211
- beforeDelete: [new ChildCheckInfoDeletionTrigger()],
212
- afterDelete: [new ChildCheckInfoDeletionTrigger()],
213
- beforeUpdate: [new ChildCheckInfoUpdateTrigger()],
214
- afterUpdate: [new ChildCheckInfoUpdateTrigger()],
215
- },
216
- };
217
- }
218
- }
219
- class GrandChildEntity extends Entity_1.Entity {
220
- static defineCompanionDefinition() {
221
- return {
222
- entityClass: GrandChildEntity,
223
- entityConfiguration: grandChildEntityConfiguration,
224
- privacyPolicyClass: TestEntityPrivacyPolicy,
225
- mutationTriggers: {
226
- beforeDelete: [new GrandChildCheckInfoDeletionTrigger()],
227
- afterDelete: [new GrandChildCheckInfoDeletionTrigger()],
228
- beforeUpdate: [new GrandChildCheckInfoUpdateTrigger()],
229
- afterUpdate: [new GrandChildCheckInfoUpdateTrigger()],
230
- },
231
- };
232
- }
233
- }
234
- const otherEntityConfiguration = new EntityConfiguration_1.EntityConfiguration({
235
- idField: 'id',
236
- tableName: 'others',
237
- schema: {
238
- id: new EntityFields_1.UUIDField({
239
- columnName: 'id',
240
- cache: true,
241
- }),
242
- },
243
- databaseAdapterFlavor: 'postgres',
244
- cacheAdapterFlavor: 'redis',
245
- });
246
- const parentEntityConfiguration = new EntityConfiguration_1.EntityConfiguration({
247
- idField: 'id',
248
- tableName: 'parents',
249
- inboundEdges: [ChildEntity],
250
- schema: {
251
- id: new EntityFields_1.UUIDField({
252
- columnName: 'id',
253
- cache: true,
254
- }),
255
- },
256
- databaseAdapterFlavor: 'postgres',
257
- cacheAdapterFlavor: 'redis',
258
- });
259
- const childEntityConfiguration = new EntityConfiguration_1.EntityConfiguration({
260
- idField: 'id',
261
- tableName: 'children',
262
- inboundEdges: [GrandChildEntity],
263
- schema: {
264
- id: new EntityFields_1.UUIDField({
265
- columnName: 'id',
266
- cache: true,
267
- }),
268
- unused_other_edge_id: new EntityFields_1.UUIDField({
269
- columnName: 'unused_other_edge_id',
270
- association: {
271
- associatedEntityClass: OtherEntity,
272
- edgeDeletionBehavior,
273
- },
274
- }),
275
- parent_id: new EntityFields_1.UUIDField({
276
- columnName: 'parent_id',
277
- cache: true,
278
- association: {
279
- associatedEntityClass: ParentEntity,
280
- associatedEntityLookupByField: 'id', // sanity check that this functionality works by using it for one edge
281
- edgeDeletionBehavior,
282
- },
283
- }),
284
- },
285
- databaseAdapterFlavor: 'postgres',
286
- cacheAdapterFlavor: 'redis',
287
- });
288
- const grandChildEntityConfiguration = new EntityConfiguration_1.EntityConfiguration({
289
- idField: 'id',
290
- tableName: 'grandchildren',
291
- schema: {
292
- id: new EntityFields_1.UUIDField({
293
- columnName: 'id',
294
- cache: true,
295
- }),
296
- parent_id: new EntityFields_1.UUIDField({
297
- columnName: 'parent_id',
298
- cache: true,
299
- association: {
300
- associatedEntityClass: ChildEntity,
301
- edgeDeletionBehavior,
302
- },
303
- }),
304
- },
305
- databaseAdapterFlavor: 'postgres',
306
- cacheAdapterFlavor: 'redis',
307
- });
308
- return {
309
- ParentEntity,
310
- ChildEntity,
311
- GrandChildEntity,
312
- triggerExecutionCounts,
313
- privacyPolicyEvaluationRecords,
314
- };
315
- };
316
- (0, globals_1.describe)('EntityMutator.processEntityDeletionForInboundEdgesAsync', () => {
317
- (0, globals_1.describe)('EntityEdgeDeletionBehavior.CASCADE_DELETE', () => {
318
- (0, globals_1.it)('deletes', async () => {
319
- const { ParentEntity, ChildEntity, GrandChildEntity, triggerExecutionCounts, privacyPolicyEvaluationRecords, } = makeEntityClasses(EntityFieldDefinition_1.EntityEdgeDeletionBehavior.CASCADE_DELETE);
320
- const companionProvider = (0, createUnitTestEntityCompanionProvider_1.createUnitTestEntityCompanionProvider)();
321
- const viewerContext = new TestViewerContext_1.TestViewerContext(companionProvider);
322
- const parent = await ParentEntity.creator(viewerContext).createAsync();
323
- const child = await ChildEntity.creator(viewerContext)
324
- .setField('parent_id', parent.getID())
325
- .createAsync();
326
- const grandchild = await GrandChildEntity.creator(viewerContext)
327
- .setField('parent_id', child.getID())
328
- .createAsync();
329
- await (0, globals_1.expect)(ParentEntity.loader(viewerContext).loadByIDNullableAsync(parent.getID())).resolves.not.toBeNull();
330
- await (0, globals_1.expect)(ChildEntity.loader(viewerContext).loadByIDNullableAsync(child.getID())).resolves.not.toBeNull();
331
- await (0, globals_1.expect)(GrandChildEntity.loader(viewerContext).loadByIDNullableAsync(grandchild.getID())).resolves.not.toBeNull();
332
- privacyPolicyEvaluationRecords.shouldRecord = true;
333
- await ParentEntity.deleter(parent).deleteAsync();
334
- privacyPolicyEvaluationRecords.shouldRecord = false;
335
- await (0, globals_1.expect)(ParentEntity.loader(viewerContext).loadByIDNullableAsync(parent.getID())).resolves.toBeNull();
336
- await (0, globals_1.expect)(ChildEntity.loader(viewerContext).loadByIDNullableAsync(child.getID())).resolves.toBeNull();
337
- await (0, globals_1.expect)(GrandChildEntity.loader(viewerContext).loadByIDNullableAsync(grandchild.getID())).resolves.toBeNull();
338
- // two calls for each trigger, one beforeDelete, one afterDelete
339
- (0, globals_1.expect)(triggerExecutionCounts).toMatchObject({
340
- ParentEntityDeletion: 2,
341
- ChildEntityDeletion: 2,
342
- GrandChildEntityDeletion: 2,
343
- ParentEntityUpdate: 0,
344
- ChildEntityUpdate: 0,
345
- GrandChildEntityUpdate: 0,
346
- });
347
- (0, globals_1.expect)(privacyPolicyEvaluationRecords).toMatchObject({
348
- ParentEntity: {
349
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
350
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [],
351
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
352
- // one DELETE auth action for parent (since it's being deleted)
353
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [{ cascadingDeleteCause: null }],
354
- },
355
- ChildEntity: {
356
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
357
- // one READ auth action for child in order to delete via cascade
358
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [
359
- {
360
- cascadingDeleteCause: {
361
- entity: globals_1.expect.any(ParentEntity),
362
- cascadingDeleteCause: null,
363
- },
364
- },
365
- ],
366
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
367
- // one DELETE auth action for child (since it's being deleted via cascade)
368
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [
369
- {
370
- cascadingDeleteCause: {
371
- entity: globals_1.expect.any(ParentEntity),
372
- cascadingDeleteCause: null,
373
- },
374
- },
375
- ],
376
- },
377
- GrandChildEntity: {
378
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
379
- // one READ auth action for grandchild in order to delete via cascade
380
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [
381
- {
382
- cascadingDeleteCause: {
383
- entity: globals_1.expect.any(ChildEntity),
384
- cascadingDeleteCause: {
385
- entity: globals_1.expect.any(ParentEntity),
386
- cascadingDeleteCause: null,
387
- },
388
- },
389
- },
390
- ],
391
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
392
- // one DELETE auth action for grandchild (since it's being deleted via cascade)
393
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [
394
- {
395
- cascadingDeleteCause: {
396
- entity: globals_1.expect.any(ChildEntity),
397
- cascadingDeleteCause: {
398
- entity: globals_1.expect.any(ParentEntity),
399
- cascadingDeleteCause: null,
400
- },
401
- },
402
- },
403
- ],
404
- },
405
- });
406
- });
407
- });
408
- (0, globals_1.describe)('EntityEdgeDeletionBehavior.SET_NULL', () => {
409
- (0, globals_1.it)('sets null', async () => {
410
- const { ParentEntity, ChildEntity, GrandChildEntity, triggerExecutionCounts, privacyPolicyEvaluationRecords, } = makeEntityClasses(EntityFieldDefinition_1.EntityEdgeDeletionBehavior.SET_NULL);
411
- const companionProvider = (0, createUnitTestEntityCompanionProvider_1.createUnitTestEntityCompanionProvider)();
412
- const viewerContext = new TestViewerContext_1.TestViewerContext(companionProvider);
413
- const parent = await ParentEntity.creator(viewerContext).createAsync();
414
- const child = await ChildEntity.creator(viewerContext)
415
- .setField('parent_id', parent.getID())
416
- .createAsync();
417
- const grandchild = await GrandChildEntity.creator(viewerContext)
418
- .setField('parent_id', child.getID())
419
- .createAsync();
420
- await (0, globals_1.expect)(ParentEntity.loader(viewerContext).loadByIDNullableAsync(parent.getID())).resolves.not.toBeNull();
421
- await (0, globals_1.expect)(ChildEntity.loader(viewerContext).loadByIDNullableAsync(child.getID())).resolves.not.toBeNull();
422
- await (0, globals_1.expect)(GrandChildEntity.loader(viewerContext).loadByIDNullableAsync(grandchild.getID())).resolves.not.toBeNull();
423
- privacyPolicyEvaluationRecords.shouldRecord = true;
424
- await ParentEntity.deleter(parent).deleteAsync();
425
- privacyPolicyEvaluationRecords.shouldRecord = false;
426
- await (0, globals_1.expect)(ParentEntity.loader(viewerContext).loadByIDNullableAsync(parent.getID())).resolves.toBeNull();
427
- const loadedChild = await ChildEntity.loader(viewerContext).loadByIDAsync(child.getID());
428
- (0, globals_1.expect)(loadedChild.getField('parent_id')).toBeNull();
429
- const loadedGrandchild = await GrandChildEntity.loader(viewerContext).loadByIDAsync(grandchild.getID());
430
- (0, globals_1.expect)(loadedGrandchild.getField('parent_id')).toEqual(loadedChild.getID());
431
- // two calls for only parent trigger, one beforeDelete, one afterDelete
432
- // when using set null the descendants aren't deleted
433
- (0, globals_1.expect)(triggerExecutionCounts).toMatchObject({
434
- ParentEntityDeletion: 2,
435
- ChildEntityDeletion: 0,
436
- GrandChildEntityDeletion: 0,
437
- ParentEntityUpdate: 0,
438
- ChildEntityUpdate: 2,
439
- GrandChildEntityUpdate: 0,
440
- });
441
- (0, globals_1.expect)(privacyPolicyEvaluationRecords).toMatchObject({
442
- ParentEntity: {
443
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
444
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [],
445
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
446
- // one DELETE auth action for parent (since it's being deleted)
447
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [{ cascadingDeleteCause: null }],
448
- },
449
- ChildEntity: {
450
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
451
- // two READs auth action for Child during parent deletion:
452
- // 1. Read to initiate the SET_NULL (to update the entity)
453
- // 1. Read automatically post-update
454
- // no other entities are read since it is not cascaded past first entity
455
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [
456
- {
457
- cascadingDeleteCause: {
458
- entity: globals_1.expect.any(ParentEntity),
459
- cascadingDeleteCause: null,
460
- },
461
- },
462
- {
463
- cascadingDeleteCause: {
464
- entity: globals_1.expect.any(ParentEntity),
465
- cascadingDeleteCause: null,
466
- },
467
- },
468
- ],
469
- // one UPDATE to set null
470
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [
471
- {
472
- cascadingDeleteCause: {
473
- entity: globals_1.expect.any(ParentEntity),
474
- cascadingDeleteCause: null,
475
- },
476
- },
477
- ],
478
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [],
479
- },
480
- GrandChildEntity: {
481
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
482
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [],
483
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
484
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [],
485
- },
486
- });
487
- });
488
- });
489
- (0, globals_1.describe)('EntityEdgeDeletionBehavior.SET_NULL_INVALIDATE_CACHE_ONLY', () => {
490
- (0, globals_1.it)('invalidates the cache', async () => {
491
- const { ParentEntity, ChildEntity, GrandChildEntity, triggerExecutionCounts, privacyPolicyEvaluationRecords, } = makeEntityClasses(EntityFieldDefinition_1.EntityEdgeDeletionBehavior.SET_NULL_INVALIDATE_CACHE_ONLY);
492
- const companionProvider = (0, createUnitTestEntityCompanionProvider_1.createUnitTestEntityCompanionProvider)();
493
- const viewerContext = new TestViewerContext_1.TestViewerContext(companionProvider);
494
- const parent = await ParentEntity.creator(viewerContext).createAsync();
495
- const child = await ChildEntity.creator(viewerContext)
496
- .setField('parent_id', parent.getID())
497
- .createAsync();
498
- const grandchild = await GrandChildEntity.creator(viewerContext)
499
- .setField('parent_id', child.getID())
500
- .createAsync();
501
- await (0, globals_1.expect)(ParentEntity.loader(viewerContext).loadByIDNullableAsync(parent.getID())).resolves.not.toBeNull();
502
- await (0, globals_1.expect)(ChildEntity.loader(viewerContext).loadByFieldEqualingAsync('parent_id', parent.getID())).resolves.not.toBeNull();
503
- await (0, globals_1.expect)(GrandChildEntity.loader(viewerContext).loadByFieldEqualingAsync('parent_id', child.getID())).resolves.not.toBeNull();
504
- const childCacheAdapter = viewerContext.getViewerScopedEntityCompanionForClass(ChildEntity)['entityCompanion']['tableDataCoordinator']['cacheAdapter'];
505
- const childCachedBefore = await childCacheAdapter.loadManyAsync(new SingleFieldHolder_1.SingleFieldHolder('parent_id'), [new SingleFieldHolder_1.SingleFieldValueHolder(parent.getID())]);
506
- (0, globals_1.expect)(childCachedBefore.get(new SingleFieldHolder_1.SingleFieldValueHolder(parent.getID()))?.status).toEqual(ReadThroughEntityCache_1.CacheStatus.HIT);
507
- const grandChildCacheAdapter = viewerContext.getViewerScopedEntityCompanionForClass(GrandChildEntity)['entityCompanion']['tableDataCoordinator']['cacheAdapter'];
508
- const grandChildCachedBefore = await grandChildCacheAdapter.loadManyAsync(new SingleFieldHolder_1.SingleFieldHolder('parent_id'), [new SingleFieldHolder_1.SingleFieldValueHolder(child.getID())]);
509
- (0, globals_1.expect)(grandChildCachedBefore.get(new SingleFieldHolder_1.SingleFieldValueHolder(child.getID()))?.status).toEqual(ReadThroughEntityCache_1.CacheStatus.HIT);
510
- privacyPolicyEvaluationRecords.shouldRecord = true;
511
- await ParentEntity.deleter(parent).deleteAsync();
512
- privacyPolicyEvaluationRecords.shouldRecord = false;
513
- const childCachedAfter = await childCacheAdapter.loadManyAsync(new SingleFieldHolder_1.SingleFieldHolder('parent_id'), [new SingleFieldHolder_1.SingleFieldValueHolder(parent.getID())]);
514
- (0, globals_1.expect)(childCachedAfter.get(new SingleFieldHolder_1.SingleFieldValueHolder(parent.getID()))?.status).toEqual(ReadThroughEntityCache_1.CacheStatus.MISS);
515
- const grandChildCachedAfter = await grandChildCacheAdapter.loadManyAsync(new SingleFieldHolder_1.SingleFieldHolder('parent_id'), [new SingleFieldHolder_1.SingleFieldValueHolder(child.getID())]);
516
- (0, globals_1.expect)(grandChildCachedAfter.get(new SingleFieldHolder_1.SingleFieldValueHolder(child.getID()))?.status).toEqual(ReadThroughEntityCache_1.CacheStatus.HIT);
517
- await (0, globals_1.expect)(ParentEntity.loader(viewerContext).loadByIDNullableAsync(parent.getID())).resolves.toBeNull();
518
- const loadedChild = await ChildEntity.loader(viewerContext).loadByIDAsync(child.getID());
519
- (0, globals_1.expect)(loadedChild).not.toBeNull();
520
- const loadedGrandchild = await GrandChildEntity.loader(viewerContext).loadByIDAsync(grandchild.getID());
521
- (0, globals_1.expect)(loadedGrandchild.getField('parent_id')).toEqual(loadedChild.getID());
522
- // two calls for only parent trigger, one beforeDelete, one afterDelete
523
- // when using set null the descendants aren't deleted
524
- (0, globals_1.expect)(triggerExecutionCounts).toMatchObject({
525
- ParentEntityDeletion: 2,
526
- ChildEntityDeletion: 0,
527
- GrandChildEntityDeletion: 0,
528
- ParentEntityUpdate: 0,
529
- ChildEntityUpdate: 2,
530
- GrandChildEntityUpdate: 0,
531
- });
532
- (0, globals_1.expect)(privacyPolicyEvaluationRecords).toMatchObject({
533
- ParentEntity: {
534
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
535
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [],
536
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
537
- // one DELETE auth action for parent (since it's being deleted)
538
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [{ cascadingDeleteCause: null }],
539
- },
540
- ChildEntity: {
541
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
542
- // two READs auth action for child in order to update via cascade
543
- // no other entities are read since it is not cascaded past first entity
544
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [
545
- {
546
- cascadingDeleteCause: {
547
- entity: globals_1.expect.any(ParentEntity),
548
- cascadingDeleteCause: null,
549
- },
550
- },
551
- {
552
- cascadingDeleteCause: {
553
- entity: globals_1.expect.any(ParentEntity),
554
- cascadingDeleteCause: null,
555
- },
556
- },
557
- ],
558
- // one UPDATE to set null
559
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [
560
- {
561
- cascadingDeleteCause: {
562
- entity: globals_1.expect.any(ParentEntity),
563
- cascadingDeleteCause: null,
564
- },
565
- },
566
- ],
567
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [],
568
- },
569
- GrandChildEntity: {
570
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
571
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [],
572
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
573
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [],
574
- },
575
- });
576
- });
577
- });
578
- (0, globals_1.describe)('EntityEdgeDeletionBehavior.CASCADE_DELETE_INVALIDATE_CACHE_ONLY', () => {
579
- (0, globals_1.it)('invalidates the cache', async () => {
580
- const { ParentEntity, ChildEntity, GrandChildEntity, triggerExecutionCounts, privacyPolicyEvaluationRecords, } = makeEntityClasses(EntityFieldDefinition_1.EntityEdgeDeletionBehavior.CASCADE_DELETE_INVALIDATE_CACHE_ONLY);
581
- const companionProvider = (0, createUnitTestEntityCompanionProvider_1.createUnitTestEntityCompanionProvider)();
582
- const viewerContext = new TestViewerContext_1.TestViewerContext(companionProvider);
583
- const parent = await ParentEntity.creator(viewerContext).createAsync();
584
- const child = await ChildEntity.creator(viewerContext)
585
- .setField('parent_id', parent.getID())
586
- .createAsync();
587
- const grandchild = await GrandChildEntity.creator(viewerContext)
588
- .setField('parent_id', child.getID())
589
- .createAsync();
590
- await (0, globals_1.expect)(ParentEntity.loader(viewerContext).loadByIDNullableAsync(parent.getID())).resolves.not.toBeNull();
591
- await (0, globals_1.expect)(ChildEntity.loader(viewerContext).loadByFieldEqualingAsync('parent_id', parent.getID())).resolves.not.toBeNull();
592
- await (0, globals_1.expect)(GrandChildEntity.loader(viewerContext).loadByFieldEqualingAsync('parent_id', child.getID())).resolves.not.toBeNull();
593
- const childCacheAdapter = viewerContext.getViewerScopedEntityCompanionForClass(ChildEntity)['entityCompanion']['tableDataCoordinator']['cacheAdapter'];
594
- const childCachedBefore = await childCacheAdapter.loadManyAsync(new SingleFieldHolder_1.SingleFieldHolder('parent_id'), [new SingleFieldHolder_1.SingleFieldValueHolder(parent.getID())]);
595
- (0, globals_1.expect)(childCachedBefore.get(new SingleFieldHolder_1.SingleFieldValueHolder(parent.getID()))?.status).toEqual(ReadThroughEntityCache_1.CacheStatus.HIT);
596
- const grandChildCacheAdapter = viewerContext.getViewerScopedEntityCompanionForClass(GrandChildEntity)['entityCompanion']['tableDataCoordinator']['cacheAdapter'];
597
- const grandChildCachedBefore = await grandChildCacheAdapter.loadManyAsync(new SingleFieldHolder_1.SingleFieldHolder('parent_id'), [new SingleFieldHolder_1.SingleFieldValueHolder(child.getID())]);
598
- (0, globals_1.expect)(grandChildCachedBefore.get(new SingleFieldHolder_1.SingleFieldValueHolder(child.getID()))?.status).toEqual(ReadThroughEntityCache_1.CacheStatus.HIT);
599
- privacyPolicyEvaluationRecords.shouldRecord = true;
600
- await ParentEntity.deleter(parent).deleteAsync();
601
- privacyPolicyEvaluationRecords.shouldRecord = false;
602
- const childCachedAfter = await childCacheAdapter.loadManyAsync(new SingleFieldHolder_1.SingleFieldHolder('parent_id'), [new SingleFieldHolder_1.SingleFieldValueHolder(parent.getID())]);
603
- (0, globals_1.expect)(childCachedAfter.get(new SingleFieldHolder_1.SingleFieldValueHolder(parent.getID()))?.status).toEqual(ReadThroughEntityCache_1.CacheStatus.MISS);
604
- const grandChildCachedAfter = await grandChildCacheAdapter.loadManyAsync(new SingleFieldHolder_1.SingleFieldHolder('parent_id'), [new SingleFieldHolder_1.SingleFieldValueHolder(child.getID())]);
605
- (0, globals_1.expect)(grandChildCachedAfter.get(new SingleFieldHolder_1.SingleFieldValueHolder(child.getID()))?.status).toEqual(ReadThroughEntityCache_1.CacheStatus.MISS);
606
- await (0, globals_1.expect)(ParentEntity.loader(viewerContext).loadByIDNullableAsync(parent.getID())).resolves.toBeNull();
607
- await (0, globals_1.expect)(ChildEntity.loader(viewerContext).loadByIDNullableAsync(child.getID())).resolves.not.toBeNull();
608
- await (0, globals_1.expect)(GrandChildEntity.loader(viewerContext).loadByIDNullableAsync(grandchild.getID())).resolves.not.toBeNull();
609
- // two calls for each trigger, one beforeDelete, one afterDelete
610
- (0, globals_1.expect)(triggerExecutionCounts).toMatchObject({
611
- ParentEntityDeletion: 2,
612
- ChildEntityDeletion: 2,
613
- GrandChildEntityDeletion: 2,
614
- ParentEntityUpdate: 0,
615
- ChildEntityUpdate: 0,
616
- GrandChildEntityUpdate: 0,
617
- });
618
- (0, globals_1.expect)(privacyPolicyEvaluationRecords).toMatchObject({
619
- ParentEntity: {
620
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
621
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [],
622
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
623
- // one DELETE auth action for parent (since it's being deleted)
624
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [{ cascadingDeleteCause: null }],
625
- },
626
- ChildEntity: {
627
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
628
- // one READ auth action for child in order to delete via cascade
629
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [
630
- {
631
- cascadingDeleteCause: {
632
- entity: globals_1.expect.any(ParentEntity),
633
- cascadingDeleteCause: null,
634
- },
635
- },
636
- ],
637
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
638
- // one DELETE auth action for child (since it's being deleted via cascade)
639
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [
640
- {
641
- cascadingDeleteCause: {
642
- entity: globals_1.expect.any(ParentEntity),
643
- cascadingDeleteCause: null,
644
- },
645
- },
646
- ],
647
- },
648
- GrandChildEntity: {
649
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.CREATE]: [],
650
- // one READ auth action for grandchild in order to delete via cascade
651
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.READ]: [
652
- {
653
- cascadingDeleteCause: {
654
- entity: globals_1.expect.any(ChildEntity),
655
- cascadingDeleteCause: {
656
- entity: globals_1.expect.any(ParentEntity),
657
- cascadingDeleteCause: null,
658
- },
659
- },
660
- },
661
- ],
662
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.UPDATE]: [],
663
- // one DELETE auth action for grandchild (since it's being deleted via cascade)
664
- [EntityPrivacyPolicy_1.EntityAuthorizationAction.DELETE]: [
665
- {
666
- cascadingDeleteCause: {
667
- entity: globals_1.expect.any(ChildEntity),
668
- cascadingDeleteCause: {
669
- entity: globals_1.expect.any(ParentEntity),
670
- cascadingDeleteCause: null,
671
- },
672
- },
673
- },
674
- ],
675
- },
676
- });
677
- });
678
- });
679
- });
680
- //# sourceMappingURL=EntityEdges-test.js.map