@expo/entity 0.46.0 → 0.47.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 (216) 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 -3
  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/LICENSE +0 -21
  27. package/build/src/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.d.ts +0 -1
  28. package/build/src/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js +0 -240
  29. package/build/src/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js.map +0 -1
  30. package/build/src/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.d.ts +0 -26
  31. package/build/src/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js +0 -109
  32. package/build/src/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js.map +0 -1
  33. package/build/src/__tests__/AuthorizationResultBasedEntityLoader-test.d.ts +0 -1
  34. package/build/src/__tests__/AuthorizationResultBasedEntityLoader-test.js +0 -590
  35. package/build/src/__tests__/AuthorizationResultBasedEntityLoader-test.js.map +0 -1
  36. package/build/src/__tests__/ComposedCacheAdapter-test.d.ts +0 -1
  37. package/build/src/__tests__/ComposedCacheAdapter-test.js +0 -259
  38. package/build/src/__tests__/ComposedCacheAdapter-test.js.map +0 -1
  39. package/build/src/__tests__/ComposedSecondaryEntityCache-test.d.ts +0 -1
  40. package/build/src/__tests__/ComposedSecondaryEntityCache-test.js +0 -67
  41. package/build/src/__tests__/ComposedSecondaryEntityCache-test.js.map +0 -1
  42. package/build/src/__tests__/EnforcingEntityAssociationLoader-test.d.ts +0 -1
  43. package/build/src/__tests__/EnforcingEntityAssociationLoader-test.js +0 -113
  44. package/build/src/__tests__/EnforcingEntityAssociationLoader-test.js.map +0 -1
  45. package/build/src/__tests__/EnforcingEntityLoader-test.d.ts +0 -1
  46. package/build/src/__tests__/EnforcingEntityLoader-test.js +0 -316
  47. package/build/src/__tests__/EnforcingEntityLoader-test.js.map +0 -1
  48. package/build/src/__tests__/Entity-test.d.ts +0 -1
  49. package/build/src/__tests__/Entity-test.js +0 -92
  50. package/build/src/__tests__/Entity-test.js.map +0 -1
  51. package/build/src/__tests__/EntityAssociationLoader-test.d.ts +0 -1
  52. package/build/src/__tests__/EntityAssociationLoader-test.js +0 -28
  53. package/build/src/__tests__/EntityAssociationLoader-test.js.map +0 -1
  54. package/build/src/__tests__/EntityCommonUseCases-test.d.ts +0 -1
  55. package/build/src/__tests__/EntityCommonUseCases-test.js +0 -111
  56. package/build/src/__tests__/EntityCommonUseCases-test.js.map +0 -1
  57. package/build/src/__tests__/EntityCompanion-test.d.ts +0 -1
  58. package/build/src/__tests__/EntityCompanion-test.js +0 -42
  59. package/build/src/__tests__/EntityCompanion-test.js.map +0 -1
  60. package/build/src/__tests__/EntityCompanionProvider-test.d.ts +0 -1
  61. package/build/src/__tests__/EntityCompanionProvider-test.js +0 -53
  62. package/build/src/__tests__/EntityCompanionProvider-test.js.map +0 -1
  63. package/build/src/__tests__/EntityConfiguration-test.d.ts +0 -1
  64. package/build/src/__tests__/EntityConfiguration-test.js +0 -164
  65. package/build/src/__tests__/EntityConfiguration-test.js.map +0 -1
  66. package/build/src/__tests__/EntityDatabaseAdapter-test.d.ts +0 -1
  67. package/build/src/__tests__/EntityDatabaseAdapter-test.js +0 -189
  68. package/build/src/__tests__/EntityDatabaseAdapter-test.js.map +0 -1
  69. package/build/src/__tests__/EntityEdges-test.d.ts +0 -1
  70. package/build/src/__tests__/EntityEdges-test.js +0 -680
  71. package/build/src/__tests__/EntityEdges-test.js.map +0 -1
  72. package/build/src/__tests__/EntityFields-test.d.ts +0 -1
  73. package/build/src/__tests__/EntityFields-test.js +0 -61
  74. package/build/src/__tests__/EntityFields-test.js.map +0 -1
  75. package/build/src/__tests__/EntityLoader-test.d.ts +0 -1
  76. package/build/src/__tests__/EntityLoader-test.js +0 -34
  77. package/build/src/__tests__/EntityLoader-test.js.map +0 -1
  78. package/build/src/__tests__/EntityMutator-MutationCacheConsistency-test.d.ts +0 -1
  79. package/build/src/__tests__/EntityMutator-MutationCacheConsistency-test.js +0 -71
  80. package/build/src/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +0 -1
  81. package/build/src/__tests__/EntityMutator-SingleCompositeFieldCacheConsistency-test.d.ts +0 -1
  82. package/build/src/__tests__/EntityMutator-SingleCompositeFieldCacheConsistency-test.js +0 -54
  83. package/build/src/__tests__/EntityMutator-SingleCompositeFieldCacheConsistency-test.js.map +0 -1
  84. package/build/src/__tests__/EntityMutator-test.d.ts +0 -1
  85. package/build/src/__tests__/EntityMutator-test.js +0 -721
  86. package/build/src/__tests__/EntityMutator-test.js.map +0 -1
  87. package/build/src/__tests__/EntityPrivacyPolicy-test.d.ts +0 -1
  88. package/build/src/__tests__/EntityPrivacyPolicy-test.js +0 -429
  89. package/build/src/__tests__/EntityPrivacyPolicy-test.js.map +0 -1
  90. package/build/src/__tests__/EntityQueryContext-test.d.ts +0 -1
  91. package/build/src/__tests__/EntityQueryContext-test.js +0 -181
  92. package/build/src/__tests__/EntityQueryContext-test.js.map +0 -1
  93. package/build/src/__tests__/EntitySecondaryCacheLoader-test.d.ts +0 -1
  94. package/build/src/__tests__/EntitySecondaryCacheLoader-test.js +0 -58
  95. package/build/src/__tests__/EntitySecondaryCacheLoader-test.js.map +0 -1
  96. package/build/src/__tests__/EntitySelfReferentialEdges-test.d.ts +0 -1
  97. package/build/src/__tests__/EntitySelfReferentialEdges-test.js +0 -196
  98. package/build/src/__tests__/EntitySelfReferentialEdges-test.js.map +0 -1
  99. package/build/src/__tests__/GenericEntityCacheAdapter-test.d.ts +0 -1
  100. package/build/src/__tests__/GenericEntityCacheAdapter-test.js +0 -95
  101. package/build/src/__tests__/GenericEntityCacheAdapter-test.js.map +0 -1
  102. package/build/src/__tests__/ReadonlyEntity-test.d.ts +0 -1
  103. package/build/src/__tests__/ReadonlyEntity-test.js +0 -209
  104. package/build/src/__tests__/ReadonlyEntity-test.js.map +0 -1
  105. package/build/src/__tests__/ViewerContext-test.d.ts +0 -1
  106. package/build/src/__tests__/ViewerContext-test.js +0 -28
  107. package/build/src/__tests__/ViewerContext-test.js.map +0 -1
  108. package/build/src/__tests__/ViewerScopedEntityCompanion-test.d.ts +0 -1
  109. package/build/src/__tests__/ViewerScopedEntityCompanion-test.js +0 -18
  110. package/build/src/__tests__/ViewerScopedEntityCompanion-test.js.map +0 -1
  111. package/build/src/__tests__/ViewerScopedEntityCompanionProvider-test.d.ts +0 -1
  112. package/build/src/__tests__/ViewerScopedEntityCompanionProvider-test.js +0 -18
  113. package/build/src/__tests__/ViewerScopedEntityCompanionProvider-test.js.map +0 -1
  114. package/build/src/__tests__/ViewerScopedEntityLoaderFactory-test.d.ts +0 -1
  115. package/build/src/__tests__/ViewerScopedEntityLoaderFactory-test.js +0 -21
  116. package/build/src/__tests__/ViewerScopedEntityLoaderFactory-test.js.map +0 -1
  117. package/build/src/__tests__/ViewerScopedEntityMutatorFactory-test.d.ts +0 -1
  118. package/build/src/__tests__/ViewerScopedEntityMutatorFactory-test.js +0 -20
  119. package/build/src/__tests__/ViewerScopedEntityMutatorFactory-test.js.map +0 -1
  120. package/build/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.d.ts +0 -1
  121. package/build/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +0 -121
  122. package/build/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +0 -1
  123. package/build/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.d.ts +0 -1
  124. package/build/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +0 -119
  125. package/build/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +0 -1
  126. package/build/src/__tests__/entityUtils-test.d.ts +0 -1
  127. package/build/src/__tests__/entityUtils-test.js +0 -88
  128. package/build/src/__tests__/entityUtils-test.js.map +0 -1
  129. package/build/src/errors/__tests__/EntityDatabaseAdapterError-test.d.ts +0 -1
  130. package/build/src/errors/__tests__/EntityDatabaseAdapterError-test.js +0 -21
  131. package/build/src/errors/__tests__/EntityDatabaseAdapterError-test.js.map +0 -1
  132. package/build/src/internal/__tests__/CompositeFieldHolder-test.d.ts +0 -1
  133. package/build/src/internal/__tests__/CompositeFieldHolder-test.js +0 -25
  134. package/build/src/internal/__tests__/CompositeFieldHolder-test.js.map +0 -1
  135. package/build/src/internal/__tests__/CompositeFieldValueMap-test.d.ts +0 -1
  136. package/build/src/internal/__tests__/CompositeFieldValueMap-test.js +0 -40
  137. package/build/src/internal/__tests__/CompositeFieldValueMap-test.js.map +0 -1
  138. package/build/src/internal/__tests__/EntityDataManager-test.d.ts +0 -1
  139. package/build/src/internal/__tests__/EntityDataManager-test.js +0 -666
  140. package/build/src/internal/__tests__/EntityDataManager-test.js.map +0 -1
  141. package/build/src/internal/__tests__/EntityFieldTransformationUtils-test.d.ts +0 -1
  142. package/build/src/internal/__tests__/EntityFieldTransformationUtils-test.js +0 -135
  143. package/build/src/internal/__tests__/EntityFieldTransformationUtils-test.js.map +0 -1
  144. package/build/src/internal/__tests__/ReadThroughEntityCache-test.d.ts +0 -1
  145. package/build/src/internal/__tests__/ReadThroughEntityCache-test.js +0 -217
  146. package/build/src/internal/__tests__/ReadThroughEntityCache-test.js.map +0 -1
  147. package/build/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.d.ts +0 -1
  148. package/build/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js +0 -18
  149. package/build/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js.map +0 -1
  150. package/build/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.d.ts +0 -1
  151. package/build/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js +0 -18
  152. package/build/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js.map +0 -1
  153. package/build/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.d.ts +0 -1
  154. package/build/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js +0 -18
  155. package/build/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js.map +0 -1
  156. package/build/src/utils/__testfixtures__/PrivacyPolicyRuleTestUtils.d.ts +0 -28
  157. package/build/src/utils/__testfixtures__/PrivacyPolicyRuleTestUtils.js +0 -53
  158. package/build/src/utils/__testfixtures__/PrivacyPolicyRuleTestUtils.js.map +0 -1
  159. package/build/src/utils/__testfixtures__/SimpleTestEntity.d.ts +0 -20
  160. package/build/src/utils/__testfixtures__/SimpleTestEntity.js +0 -46
  161. package/build/src/utils/__testfixtures__/SimpleTestEntity.js.map +0 -1
  162. package/build/src/utils/__testfixtures__/StubCacheAdapter.d.ts +0 -29
  163. package/build/src/utils/__testfixtures__/StubCacheAdapter.js +0 -103
  164. package/build/src/utils/__testfixtures__/StubCacheAdapter.js.map +0 -1
  165. package/build/src/utils/__testfixtures__/StubDatabaseAdapter.d.ts +0 -26
  166. package/build/src/utils/__testfixtures__/StubDatabaseAdapter.js +0 -173
  167. package/build/src/utils/__testfixtures__/StubDatabaseAdapter.js.map +0 -1
  168. package/build/src/utils/__testfixtures__/StubDatabaseAdapterProvider.d.ts +0 -7
  169. package/build/src/utils/__testfixtures__/StubDatabaseAdapterProvider.js +0 -12
  170. package/build/src/utils/__testfixtures__/StubDatabaseAdapterProvider.js.map +0 -1
  171. package/build/src/utils/__testfixtures__/StubQueryContextProvider.d.ts +0 -7
  172. package/build/src/utils/__testfixtures__/StubQueryContextProvider.js +0 -17
  173. package/build/src/utils/__testfixtures__/StubQueryContextProvider.js.map +0 -1
  174. package/build/src/utils/__testfixtures__/TSMockitoExtensions.d.ts +0 -9
  175. package/build/src/utils/__testfixtures__/TSMockitoExtensions.js +0 -65
  176. package/build/src/utils/__testfixtures__/TSMockitoExtensions.js.map +0 -1
  177. package/build/src/utils/__testfixtures__/TestEntity.d.ts +0 -30
  178. package/build/src/utils/__testfixtures__/TestEntity.js +0 -96
  179. package/build/src/utils/__testfixtures__/TestEntity.js.map +0 -1
  180. package/build/src/utils/__testfixtures__/TestEntity2.d.ts +0 -20
  181. package/build/src/utils/__testfixtures__/TestEntity2.js +0 -49
  182. package/build/src/utils/__testfixtures__/TestEntity2.js.map +0 -1
  183. package/build/src/utils/__testfixtures__/TestEntityWithMutationTriggers.d.ts +0 -36
  184. package/build/src/utils/__testfixtures__/TestEntityWithMutationTriggers.js +0 -80
  185. package/build/src/utils/__testfixtures__/TestEntityWithMutationTriggers.js.map +0 -1
  186. package/build/src/utils/__testfixtures__/TestViewerContext.d.ts +0 -3
  187. package/build/src/utils/__testfixtures__/TestViewerContext.js +0 -8
  188. package/build/src/utils/__testfixtures__/TestViewerContext.js.map +0 -1
  189. package/build/src/utils/__testfixtures__/createUnitTestEntityCompanionProvider.d.ts +0 -7
  190. package/build/src/utils/__testfixtures__/createUnitTestEntityCompanionProvider.js +0 -33
  191. package/build/src/utils/__testfixtures__/createUnitTestEntityCompanionProvider.js.map +0 -1
  192. package/build/src/utils/__testfixtures__/describeFieldTestCase.d.ts +0 -2
  193. package/build/src/utils/__testfixtures__/describeFieldTestCase.js +0 -19
  194. package/build/src/utils/__testfixtures__/describeFieldTestCase.js.map +0 -1
  195. package/build/src/utils/__tests__/EntityCreationUtils-test.d.ts +0 -1
  196. package/build/src/utils/__tests__/EntityCreationUtils-test.js +0 -144
  197. package/build/src/utils/__tests__/EntityCreationUtils-test.js.map +0 -1
  198. package/build/src/utils/__tests__/EntityPrivacyUtils-test.d.ts +0 -1
  199. package/build/src/utils/__tests__/EntityPrivacyUtils-test.js +0 -460
  200. package/build/src/utils/__tests__/EntityPrivacyUtils-test.js.map +0 -1
  201. package/build/src/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.d.ts +0 -1
  202. package/build/src/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js +0 -180
  203. package/build/src/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js.map +0 -1
  204. package/build/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.d.ts +0 -1
  205. package/build/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js +0 -27
  206. package/build/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js.map +0 -1
  207. package/build/src/utils/collections/__tests__/SerializableKeyMap-test.d.ts +0 -5
  208. package/build/src/utils/collections/__tests__/SerializableKeyMap-test.js +0 -99
  209. package/build/src/utils/collections/__tests__/SerializableKeyMap-test.js.map +0 -1
  210. package/build/src/utils/collections/__tests__/maps-test.d.ts +0 -1
  211. package/build/src/utils/collections/__tests__/maps-test.js +0 -121
  212. package/build/src/utils/collections/__tests__/maps-test.js.map +0 -1
  213. package/build/src/utils/collections/__tests__/sets-test.d.ts +0 -1
  214. package/build/src/utils/collections/__tests__/sets-test.js +0 -19
  215. package/build/src/utils/collections/__tests__/sets-test.js.map +0 -1
  216. 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