@expo/entity 0.39.0 → 0.41.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 (175) hide show
  1. package/build/AuthorizationResultBasedEntityAssociationLoader.d.ts +99 -0
  2. package/build/AuthorizationResultBasedEntityAssociationLoader.js +122 -0
  3. package/build/AuthorizationResultBasedEntityAssociationLoader.js.map +1 -0
  4. package/build/AuthorizationResultBasedEntityLoader.d.ts +1 -1
  5. package/build/AuthorizationResultBasedEntityLoader.js.map +1 -1
  6. package/build/{EntityMutator.d.ts → AuthorizationResultBasedEntityMutator.d.ts} +5 -17
  7. package/build/{EntityMutator.js → AuthorizationResultBasedEntityMutator.js} +22 -48
  8. package/build/AuthorizationResultBasedEntityMutator.js.map +1 -0
  9. package/build/EnforcingEntityAssociationLoader.d.ts +79 -0
  10. package/build/EnforcingEntityAssociationLoader.js +62 -0
  11. package/build/EnforcingEntityAssociationLoader.js.map +1 -0
  12. package/build/EnforcingEntityCreator.d.ts +24 -0
  13. package/build/EnforcingEntityCreator.js +32 -0
  14. package/build/EnforcingEntityCreator.js.map +1 -0
  15. package/build/EnforcingEntityDeleter.d.ts +17 -0
  16. package/build/EnforcingEntityDeleter.js +22 -0
  17. package/build/EnforcingEntityDeleter.js.map +1 -0
  18. package/build/EnforcingEntityUpdater.d.ts +24 -0
  19. package/build/EnforcingEntityUpdater.js +32 -0
  20. package/build/EnforcingEntityUpdater.js.map +1 -0
  21. package/build/Entity.d.ts +26 -8
  22. package/build/Entity.js +38 -25
  23. package/build/Entity.js.map +1 -1
  24. package/build/EntityAssociationLoader.d.ts +12 -91
  25. package/build/EntityAssociationLoader.js +20 -126
  26. package/build/EntityAssociationLoader.js.map +1 -1
  27. package/build/EntityCreator.d.ts +27 -0
  28. package/build/EntityCreator.js +39 -0
  29. package/build/EntityCreator.js.map +1 -0
  30. package/build/EntityDeleter.d.ts +27 -0
  31. package/build/EntityDeleter.js +40 -0
  32. package/build/EntityDeleter.js.map +1 -0
  33. package/build/EntityLoader.d.ts +4 -14
  34. package/build/EntityLoader.js +7 -20
  35. package/build/EntityLoader.js.map +1 -1
  36. package/build/EntityLoaderFactory.d.ts +2 -2
  37. package/build/EntityLoaderFactory.js +4 -2
  38. package/build/EntityLoaderFactory.js.map +1 -1
  39. package/build/EntityMutatorFactory.d.ts +4 -4
  40. package/build/EntityMutatorFactory.js +4 -4
  41. package/build/EntityMutatorFactory.js.map +1 -1
  42. package/build/EntitySecondaryCacheLoader.d.ts +3 -3
  43. package/build/EntitySecondaryCacheLoader.js +1 -3
  44. package/build/EntitySecondaryCacheLoader.js.map +1 -1
  45. package/build/EntityUpdater.d.ts +27 -0
  46. package/build/EntityUpdater.js +40 -0
  47. package/build/EntityUpdater.js.map +1 -0
  48. package/build/ReadonlyEntity.d.ts +24 -5
  49. package/build/ReadonlyEntity.js +33 -7
  50. package/build/ReadonlyEntity.js.map +1 -1
  51. package/build/ViewerScopedEntityLoaderFactory.d.ts +2 -2
  52. package/build/ViewerScopedEntityLoaderFactory.js.map +1 -1
  53. package/build/ViewerScopedEntityMutatorFactory.d.ts +4 -4
  54. package/build/ViewerScopedEntityMutatorFactory.js.map +1 -1
  55. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.d.ts +1 -0
  56. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js +242 -0
  57. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js.map +1 -0
  58. package/build/__tests__/{EntityLoader-constructor-test.js → AuthorizationResultBasedEntityLoader-constructor-test.js} +10 -10
  59. package/build/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js.map +1 -0
  60. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.d.ts +1 -0
  61. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.js +401 -0
  62. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.js.map +1 -0
  63. package/build/__tests__/EnforcingEntityAssociationLoader-test.d.ts +1 -0
  64. package/build/__tests__/EnforcingEntityAssociationLoader-test.js +115 -0
  65. package/build/__tests__/EnforcingEntityAssociationLoader-test.js.map +1 -0
  66. package/build/__tests__/Entity-test.js +63 -5
  67. package/build/__tests__/Entity-test.js.map +1 -1
  68. package/build/__tests__/EntityAssociationLoader-test.js +14 -184
  69. package/build/__tests__/EntityAssociationLoader-test.js.map +1 -1
  70. package/build/__tests__/EntityCommonUseCases-test.js +34 -20
  71. package/build/__tests__/EntityCommonUseCases-test.js.map +1 -1
  72. package/build/__tests__/EntityCompanion-test.js +17 -7
  73. package/build/__tests__/EntityCompanion-test.js.map +1 -1
  74. package/build/__tests__/EntityEdges-test.js +57 -71
  75. package/build/__tests__/EntityEdges-test.js.map +1 -1
  76. package/build/__tests__/EntityLoader-test.js +22 -386
  77. package/build/__tests__/EntityLoader-test.js.map +1 -1
  78. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js +6 -9
  79. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +1 -1
  80. package/build/__tests__/EntityMutator-test.js +67 -70
  81. package/build/__tests__/EntityMutator-test.js.map +1 -1
  82. package/build/__tests__/EntityPrivacyPolicy-test.js +17 -7
  83. package/build/__tests__/EntityPrivacyPolicy-test.js.map +1 -1
  84. package/build/__tests__/EntitySecondaryCacheLoader-test.js +7 -7
  85. package/build/__tests__/EntitySecondaryCacheLoader-test.js.map +1 -1
  86. package/build/__tests__/EntitySelfReferentialEdges-test.js +47 -81
  87. package/build/__tests__/EntitySelfReferentialEdges-test.js.map +1 -1
  88. package/build/__tests__/ReadonlyEntity-test.js +40 -7
  89. package/build/__tests__/ReadonlyEntity-test.js.map +1 -1
  90. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +6 -10
  91. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +1 -1
  92. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +10 -22
  93. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +1 -1
  94. package/build/errors/EntityCacheAdapterError.js +17 -7
  95. package/build/errors/EntityCacheAdapterError.js.map +1 -1
  96. package/build/errors/EntityDatabaseAdapterError.js +17 -7
  97. package/build/errors/EntityDatabaseAdapterError.js.map +1 -1
  98. package/build/errors/EntityInvalidFieldValueError.js +17 -7
  99. package/build/errors/EntityInvalidFieldValueError.js.map +1 -1
  100. package/build/errors/EntityNotAuthorizedError.js +17 -7
  101. package/build/errors/EntityNotAuthorizedError.js.map +1 -1
  102. package/build/errors/EntityNotFoundError.js +17 -7
  103. package/build/errors/EntityNotFoundError.js.map +1 -1
  104. package/build/index.d.ts +19 -11
  105. package/build/index.js +24 -7
  106. package/build/index.js.map +1 -1
  107. package/build/internal/__tests__/EntityDataManager-test.js +42 -32
  108. package/build/internal/__tests__/EntityDataManager-test.js.map +1 -1
  109. package/build/internal/__tests__/ReadThroughEntityCache-test.js +17 -7
  110. package/build/internal/__tests__/ReadThroughEntityCache-test.js.map +1 -1
  111. package/build/rules/AlwaysAllowPrivacyPolicyRule.js +17 -7
  112. package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -1
  113. package/build/rules/AlwaysDenyPrivacyPolicyRule.js +17 -7
  114. package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -1
  115. package/build/rules/AlwaysSkipPrivacyPolicyRule.js +17 -7
  116. package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -1
  117. package/build/utils/EntityPrivacyUtils.js +4 -8
  118. package/build/utils/EntityPrivacyUtils.js.map +1 -1
  119. package/build/utils/__tests__/EntityPrivacyUtils-test.js +38 -28
  120. package/build/utils/__tests__/EntityPrivacyUtils-test.js.map +1 -1
  121. package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js +5 -5
  122. package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js.map +1 -1
  123. package/build/utils/testing/StubDatabaseAdapter.js +17 -7
  124. package/build/utils/testing/StubDatabaseAdapter.js.map +1 -1
  125. package/build/utils/testing/StubQueryContextProvider.d.ts +1 -3
  126. package/build/utils/testing/StubQueryContextProvider.js +1 -3
  127. package/build/utils/testing/StubQueryContextProvider.js.map +1 -1
  128. package/build/utils/testing/createUnitTestEntityCompanionProvider.js +2 -1
  129. package/build/utils/testing/createUnitTestEntityCompanionProvider.js.map +1 -1
  130. package/package.json +19 -3
  131. package/src/AuthorizationResultBasedEntityAssociationLoader.ts +490 -0
  132. package/src/AuthorizationResultBasedEntityLoader.ts +1 -1
  133. package/src/{EntityMutator.ts → AuthorizationResultBasedEntityMutator.ts} +62 -58
  134. package/src/EnforcingEntityAssociationLoader.ts +390 -0
  135. package/src/EnforcingEntityCreator.ts +55 -0
  136. package/src/EnforcingEntityDeleter.ts +44 -0
  137. package/src/EnforcingEntityUpdater.ts +55 -0
  138. package/src/Entity.ts +140 -29
  139. package/src/EntityAssociationLoader.ts +38 -495
  140. package/src/EntityCreator.ts +73 -0
  141. package/src/EntityDeleter.ts +73 -0
  142. package/src/EntityLoader.ts +10 -49
  143. package/src/EntityLoaderFactory.ts +20 -3
  144. package/src/EntityMutatorFactory.ts +32 -7
  145. package/src/EntitySecondaryCacheLoader.ts +5 -7
  146. package/src/EntityUpdater.ts +73 -0
  147. package/src/ReadonlyEntity.ts +121 -7
  148. package/src/ViewerScopedEntityLoaderFactory.ts +9 -2
  149. package/src/ViewerScopedEntityMutatorFactory.ts +29 -4
  150. package/src/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.ts +323 -0
  151. package/src/__tests__/{EntityLoader-constructor-test.ts → AuthorizationResultBasedEntityLoader-constructor-test.ts} +16 -9
  152. package/src/__tests__/AuthorizationResultBasedEntityLoader-test.ts +730 -0
  153. package/src/__tests__/EnforcingEntityAssociationLoader-test.ts +253 -0
  154. package/src/__tests__/Entity-test.ts +77 -5
  155. package/src/__tests__/EntityAssociationLoader-test.ts +15 -260
  156. package/src/__tests__/EntityCommonUseCases-test.ts +24 -15
  157. package/src/__tests__/EntityEdges-test.ts +44 -64
  158. package/src/__tests__/EntityLoader-test.ts +29 -681
  159. package/src/__tests__/EntityMutator-MutationCacheConsistency-test.ts +8 -9
  160. package/src/__tests__/EntityMutator-test.ts +116 -103
  161. package/src/__tests__/EntitySecondaryCacheLoader-test.ts +7 -7
  162. package/src/__tests__/EntitySelfReferentialEdges-test.ts +65 -81
  163. package/src/__tests__/ReadonlyEntity-test.ts +47 -7
  164. package/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.ts +15 -15
  165. package/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.ts +19 -22
  166. package/src/index.ts +19 -11
  167. package/src/internal/__tests__/EntityDataManager-test.ts +25 -25
  168. package/src/utils/EntityPrivacyUtils.ts +10 -13
  169. package/src/utils/__tests__/EntityPrivacyUtils-test.ts +21 -23
  170. package/src/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.ts +5 -5
  171. package/src/utils/testing/StubQueryContextProvider.ts +1 -3
  172. package/src/utils/testing/createUnitTestEntityCompanionProvider.ts +3 -1
  173. package/build/EntityMutator.js.map +0 -1
  174. package/build/__tests__/EntityLoader-constructor-test.js.map +0 -1
  175. /package/build/__tests__/{EntityLoader-constructor-test.d.ts → AuthorizationResultBasedEntityLoader-constructor-test.d.ts} +0 -0
@@ -1,3 +1,4 @@
1
+ import { AuthorizationResultBasedCreateMutator, AuthorizationResultBasedUpdateMutator, AuthorizationResultBasedDeleteMutator } from './AuthorizationResultBasedEntityMutator';
1
2
  import Entity, { IEntityClass } from './Entity';
2
3
  import EntityCompanionProvider from './EntityCompanionProvider';
3
4
  import EntityConfiguration from './EntityConfiguration';
@@ -5,7 +6,6 @@ import EntityDatabaseAdapter from './EntityDatabaseAdapter';
5
6
  import EntityLoaderFactory from './EntityLoaderFactory';
6
7
  import EntityMutationTriggerConfiguration from './EntityMutationTriggerConfiguration';
7
8
  import EntityMutationValidator from './EntityMutationValidator';
8
- import { CreateMutator, UpdateMutator, DeleteMutator } from './EntityMutator';
9
9
  import EntityPrivacyPolicy from './EntityPrivacyPolicy';
10
10
  import { EntityQueryContext } from './EntityQueryContext';
11
11
  import ViewerContext from './ViewerContext';
@@ -30,18 +30,18 @@ export default class EntityMutatorFactory<TFields extends object, TID extends No
30
30
  * @param queryContext - query context in which to perform the create
31
31
  * @returns mutator for creating an entity
32
32
  */
33
- forCreate(viewerContext: TViewerContext, queryContext: EntityQueryContext): CreateMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
33
+ forCreate(viewerContext: TViewerContext, queryContext: EntityQueryContext): AuthorizationResultBasedCreateMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
34
34
  /**
35
35
  * Vend mutator for updating an existing entity in given query context.
36
36
  * @param existingEntity - entity to update
37
37
  * @param queryContext - query context in which to perform the update
38
38
  * @returns mutator for updating existingEntity
39
39
  */
40
- forUpdate(existingEntity: TEntity, queryContext: EntityQueryContext): UpdateMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
40
+ forUpdate(existingEntity: TEntity, queryContext: EntityQueryContext): AuthorizationResultBasedUpdateMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
41
41
  /**
42
42
  * Delete an existing entity in given query context.
43
43
  * @param existingEntity - entity to delete
44
44
  * @param queryContext - query context in which to perform the delete
45
45
  */
46
- forDelete(existingEntity: TEntity, queryContext: EntityQueryContext): DeleteMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
46
+ forDelete(existingEntity: TEntity, queryContext: EntityQueryContext): AuthorizationResultBasedDeleteMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
47
47
  }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- const EntityMutator_1 = require("./EntityMutator");
3
+ const AuthorizationResultBasedEntityMutator_1 = require("./AuthorizationResultBasedEntityMutator");
4
4
  /**
5
5
  * The primary interface for creating, mutating, and deleting entities.
6
6
  */
@@ -32,7 +32,7 @@ class EntityMutatorFactory {
32
32
  * @returns mutator for creating an entity
33
33
  */
34
34
  forCreate(viewerContext, queryContext) {
35
- return new EntityMutator_1.CreateMutator(this.entityCompanionProvider, viewerContext, queryContext, this.entityConfiguration, this.entityClass, this.privacyPolicy, this.mutationValidators, this.mutationTriggers, this.entityLoaderFactory, this.databaseAdapter, this.metricsAdapter);
35
+ return new AuthorizationResultBasedEntityMutator_1.AuthorizationResultBasedCreateMutator(this.entityCompanionProvider, viewerContext, queryContext, this.entityConfiguration, this.entityClass, this.privacyPolicy, this.mutationValidators, this.mutationTriggers, this.entityLoaderFactory, this.databaseAdapter, this.metricsAdapter);
36
36
  }
37
37
  /**
38
38
  * Vend mutator for updating an existing entity in given query context.
@@ -41,7 +41,7 @@ class EntityMutatorFactory {
41
41
  * @returns mutator for updating existingEntity
42
42
  */
43
43
  forUpdate(existingEntity, queryContext) {
44
- return new EntityMutator_1.UpdateMutator(this.entityCompanionProvider, existingEntity.getViewerContext(), queryContext, this.entityConfiguration, this.entityClass, this.privacyPolicy, this.mutationValidators, this.mutationTriggers, this.entityLoaderFactory, this.databaseAdapter, this.metricsAdapter, existingEntity);
44
+ return new AuthorizationResultBasedEntityMutator_1.AuthorizationResultBasedUpdateMutator(this.entityCompanionProvider, existingEntity.getViewerContext(), queryContext, this.entityConfiguration, this.entityClass, this.privacyPolicy, this.mutationValidators, this.mutationTriggers, this.entityLoaderFactory, this.databaseAdapter, this.metricsAdapter, existingEntity);
45
45
  }
46
46
  /**
47
47
  * Delete an existing entity in given query context.
@@ -49,7 +49,7 @@ class EntityMutatorFactory {
49
49
  * @param queryContext - query context in which to perform the delete
50
50
  */
51
51
  forDelete(existingEntity, queryContext) {
52
- return new EntityMutator_1.DeleteMutator(this.entityCompanionProvider, existingEntity.getViewerContext(), queryContext, this.entityConfiguration, this.entityClass, this.privacyPolicy, this.mutationValidators, this.mutationTriggers, this.entityLoaderFactory, this.databaseAdapter, this.metricsAdapter, existingEntity);
52
+ return new AuthorizationResultBasedEntityMutator_1.AuthorizationResultBasedDeleteMutator(this.entityCompanionProvider, existingEntity.getViewerContext(), queryContext, this.entityConfiguration, this.entityClass, this.privacyPolicy, this.mutationValidators, this.mutationTriggers, this.entityLoaderFactory, this.databaseAdapter, this.metricsAdapter, existingEntity);
53
53
  }
54
54
  }
55
55
  exports.default = EntityMutatorFactory;
@@ -1 +1 @@
1
- {"version":3,"file":"EntityMutatorFactory.js","sourceRoot":"","sources":["../src/EntityMutatorFactory.ts"],"names":[],"mappings":";;AAOA,mDAA8E;AAM9E;;GAEG;AACH,MAAqB,oBAAoB;IAepB;IACA;IACA;IAQA;IACA;IAOA;IAOA;IAQA;IACA;IAnCnB,YACmB,uBAAgD,EAChD,mBAAiD,EACjD,WAOhB,EACgB,aAA6B,EAC7B,kBAMd,EACc,gBAMhB,EACgB,mBAOhB,EACgB,eAA+C,EAC/C,cAAqC;QAlCrC,4BAAuB,GAAvB,uBAAuB,CAAyB;QAChD,wBAAmB,GAAnB,mBAAmB,CAA8B;QACjD,gBAAW,GAAX,WAAW,CAO3B;QACgB,kBAAa,GAAb,aAAa,CAAgB;QAC7B,uBAAkB,GAAlB,kBAAkB,CAMhC;QACc,qBAAgB,GAAhB,gBAAgB,CAMhC;QACgB,wBAAmB,GAAnB,mBAAmB,CAOnC;QACgB,oBAAe,GAAf,eAAe,CAAgC;QAC/C,mBAAc,GAAd,cAAc,CAAuB;IACrD,CAAC;IAEJ;;;;;OAKG;IACH,SAAS,CACP,aAA6B,EAC7B,YAAgC;QAEhC,OAAO,IAAI,6BAAa,CACtB,IAAI,CAAC,uBAAuB,EAC5B,aAAa,EACb,YAAY,EACZ,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,kBAAkB,EACvB,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,cAAc,CACpB,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,SAAS,CACP,cAAuB,EACvB,YAAgC;QAEhC,OAAO,IAAI,6BAAa,CACtB,IAAI,CAAC,uBAAuB,EAC5B,cAAc,CAAC,gBAAgB,EAAE,EACjC,YAAY,EACZ,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,kBAAkB,EACvB,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,cAAc,EACnB,cAAc,CACf,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,SAAS,CACP,cAAuB,EACvB,YAAgC;QAEhC,OAAO,IAAI,6BAAa,CACtB,IAAI,CAAC,uBAAuB,EAC5B,cAAc,CAAC,gBAAgB,EAAE,EACjC,YAAY,EACZ,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,kBAAkB,EACvB,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,cAAc,EACnB,cAAc,CACf,CAAC;IACJ,CAAC;CACF;AA/HD,uCA+HC"}
1
+ {"version":3,"file":"EntityMutatorFactory.js","sourceRoot":"","sources":["../src/EntityMutatorFactory.ts"],"names":[],"mappings":";;AAAA,mGAIiD;AAajD;;GAEG;AACH,MAAqB,oBAAoB;IAepB;IACA;IACA;IAQA;IACA;IAOA;IAOA;IAQA;IACA;IAnCnB,YACmB,uBAAgD,EAChD,mBAAiD,EACjD,WAOhB,EACgB,aAA6B,EAC7B,kBAMd,EACc,gBAMhB,EACgB,mBAOhB,EACgB,eAA+C,EAC/C,cAAqC;QAlCrC,4BAAuB,GAAvB,uBAAuB,CAAyB;QAChD,wBAAmB,GAAnB,mBAAmB,CAA8B;QACjD,gBAAW,GAAX,WAAW,CAO3B;QACgB,kBAAa,GAAb,aAAa,CAAgB;QAC7B,uBAAkB,GAAlB,kBAAkB,CAMhC;QACc,qBAAgB,GAAhB,gBAAgB,CAMhC;QACgB,wBAAmB,GAAnB,mBAAmB,CAOnC;QACgB,oBAAe,GAAf,eAAe,CAAgC;QAC/C,mBAAc,GAAd,cAAc,CAAuB;IACrD,CAAC;IAEJ;;;;;OAKG;IACH,SAAS,CACP,aAA6B,EAC7B,YAAgC;QAShC,OAAO,IAAI,6EAAqC,CAC9C,IAAI,CAAC,uBAAuB,EAC5B,aAAa,EACb,YAAY,EACZ,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,kBAAkB,EACvB,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,cAAc,CACpB,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,SAAS,CACP,cAAuB,EACvB,YAAgC;QAShC,OAAO,IAAI,6EAAqC,CAC9C,IAAI,CAAC,uBAAuB,EAC5B,cAAc,CAAC,gBAAgB,EAAE,EACjC,YAAY,EACZ,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,kBAAkB,EACvB,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,cAAc,EACnB,cAAc,CACf,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,SAAS,CACP,cAAuB,EACvB,YAAgC;QAShC,OAAO,IAAI,6EAAqC,CAC9C,IAAI,CAAC,uBAAuB,EAC5B,cAAc,CAAC,gBAAgB,EAAE,EACjC,YAAY,EACZ,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,kBAAkB,EACvB,IAAI,CAAC,gBAAgB,EACrB,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,cAAc,EACnB,cAAc,CACf,CAAC;IACJ,CAAC;CACF;AApJD,uCAoJC"}
@@ -1,5 +1,5 @@
1
1
  import { Result } from '@expo/results';
2
- import EntityLoader from './EntityLoader';
2
+ import AuthorizationResultBasedEntityLoader from './AuthorizationResultBasedEntityLoader';
3
3
  import EntityPrivacyPolicy from './EntityPrivacyPolicy';
4
4
  import ReadonlyEntity from './ReadonlyEntity';
5
5
  import ViewerContext from './ViewerContext';
@@ -35,8 +35,8 @@ export interface ISecondaryEntityCache<TFields, TLoadParams> {
35
35
  */
36
36
  export default abstract class EntitySecondaryCacheLoader<TLoadParams, TFields extends object, TID extends NonNullable<TFields[TSelectedFields]>, TViewerContext extends ViewerContext, TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>, TPrivacyPolicy extends EntityPrivacyPolicy<TFields, TID, TViewerContext, TEntity, TSelectedFields>, TSelectedFields extends keyof TFields = keyof TFields> {
37
37
  private readonly secondaryEntityCache;
38
- protected readonly entityLoader: EntityLoader<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
39
- constructor(secondaryEntityCache: ISecondaryEntityCache<TFields, TLoadParams>, entityLoader: EntityLoader<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>);
38
+ protected readonly entityLoader: AuthorizationResultBasedEntityLoader<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
39
+ constructor(secondaryEntityCache: ISecondaryEntityCache<TFields, TLoadParams>, entityLoader: AuthorizationResultBasedEntityLoader<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>);
40
40
  /**
41
41
  * Load many by load params objects
42
42
  *
@@ -27,9 +27,7 @@ class EntitySecondaryCacheLoader {
27
27
  async loadManyAsync(loadParamsArray) {
28
28
  const loadParamsToFieldObjects = await this.secondaryEntityCache.loadManyThroughAsync(loadParamsArray, this.fetchObjectsFromDatabaseAsync.bind(this));
29
29
  // convert value to and from array to reuse complex code
30
- const entitiesMap = await this.entityLoader
31
- .utils()
32
- .constructAndAuthorizeEntitiesAsync((0, maps_1.mapMap)(loadParamsToFieldObjects, (fieldObject) => (fieldObject ? [fieldObject] : [])));
30
+ const entitiesMap = await this.entityLoader.utils.constructAndAuthorizeEntitiesAsync((0, maps_1.mapMap)(loadParamsToFieldObjects, (fieldObject) => (fieldObject ? [fieldObject] : [])));
33
31
  return (0, maps_1.mapMap)(entitiesMap, (fieldObjects) => fieldObjects[0] ?? null);
34
32
  }
35
33
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"EntitySecondaryCacheLoader.js","sourceRoot":"","sources":["../src/EntitySecondaryCacheLoader.ts"],"names":[],"mappings":";;AAMA,mDAAkD;AA4BlD;;;;;;;;;;GAUG;AACH,MAA8B,0BAA0B;IAgBnC;IACE;IAFrB,YACmB,oBAAiE,EAC/D,YAOlB;QARgB,yBAAoB,GAApB,oBAAoB,CAA6C;QAC/D,iBAAY,GAAZ,YAAY,CAO9B;IACA,CAAC;IAEJ;;;;OAIG;IACI,KAAK,CAAC,aAAa,CACxB,eAAiD;QAEjD,MAAM,wBAAwB,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,oBAAoB,CACnF,eAAe,EACf,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,CAC9C,CAAC;QAEF,wDAAwD;QACxD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,YAAY;aACxC,KAAK,EAAE;aACP,kCAAkC,CACjC,IAAA,aAAM,EAAC,wBAAwB,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CACtF,CAAC;QACJ,OAAO,IAAA,aAAM,EAAC,WAAW,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IACxE,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,mBAAmB,CAC9B,eAAiD;QAEjD,MAAM,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACvE,CAAC;CAUF;AApED,6CAoEC"}
1
+ {"version":3,"file":"EntitySecondaryCacheLoader.js","sourceRoot":"","sources":["../src/EntitySecondaryCacheLoader.ts"],"names":[],"mappings":";;AAMA,mDAAkD;AA4BlD;;;;;;;;;;GAUG;AACH,MAA8B,0BAA0B;IAgBnC;IACE;IAFrB,YACmB,oBAAiE,EAC/D,YAOlB;QARgB,yBAAoB,GAApB,oBAAoB,CAA6C;QAC/D,iBAAY,GAAZ,YAAY,CAO9B;IACA,CAAC;IAEJ;;;;OAIG;IACI,KAAK,CAAC,aAAa,CACxB,eAAiD;QAEjD,MAAM,wBAAwB,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,oBAAoB,CACnF,eAAe,EACf,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,CAC9C,CAAC;QAEF,wDAAwD;QACxD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,kCAAkC,CAClF,IAAA,aAAM,EAAC,wBAAwB,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CACtF,CAAC;QACF,OAAO,IAAA,aAAM,EAAC,WAAW,EAAE,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;IACxE,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,mBAAmB,CAC9B,eAAiD;QAEjD,MAAM,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;IACvE,CAAC;CAUF;AAlED,6CAkEC"}
@@ -0,0 +1,27 @@
1
+ import { AuthorizationResultBasedUpdateMutator } from './AuthorizationResultBasedEntityMutator';
2
+ import EnforcingEntityUpdater from './EnforcingEntityUpdater';
3
+ import { IEntityClass } from './Entity';
4
+ import EntityPrivacyPolicy from './EntityPrivacyPolicy';
5
+ import { EntityQueryContext } from './EntityQueryContext';
6
+ import ReadonlyEntity from './ReadonlyEntity';
7
+ import ViewerContext from './ViewerContext';
8
+ /**
9
+ * The primary interface for updating entities.
10
+ */
11
+ export default class EntityUpdater<TFields extends object, TID extends NonNullable<TFields[TSelectedFields]>, TViewerContext extends ViewerContext, TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>, TPrivacyPolicy extends EntityPrivacyPolicy<TFields, TID, TViewerContext, TEntity, TSelectedFields>, TSelectedFields extends keyof TFields> {
12
+ private readonly existingEntity;
13
+ private readonly queryContext;
14
+ private readonly entityClass;
15
+ constructor(existingEntity: TEntity, queryContext: EntityQueryContext, entityClass: IEntityClass<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>);
16
+ /**
17
+ * Enforcing entity updater. All updates through this updater are
18
+ * guaranteed to be successful and will throw otherwise.
19
+ */
20
+ enforcing(): EnforcingEntityUpdater<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
21
+ /**
22
+ * Authorization-result-based entity updater. All updates through this
23
+ * updater are results, where an unsuccessful result means an authorization
24
+ * error or entity construction error occurred. Other errors are thrown.
25
+ */
26
+ withAuthorizationResults(): AuthorizationResultBasedUpdateMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
27
+ }
@@ -0,0 +1,40 @@
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 EnforcingEntityUpdater_1 = __importDefault(require("./EnforcingEntityUpdater"));
7
+ /**
8
+ * The primary interface for updating entities.
9
+ */
10
+ class EntityUpdater {
11
+ existingEntity;
12
+ queryContext;
13
+ entityClass;
14
+ constructor(existingEntity, queryContext, entityClass) {
15
+ this.existingEntity = existingEntity;
16
+ this.queryContext = queryContext;
17
+ this.entityClass = entityClass;
18
+ }
19
+ /**
20
+ * Enforcing entity updater. All updates through this updater are
21
+ * guaranteed to be successful and will throw otherwise.
22
+ */
23
+ enforcing() {
24
+ return new EnforcingEntityUpdater_1.default(this.withAuthorizationResults());
25
+ }
26
+ /**
27
+ * Authorization-result-based entity updater. All updates through this
28
+ * updater are results, where an unsuccessful result means an authorization
29
+ * error or entity construction error occurred. Other errors are thrown.
30
+ */
31
+ withAuthorizationResults() {
32
+ return this.existingEntity
33
+ .getViewerContext()
34
+ .getViewerScopedEntityCompanionForClass(this.entityClass)
35
+ .getMutatorFactory()
36
+ .forUpdate(this.existingEntity, this.queryContext);
37
+ }
38
+ }
39
+ exports.default = EntityUpdater;
40
+ //# sourceMappingURL=EntityUpdater.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityUpdater.js","sourceRoot":"","sources":["../src/EntityUpdater.ts"],"names":[],"mappings":";;;;;AACA,sFAA8D;AAO9D;;GAEG;AACH,MAAqB,aAAa;IAeb;IACA;IACA;IAHnB,YACmB,cAAuB,EACvB,YAAgC,EAChC,WAOhB;QATgB,mBAAc,GAAd,cAAc,CAAS;QACvB,iBAAY,GAAZ,YAAY,CAAoB;QAChC,gBAAW,GAAX,WAAW,CAO3B;IACA,CAAC;IAEJ;;;OAGG;IACH,SAAS;QAQP,OAAO,IAAI,gCAAsB,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC,CAAC;IACrE,CAAC;IAED;;;;OAIG;IACH,wBAAwB;QAQtB,OAAO,IAAI,CAAC,cAAc;aACvB,gBAAgB,EAAE;aAClB,sCAAsC,CAAC,IAAI,CAAC,WAAW,CAAC;aACxD,iBAAiB,EAAE;aACnB,SAAS,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IACvD,CAAC;CACF;AA7DD,gCA6DC"}
@@ -1,6 +1,9 @@
1
+ import AuthorizationResultBasedEntityAssociationLoader from './AuthorizationResultBasedEntityAssociationLoader';
2
+ import AuthorizationResultBasedEntityLoader from './AuthorizationResultBasedEntityLoader';
3
+ import EnforcingEntityAssociationLoader from './EnforcingEntityAssociationLoader';
4
+ import EnforcingEntityLoader from './EnforcingEntityLoader';
1
5
  import { IEntityClass } from './Entity';
2
- import EntityAssociationLoader from './EntityAssociationLoader';
3
- import EntityLoader from './EntityLoader';
6
+ import EntityLoaderUtils from './EntityLoaderUtils';
4
7
  import EntityPrivacyPolicy from './EntityPrivacyPolicy';
5
8
  import { EntityQueryContext } from './EntityQueryContext';
6
9
  import ViewerContext from './ViewerContext';
@@ -48,9 +51,13 @@ export default abstract class ReadonlyEntity<TFields extends object, TID extends
48
51
  */
49
52
  getID(): TID;
50
53
  /**
51
- * @returns EntityAssociationLoader for this entity
54
+ * @returns EnforcingEntityAssociationLoader for this entity
52
55
  */
53
- associationLoader(): EntityAssociationLoader<TFields, TID, TViewerContext, this, TSelectedFields>;
56
+ associationLoader(queryContext?: EntityQueryContext): EnforcingEntityAssociationLoader<TFields, TID, TViewerContext, this, TSelectedFields>;
57
+ /**
58
+ * @returns AuthorizationResultBasedEntityAssociationLoader for this entity
59
+ */
60
+ associationLoaderWithAuthorizationResults(queryContext?: EntityQueryContext): AuthorizationResultBasedEntityAssociationLoader<TFields, TID, TViewerContext, this, TSelectedFields>;
54
61
  /**
55
62
  * Get a underlying field from this entity's data
56
63
  * @param fieldName - the field to get
@@ -70,5 +77,17 @@ export default abstract class ReadonlyEntity<TFields extends object, TID extends
70
77
  * @param viewerContext - viewer context of loading user
71
78
  * @param queryContext - query context in which to perform the load
72
79
  */
73
- static loader<TMFields extends object, TMID extends NonNullable<TMFields[TMSelectedFields]>, TMViewerContext extends ViewerContext, TMViewerContext2 extends TMViewerContext, TMEntity extends ReadonlyEntity<TMFields, TMID, TMViewerContext, TMSelectedFields>, TMPrivacyPolicy extends EntityPrivacyPolicy<TMFields, TMID, TMViewerContext, TMEntity, TMSelectedFields>, TMSelectedFields extends keyof TMFields = keyof TMFields>(this: IEntityClass<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields>, viewerContext: TMViewerContext2, queryContext?: EntityQueryContext): EntityLoader<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields>;
80
+ static loader<TMFields extends object, TMID extends NonNullable<TMFields[TMSelectedFields]>, TMViewerContext extends ViewerContext, TMViewerContext2 extends TMViewerContext, TMEntity extends ReadonlyEntity<TMFields, TMID, TMViewerContext, TMSelectedFields>, TMPrivacyPolicy extends EntityPrivacyPolicy<TMFields, TMID, TMViewerContext, TMEntity, TMSelectedFields>, TMSelectedFields extends keyof TMFields = keyof TMFields>(this: IEntityClass<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields>, viewerContext: TMViewerContext2, queryContext?: EntityQueryContext): EnforcingEntityLoader<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields>;
81
+ /**
82
+ * Vend loader for loading an entity in a given query context.
83
+ * @param viewerContext - viewer context of loading user
84
+ * @param queryContext - query context in which to perform the load
85
+ */
86
+ static loaderWithAuthorizationResults<TMFields extends object, TMID extends NonNullable<TMFields[TMSelectedFields]>, TMViewerContext extends ViewerContext, TMViewerContext2 extends TMViewerContext, TMEntity extends ReadonlyEntity<TMFields, TMID, TMViewerContext, TMSelectedFields>, TMPrivacyPolicy extends EntityPrivacyPolicy<TMFields, TMID, TMViewerContext, TMEntity, TMSelectedFields>, TMSelectedFields extends keyof TMFields = keyof TMFields>(this: IEntityClass<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields>, viewerContext: TMViewerContext2, queryContext?: EntityQueryContext): AuthorizationResultBasedEntityLoader<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields>;
87
+ /**
88
+ * Vend loader for loading an entity in a given query context.
89
+ * @param viewerContext - viewer context of loading user
90
+ * @param queryContext - query context in which to perform the load
91
+ */
92
+ static loaderUtils<TMFields extends object, TMID extends NonNullable<TMFields[TMSelectedFields]>, TMViewerContext extends ViewerContext, TMViewerContext2 extends TMViewerContext, TMEntity extends ReadonlyEntity<TMFields, TMID, TMViewerContext, TMSelectedFields>, TMPrivacyPolicy extends EntityPrivacyPolicy<TMFields, TMID, TMViewerContext, TMEntity, TMSelectedFields>, TMSelectedFields extends keyof TMFields = keyof TMFields>(this: IEntityClass<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields>, viewerContext: TMViewerContext2, queryContext?: EntityQueryContext): EntityLoaderUtils<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields>;
74
93
  }
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const invariant_1 = __importDefault(require("invariant"));
7
7
  const EntityAssociationLoader_1 = __importDefault(require("./EntityAssociationLoader"));
8
+ const EntityLoader_1 = __importDefault(require("./EntityLoader"));
8
9
  /**
9
10
  * A readonly entity exposes only the read functionality of an Entity. Used as the base
10
11
  * type for most entity operations excluding mutations.
@@ -58,10 +59,16 @@ class ReadonlyEntity {
58
59
  return this.id;
59
60
  }
60
61
  /**
61
- * @returns EntityAssociationLoader for this entity
62
+ * @returns EnforcingEntityAssociationLoader for this entity
62
63
  */
63
- associationLoader() {
64
- return new EntityAssociationLoader_1.default(this);
64
+ associationLoader(queryContext) {
65
+ return new EntityAssociationLoader_1.default(this, queryContext).enforcing();
66
+ }
67
+ /**
68
+ * @returns AuthorizationResultBasedEntityAssociationLoader for this entity
69
+ */
70
+ associationLoaderWithAuthorizationResults(queryContext) {
71
+ return new EntityAssociationLoader_1.default(this, queryContext).withAuthorizationResults();
65
72
  }
66
73
  /**
67
74
  * Get a underlying field from this entity's data
@@ -92,10 +99,29 @@ class ReadonlyEntity {
92
99
  .getViewerScopedEntityCompanionForClass(this)
93
100
  .getQueryContextProvider()
94
101
  .getQueryContext()) {
95
- return viewerContext
96
- .getViewerScopedEntityCompanionForClass(this)
97
- .getLoaderFactory()
98
- .forLoad(queryContext, { previousValue: null, cascadingDeleteCause: null });
102
+ return new EntityLoader_1.default(viewerContext, queryContext, this).enforcing();
103
+ }
104
+ /**
105
+ * Vend loader for loading an entity in a given query context.
106
+ * @param viewerContext - viewer context of loading user
107
+ * @param queryContext - query context in which to perform the load
108
+ */
109
+ static loaderWithAuthorizationResults(viewerContext, queryContext = viewerContext
110
+ .getViewerScopedEntityCompanionForClass(this)
111
+ .getQueryContextProvider()
112
+ .getQueryContext()) {
113
+ return new EntityLoader_1.default(viewerContext, queryContext, this).withAuthorizationResults();
114
+ }
115
+ /**
116
+ * Vend loader for loading an entity in a given query context.
117
+ * @param viewerContext - viewer context of loading user
118
+ * @param queryContext - query context in which to perform the load
119
+ */
120
+ static loaderUtils(viewerContext, queryContext = viewerContext
121
+ .getViewerScopedEntityCompanionForClass(this)
122
+ .getQueryContextProvider()
123
+ .getQueryContext()) {
124
+ return new EntityLoader_1.default(viewerContext, queryContext, this).utils();
99
125
  }
100
126
  }
101
127
  exports.default = ReadonlyEntity;
@@ -1 +1 @@
1
- {"version":3,"file":"ReadonlyEntity.js","sourceRoot":"","sources":["../src/ReadonlyEntity.ts"],"names":[],"mappings":";;;;;AAAA,0DAAkC;AAGlC,wFAAgE;AAMhE;;;;;;;GAOG;AACH,MAA8B,cAAc;IAMzB,aAAa,CAAiB;IAC9B,EAAE,CAAM;IACR,cAAc,CAAoB;IAClC,cAAc,CAA2C;IAE1E;;;;;;;;;;;;;OAaG;IACH,YAAY,EACV,aAAa,EACb,EAAE,EACF,cAAc,EACd,cAAc,GAMf;QACC,IAAA,mBAAS,EAAC,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,SAAS,EAAE,qBAAqB,CAAC,CAAC;QAElE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED,QAAQ;QACN,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC;IACrD,CAAC;IAED,mBAAmB;QACjB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,iBAAiB;QAOf,OAAO,IAAI,iCAAuB,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACH,QAAQ,CACN,SAAY;QAEZ,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,OAAO,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAuBX,aAA+B,EAC/B,eAAmC,aAAa;SAC7C,sCAAsC,CAAC,IAAI,CAAC;SAC5C,uBAAuB,EAAE;SACzB,eAAe,EAAE;QAEpB,OAAO,aAAa;aACjB,sCAAsC,CAAC,IAAI,CAAC;aAC5C,gBAAgB,EAAE;aAClB,OAAO,CAAC,YAAY,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,CAAC;IAChF,CAAC;CACF;AA/ID,iCA+IC"}
1
+ {"version":3,"file":"ReadonlyEntity.js","sourceRoot":"","sources":["../src/ReadonlyEntity.ts"],"names":[],"mappings":";;;;;AAAA,0DAAkC;AAOlC,wFAAgE;AAChE,kEAA0C;AAM1C;;;;;;;GAOG;AACH,MAA8B,cAAc;IAMzB,aAAa,CAAiB;IAC9B,EAAE,CAAM;IACR,cAAc,CAAoB;IAClC,cAAc,CAA2C;IAE1E;;;;;;;;;;;;;OAaG;IACH,YAAY,EACV,aAAa,EACb,EAAE,EACF,cAAc,EACd,cAAc,GAMf;QACC,IAAA,mBAAS,EAAC,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,SAAS,EAAE,qBAAqB,CAAC,CAAC;QAElE,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;IACvC,CAAC;IAED,QAAQ;QACN,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC;IACrD,CAAC;IAED,mBAAmB;QACjB,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,iBAAiB,CACf,YAAiC;QAEjC,OAAO,IAAI,iCAAuB,CAChC,IAAI,EACJ,YAAY,CACb,CAAC,SAAS,EAAE,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,yCAAyC,CACvC,YAAiC;QAQjC,OAAO,IAAI,iCAAuB,CAChC,IAAI,EACJ,YAAY,CACb,CAAC,wBAAwB,EAAE,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACH,QAAQ,CACN,SAAY;QAEZ,OAAO,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,YAAY;QACV,OAAO,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,oBAAoB;QAClB,OAAO,EAAE,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAuBX,aAA+B,EAC/B,eAAmC,aAAa;SAC7C,sCAAsC,CAAC,IAAI,CAAC;SAC5C,uBAAuB,EAAE;SACzB,eAAe,EAAE;QASpB,OAAO,IAAI,sBAAY,CAAC,aAAa,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;IACzE,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,8BAA8B,CAuBnC,aAA+B,EAC/B,eAAmC,aAAa;SAC7C,sCAAsC,CAAC,IAAI,CAAC;SAC5C,uBAAuB,EAAE;SACzB,eAAe,EAAE;QASpB,OAAO,IAAI,sBAAY,CAAC,aAAa,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC,wBAAwB,EAAE,CAAC;IACxF,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,WAAW,CAuBhB,aAA+B,EAC/B,eAAmC,aAAa;SAC7C,sCAAsC,CAAC,IAAI,CAAC;SAC5C,uBAAuB,EAAE;SACzB,eAAe,EAAE;QASpB,OAAO,IAAI,sBAAY,CAAC,aAAa,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;IACrE,CAAC;CACF;AA5PD,iCA4PC"}
@@ -1,4 +1,4 @@
1
- import EntityLoader from './EntityLoader';
1
+ import AuthorizationResultBasedEntityLoader from './AuthorizationResultBasedEntityLoader';
2
2
  import EntityLoaderFactory from './EntityLoaderFactory';
3
3
  import EntityPrivacyPolicy, { EntityPrivacyPolicyEvaluationContext } from './EntityPrivacyPolicy';
4
4
  import { EntityQueryContext } from './EntityQueryContext';
@@ -11,5 +11,5 @@ export default class ViewerScopedEntityLoaderFactory<TFields extends object, TID
11
11
  private readonly entityLoaderFactory;
12
12
  private readonly viewerContext;
13
13
  constructor(entityLoaderFactory: EntityLoaderFactory<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>, viewerContext: TViewerContext);
14
- forLoad(queryContext: EntityQueryContext, privacyPolicyEvaluationContext: EntityPrivacyPolicyEvaluationContext<TFields, TID, TViewerContext, TEntity, TSelectedFields>): EntityLoader<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
14
+ forLoad(queryContext: EntityQueryContext, privacyPolicyEvaluationContext: EntityPrivacyPolicyEvaluationContext<TFields, TID, TViewerContext, TEntity, TSelectedFields>): AuthorizationResultBasedEntityLoader<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
15
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ViewerScopedEntityLoaderFactory.js","sourceRoot":"","sources":["../src/ViewerScopedEntityLoaderFactory.ts"],"names":[],"mappings":";;AAOA;;GAEG;AACH,MAAqB,+BAA+B;IAe/B;IAQA;IATnB,YACmB,mBAOhB,EACgB,aAA6B;QAR7B,wBAAmB,GAAnB,mBAAmB,CAOnC;QACgB,kBAAa,GAAb,aAAa,CAAgB;IAC7C,CAAC;IAEJ,OAAO,CACL,YAAgC,EAChC,8BAMC;QAED,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CACrC,IAAI,CAAC,aAAa,EAClB,YAAY,EACZ,8BAA8B,CAC/B,CAAC;IACJ,CAAC;CACF;AA1CD,kDA0CC"}
1
+ {"version":3,"file":"ViewerScopedEntityLoaderFactory.js","sourceRoot":"","sources":["../src/ViewerScopedEntityLoaderFactory.ts"],"names":[],"mappings":";;AAOA;;GAEG;AACH,MAAqB,+BAA+B;IAe/B;IAQA;IATnB,YACmB,mBAOhB,EACgB,aAA6B;QAR7B,wBAAmB,GAAnB,mBAAmB,CAOnC;QACgB,kBAAa,GAAb,aAAa,CAAgB;IAC7C,CAAC;IAEJ,OAAO,CACL,YAAgC,EAChC,8BAMC;QASD,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CACrC,IAAI,CAAC,aAAa,EAClB,YAAY,EACZ,8BAA8B,CAC/B,CAAC;IACJ,CAAC;CACF;AAjDD,kDAiDC"}
@@ -1,4 +1,4 @@
1
- import { CreateMutator, UpdateMutator, DeleteMutator } from './EntityMutator';
1
+ import { AuthorizationResultBasedCreateMutator, AuthorizationResultBasedUpdateMutator, AuthorizationResultBasedDeleteMutator } from './AuthorizationResultBasedEntityMutator';
2
2
  import EntityMutatorFactory from './EntityMutatorFactory';
3
3
  import EntityPrivacyPolicy from './EntityPrivacyPolicy';
4
4
  import { EntityQueryContext } from './EntityQueryContext';
@@ -11,7 +11,7 @@ export default class ViewerScopedEntityMutatorFactory<TFields extends object, TI
11
11
  private readonly entityMutatorFactory;
12
12
  private readonly viewerContext;
13
13
  constructor(entityMutatorFactory: EntityMutatorFactory<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>, viewerContext: TViewerContext);
14
- forCreate(queryContext: EntityQueryContext): CreateMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
15
- forUpdate(existingEntity: TEntity, queryContext: EntityQueryContext): UpdateMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
16
- forDelete(existingEntity: TEntity, queryContext: EntityQueryContext): DeleteMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
14
+ forCreate(queryContext: EntityQueryContext): AuthorizationResultBasedCreateMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
15
+ forUpdate(existingEntity: TEntity, queryContext: EntityQueryContext): AuthorizationResultBasedUpdateMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
16
+ forDelete(existingEntity: TEntity, queryContext: EntityQueryContext): AuthorizationResultBasedDeleteMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
17
17
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ViewerScopedEntityMutatorFactory.js","sourceRoot":"","sources":["../src/ViewerScopedEntityMutatorFactory.ts"],"names":[],"mappings":";;AAOA;;GAEG;AACH,MAAqB,gCAAgC;IAehC;IAQA;IATnB,YACmB,oBAOhB,EACgB,aAA6B;QAR7B,yBAAoB,GAApB,oBAAoB,CAOpC;QACgB,kBAAa,GAAb,aAAa,CAAgB;IAC7C,CAAC;IAEJ,SAAS,CACP,YAAgC;QAEhC,OAAO,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC/E,CAAC;IAED,SAAS,CACP,cAAuB,EACvB,YAAgC;QAEhC,OAAO,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAC3E,CAAC;IAED,SAAS,CACP,cAAuB,EACvB,YAAgC;QAEhC,OAAO,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAC3E,CAAC;CACF;AA7CD,mDA6CC"}
1
+ {"version":3,"file":"ViewerScopedEntityMutatorFactory.js","sourceRoot":"","sources":["../src/ViewerScopedEntityMutatorFactory.ts"],"names":[],"mappings":";;AAWA;;GAEG;AACH,MAAqB,gCAAgC;IAehC;IAQA;IATnB,YACmB,oBAOhB,EACgB,aAA6B;QAR7B,yBAAoB,GAApB,oBAAoB,CAOpC;QACgB,kBAAa,GAAb,aAAa,CAAgB;IAC7C,CAAC;IAEJ,SAAS,CACP,YAAgC;QAShC,OAAO,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;IAC/E,CAAC;IAED,SAAS,CACP,cAAuB,EACvB,YAAgC;QAShC,OAAO,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAC3E,CAAC;IAED,SAAS,CACP,cAAuB,EACvB,YAAgC;QAShC,OAAO,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAC3E,CAAC;CACF;AAlED,mDAkEC"}
@@ -0,0 +1,242 @@
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 results_1 = require("@expo/results");
7
+ const uuid_1 = require("uuid");
8
+ const AuthorizationResultBasedEntityAssociationLoader_1 = __importDefault(require("../AuthorizationResultBasedEntityAssociationLoader"));
9
+ const entityUtils_1 = require("../entityUtils");
10
+ const TestEntity_1 = __importDefault(require("../testfixtures/TestEntity"));
11
+ const TestEntity2_1 = __importDefault(require("../testfixtures/TestEntity2"));
12
+ const TestViewerContext_1 = __importDefault(require("../testfixtures/TestViewerContext"));
13
+ const createUnitTestEntityCompanionProvider_1 = require("../utils/testing/createUnitTestEntityCompanionProvider");
14
+ describe(AuthorizationResultBasedEntityAssociationLoader_1.default, () => {
15
+ describe('loadAssociatedEntityAsync', () => {
16
+ it('loads associated entities by ID and correctly handles a null value', async () => {
17
+ const companionProvider = (0, createUnitTestEntityCompanionProvider_1.createUnitTestEntityCompanionProvider)();
18
+ const viewerContext = new TestViewerContext_1.default(companionProvider);
19
+ const testOtherEntity = await (0, results_1.enforceAsyncResult)(TestEntity_1.default.creatorWithAuthorizationResults(viewerContext).createAsync());
20
+ const testEntity = await (0, results_1.enforceAsyncResult)(TestEntity_1.default.creatorWithAuthorizationResults(viewerContext)
21
+ .setField('stringField', testOtherEntity.getID())
22
+ .createAsync());
23
+ const loadedOther = await (0, results_1.enforceAsyncResult)(testEntity
24
+ .associationLoaderWithAuthorizationResults()
25
+ .loadAssociatedEntityAsync('stringField', TestEntity_1.default));
26
+ expect(loadedOther.getID()).toEqual(testOtherEntity.getID());
27
+ const loadedOther2 = await (0, results_1.enforceAsyncResult)(testEntity
28
+ .associationLoaderWithAuthorizationResults()
29
+ .loadAssociatedEntityAsync('nullableField', TestEntity_1.default));
30
+ expect(loadedOther2).toBeNull();
31
+ });
32
+ });
33
+ describe('loadManyAssociatedEntitiesAsync', () => {
34
+ it('loads many associated entities referencing this entity', async () => {
35
+ const companionProvider = (0, createUnitTestEntityCompanionProvider_1.createUnitTestEntityCompanionProvider)();
36
+ const viewerContext = new TestViewerContext_1.default(companionProvider);
37
+ const testEntity = await (0, results_1.enforceAsyncResult)(TestEntity_1.default.creatorWithAuthorizationResults(viewerContext).createAsync());
38
+ const testOtherEntity1 = await (0, results_1.enforceAsyncResult)(TestEntity_1.default.creatorWithAuthorizationResults(viewerContext)
39
+ .setField('stringField', testEntity.getID())
40
+ .createAsync());
41
+ const testOtherEntity2 = await (0, results_1.enforceAsyncResult)(TestEntity_1.default.creatorWithAuthorizationResults(viewerContext)
42
+ .setField('stringField', testEntity.getID())
43
+ .createAsync());
44
+ const loaded = await (0, entityUtils_1.enforceResultsAsync)(testEntity
45
+ .associationLoaderWithAuthorizationResults()
46
+ .loadManyAssociatedEntitiesAsync(TestEntity_1.default, 'stringField'));
47
+ expect(loaded).toHaveLength(2);
48
+ expect(loaded.find((e) => e.getID() === testOtherEntity1.getID())).not.toBeUndefined();
49
+ expect(loaded.find((e) => e.getID() === testOtherEntity2.getID())).not.toBeUndefined();
50
+ });
51
+ });
52
+ describe('loadAssociatedEntityByFieldEqualingAsync', () => {
53
+ it('loads associated entity by field equaling', async () => {
54
+ const companionProvider = (0, createUnitTestEntityCompanionProvider_1.createUnitTestEntityCompanionProvider)();
55
+ const viewerContext = new TestViewerContext_1.default(companionProvider);
56
+ const testOtherEntity = await (0, results_1.enforceAsyncResult)(TestEntity_1.default.creatorWithAuthorizationResults(viewerContext).createAsync());
57
+ const testEntity = await (0, results_1.enforceAsyncResult)(TestEntity_1.default.creatorWithAuthorizationResults(viewerContext)
58
+ .setField('stringField', testOtherEntity.getID())
59
+ .createAsync());
60
+ const loadedOtherResult = await testEntity
61
+ .associationLoaderWithAuthorizationResults()
62
+ .loadAssociatedEntityByFieldEqualingAsync('stringField', TestEntity_1.default, 'customIdField');
63
+ expect(loadedOtherResult?.enforceValue().getID()).toEqual(testOtherEntity.getID());
64
+ });
65
+ it('returns null when loading associated entities by field equaling a non existent association', async () => {
66
+ const companionProvider = (0, createUnitTestEntityCompanionProvider_1.createUnitTestEntityCompanionProvider)();
67
+ const viewerContext = new TestViewerContext_1.default(companionProvider);
68
+ const testEntity = await (0, results_1.enforceAsyncResult)(TestEntity_1.default.creatorWithAuthorizationResults(viewerContext)
69
+ .setField('stringField', (0, uuid_1.v4)())
70
+ .createAsync());
71
+ const loadedOtherResult = await testEntity
72
+ .associationLoaderWithAuthorizationResults()
73
+ .loadAssociatedEntityByFieldEqualingAsync('stringField', TestEntity_1.default, 'customIdField');
74
+ expect(loadedOtherResult).toBeNull();
75
+ });
76
+ it('returns null when load-by field is null', async () => {
77
+ const companionProvider = (0, createUnitTestEntityCompanionProvider_1.createUnitTestEntityCompanionProvider)();
78
+ const viewerContext = new TestViewerContext_1.default(companionProvider);
79
+ const testEntity = await (0, results_1.enforceAsyncResult)(TestEntity_1.default.creatorWithAuthorizationResults(viewerContext)
80
+ .setField('stringField', 'blah')
81
+ .createAsync());
82
+ const loadedOtherResult = await testEntity
83
+ .associationLoaderWithAuthorizationResults()
84
+ .loadAssociatedEntityByFieldEqualingAsync('nullableField', TestEntity_1.default, 'customIdField');
85
+ expect(loadedOtherResult).toBeNull();
86
+ });
87
+ });
88
+ describe('loadManyAssociatedEntitiesByFieldEqualingAsync', () => {
89
+ it('loads many associated entities by field equaling', async () => {
90
+ const companionProvider = (0, createUnitTestEntityCompanionProvider_1.createUnitTestEntityCompanionProvider)();
91
+ const viewerContext = new TestViewerContext_1.default(companionProvider);
92
+ const testEntity = await (0, results_1.enforceAsyncResult)(TestEntity_1.default.creatorWithAuthorizationResults(viewerContext).createAsync());
93
+ const testOtherEntity1 = await (0, results_1.enforceAsyncResult)(TestEntity_1.default.creatorWithAuthorizationResults(viewerContext)
94
+ .setField('stringField', testEntity.getID())
95
+ .createAsync());
96
+ const testOtherEntity2 = await (0, results_1.enforceAsyncResult)(TestEntity_1.default.creatorWithAuthorizationResults(viewerContext)
97
+ .setField('stringField', testEntity.getID())
98
+ .createAsync());
99
+ const loaded = await (0, entityUtils_1.enforceResultsAsync)(testEntity
100
+ .associationLoaderWithAuthorizationResults()
101
+ .loadManyAssociatedEntitiesByFieldEqualingAsync('customIdField', TestEntity_1.default, 'stringField'));
102
+ expect(loaded).toHaveLength(2);
103
+ expect(loaded.find((e) => e.getID() === testOtherEntity1.getID())).not.toBeUndefined();
104
+ expect(loaded.find((e) => e.getID() === testOtherEntity2.getID())).not.toBeUndefined();
105
+ });
106
+ it('returns empty results when field being queried by is null', async () => {
107
+ const companionProvider = (0, createUnitTestEntityCompanionProvider_1.createUnitTestEntityCompanionProvider)();
108
+ const viewerContext = new TestViewerContext_1.default(companionProvider);
109
+ const testEntity = await (0, results_1.enforceAsyncResult)(TestEntity_1.default.creatorWithAuthorizationResults(viewerContext).createAsync());
110
+ const loaded = await (0, entityUtils_1.enforceResultsAsync)(testEntity
111
+ .associationLoaderWithAuthorizationResults()
112
+ .loadManyAssociatedEntitiesByFieldEqualingAsync('nullableField', TestEntity_1.default, 'stringField'));
113
+ expect(loaded).toHaveLength(0);
114
+ });
115
+ });
116
+ describe('loadAssociatedEntityThroughAsync', () => {
117
+ it('chain loads associated entities', async () => {
118
+ const companionProvider = (0, createUnitTestEntityCompanionProvider_1.createUnitTestEntityCompanionProvider)();
119
+ const viewerContext = new TestViewerContext_1.default(companionProvider);
120
+ const testEntity4 = await (0, results_1.enforceAsyncResult)(TestEntity_1.default.creatorWithAuthorizationResults(viewerContext).createAsync());
121
+ const testEntity3 = await (0, results_1.enforceAsyncResult)(TestEntity2_1.default.creatorWithAuthorizationResults(viewerContext)
122
+ .setField('foreignKey', testEntity4.getID())
123
+ .createAsync());
124
+ const testEntity2 = await (0, results_1.enforceAsyncResult)(TestEntity_1.default.creatorWithAuthorizationResults(viewerContext)
125
+ .setField('testIndexedField', testEntity3.getID())
126
+ .createAsync());
127
+ const testEntity = await (0, results_1.enforceAsyncResult)(TestEntity2_1.default.creatorWithAuthorizationResults(viewerContext)
128
+ .setField('foreignKey', testEntity2.getID())
129
+ .createAsync());
130
+ const loaded2Result = await testEntity
131
+ .associationLoaderWithAuthorizationResults()
132
+ .loadAssociatedEntityThroughAsync([
133
+ {
134
+ associatedEntityClass: TestEntity_1.default,
135
+ fieldIdentifyingAssociatedEntity: 'foreignKey',
136
+ },
137
+ ]);
138
+ expect(loaded2Result?.enforceValue().getID()).toEqual(testEntity2.getID());
139
+ const loaded3Result = await testEntity
140
+ .associationLoaderWithAuthorizationResults()
141
+ .loadAssociatedEntityThroughAsync([
142
+ {
143
+ associatedEntityClass: TestEntity_1.default,
144
+ fieldIdentifyingAssociatedEntity: 'foreignKey',
145
+ },
146
+ {
147
+ associatedEntityClass: TestEntity2_1.default,
148
+ fieldIdentifyingAssociatedEntity: 'testIndexedField',
149
+ },
150
+ ]);
151
+ expect(loaded3Result?.enforceValue().getID()).toEqual(testEntity3.getID());
152
+ const loaded4Result = await testEntity
153
+ .associationLoaderWithAuthorizationResults()
154
+ .loadAssociatedEntityThroughAsync([
155
+ {
156
+ associatedEntityClass: TestEntity_1.default,
157
+ fieldIdentifyingAssociatedEntity: 'foreignKey',
158
+ },
159
+ {
160
+ associatedEntityClass: TestEntity2_1.default,
161
+ fieldIdentifyingAssociatedEntity: 'testIndexedField',
162
+ },
163
+ {
164
+ associatedEntityClass: TestEntity_1.default,
165
+ fieldIdentifyingAssociatedEntity: 'foreignKey',
166
+ },
167
+ ]);
168
+ expect(loaded4Result?.enforceValue().getID()).toEqual(testEntity4.getID());
169
+ });
170
+ it('fails when chain loading associated entity fails', async () => {
171
+ const companionProvider = (0, createUnitTestEntityCompanionProvider_1.createUnitTestEntityCompanionProvider)();
172
+ const viewerContext = new TestViewerContext_1.default(companionProvider);
173
+ const testEntity = await (0, results_1.enforceAsyncResult)(TestEntity2_1.default.creatorWithAuthorizationResults(viewerContext)
174
+ .setField('foreignKey', (0, uuid_1.v4)())
175
+ .createAsync());
176
+ const loadResult = await testEntity
177
+ .associationLoaderWithAuthorizationResults()
178
+ .loadAssociatedEntityThroughAsync([
179
+ {
180
+ associatedEntityClass: TestEntity_1.default,
181
+ fieldIdentifyingAssociatedEntity: 'foreignKey',
182
+ },
183
+ ]);
184
+ expect(loadResult?.ok).toBe(false);
185
+ });
186
+ it('supports chain loading by field equality', async () => {
187
+ const companionProvider = (0, createUnitTestEntityCompanionProvider_1.createUnitTestEntityCompanionProvider)();
188
+ const viewerContext = new TestViewerContext_1.default(companionProvider);
189
+ const fieldValue = (0, uuid_1.v4)();
190
+ const testEntity2 = await (0, results_1.enforceAsyncResult)(TestEntity_1.default.creatorWithAuthorizationResults(viewerContext)
191
+ .setField('stringField', fieldValue)
192
+ .createAsync());
193
+ const testEntity = await (0, results_1.enforceAsyncResult)(TestEntity2_1.default.creatorWithAuthorizationResults(viewerContext)
194
+ .setField('foreignKey', fieldValue)
195
+ .createAsync());
196
+ const loaded2Result = await testEntity
197
+ .associationLoaderWithAuthorizationResults()
198
+ .loadAssociatedEntityThroughAsync([
199
+ {
200
+ associatedEntityClass: TestEntity_1.default,
201
+ fieldIdentifyingAssociatedEntity: 'foreignKey',
202
+ associatedEntityLookupByField: 'stringField',
203
+ },
204
+ ]);
205
+ expect(loaded2Result?.enforceValue().getID()).toEqual(testEntity2.getID());
206
+ });
207
+ it('returns null when chain loading by field equality returns null', async () => {
208
+ const companionProvider = (0, createUnitTestEntityCompanionProvider_1.createUnitTestEntityCompanionProvider)();
209
+ const viewerContext = new TestViewerContext_1.default(companionProvider);
210
+ const testEntity = await (0, results_1.enforceAsyncResult)(TestEntity2_1.default.creatorWithAuthorizationResults(viewerContext)
211
+ .setField('foreignKey', (0, uuid_1.v4)())
212
+ .createAsync());
213
+ const loaded2Result = await testEntity
214
+ .associationLoaderWithAuthorizationResults()
215
+ .loadAssociatedEntityThroughAsync([
216
+ {
217
+ associatedEntityClass: TestEntity_1.default,
218
+ fieldIdentifyingAssociatedEntity: 'foreignKey',
219
+ associatedEntityLookupByField: 'stringField',
220
+ },
221
+ ]);
222
+ expect(loaded2Result).toBeNull();
223
+ });
224
+ it('returns null when chain loading by field is null', async () => {
225
+ const companionProvider = (0, createUnitTestEntityCompanionProvider_1.createUnitTestEntityCompanionProvider)();
226
+ const viewerContext = new TestViewerContext_1.default(companionProvider);
227
+ const testEntity = await (0, results_1.enforceAsyncResult)(TestEntity_1.default.creatorWithAuthorizationResults(viewerContext)
228
+ .setField('nullableField', null)
229
+ .createAsync());
230
+ const loadedResult = await testEntity
231
+ .associationLoaderWithAuthorizationResults()
232
+ .loadAssociatedEntityThroughAsync([
233
+ {
234
+ associatedEntityClass: TestEntity_1.default,
235
+ fieldIdentifyingAssociatedEntity: 'nullableField',
236
+ },
237
+ ]);
238
+ expect(loadedResult).toBeNull();
239
+ });
240
+ });
241
+ });
242
+ //# sourceMappingURL=AuthorizationResultBasedEntityAssociationLoader-test.js.map