@expo/entity 0.31.1 → 0.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/ComposedEntityCacheAdapter.d.ts +4 -6
- package/build/ComposedEntityCacheAdapter.js +3 -6
- package/build/ComposedEntityCacheAdapter.js.map +1 -1
- package/build/EnforcingEntityLoader.d.ts +1 -1
- package/build/Entity.d.ts +20 -10
- package/build/Entity.js +2 -2
- package/build/Entity.js.map +1 -1
- package/build/EntityAssociationLoader.d.ts +9 -9
- package/build/EntityCompanion.d.ts +6 -5
- package/build/EntityCompanion.js +6 -4
- package/build/EntityCompanion.js.map +1 -1
- package/build/EntityCompanionProvider.d.ts +28 -36
- package/build/EntityCompanionProvider.js +4 -19
- package/build/EntityCompanionProvider.js.map +1 -1
- package/build/EntityConfiguration.d.ts +3 -3
- package/build/EntityConfiguration.js +2 -2
- package/build/EntityConfiguration.js.map +1 -1
- package/build/EntityDatabaseAdapter.d.ts +1 -1
- package/build/EntityDatabaseAdapter.js +1 -1
- package/build/EntityDatabaseAdapter.js.map +1 -1
- package/build/EntityFieldDefinition.d.ts +2 -2
- package/build/EntityFieldDefinition.js +1 -1
- package/build/EntityFieldDefinition.js.map +1 -1
- package/build/EntityLoader.d.ts +4 -2
- package/build/EntityLoader.js +21 -7
- package/build/EntityLoader.js.map +1 -1
- package/build/EntityLoaderFactory.d.ts +4 -7
- package/build/EntityLoaderFactory.js +3 -5
- package/build/EntityLoaderFactory.js.map +1 -1
- package/build/EntityMutationInfo.d.ts +3 -3
- package/build/EntityMutationInfo.js +1 -1
- package/build/EntityMutationInfo.js.map +1 -1
- package/build/EntityMutationTriggerConfiguration.d.ts +3 -3
- package/build/EntityMutationValidator.d.ts +1 -1
- package/build/EntityMutator.d.ts +9 -7
- package/build/EntityMutator.js +21 -21
- package/build/EntityMutator.js.map +1 -1
- package/build/EntityMutatorFactory.d.ts +4 -2
- package/build/EntityMutatorFactory.js +5 -4
- package/build/EntityMutatorFactory.js.map +1 -1
- package/build/EntityPrivacyPolicy.d.ts +3 -3
- package/build/EntityPrivacyPolicy.js +2 -2
- package/build/EntityPrivacyPolicy.js.map +1 -1
- package/build/EntityQueryContext.d.ts +13 -5
- package/build/EntityQueryContext.js +11 -4
- package/build/EntityQueryContext.js.map +1 -1
- package/build/EntityQueryContextProvider.d.ts +3 -3
- package/build/EntityQueryContextProvider.js +2 -2
- package/build/EntityQueryContextProvider.js.map +1 -1
- package/build/EntitySecondaryCacheLoader.d.ts +1 -1
- package/build/EntitySecondaryCacheLoader.js +1 -1
- package/build/EntitySecondaryCacheLoader.js.map +1 -1
- package/build/GenericEntityCacheAdapter.d.ts +14 -0
- package/build/GenericEntityCacheAdapter.js +38 -0
- package/build/GenericEntityCacheAdapter.js.map +1 -0
- package/build/{EntityCacheAdapter.d.ts → IEntityCacheAdapter.d.ts} +5 -8
- package/build/IEntityCacheAdapter.js +3 -0
- package/build/IEntityCacheAdapter.js.map +1 -0
- package/build/IEntityCacheAdapterProvider.d.ts +2 -2
- package/build/IEntityGenericCacher.d.ts +31 -2
- package/build/ReadonlyEntity.d.ts +19 -7
- package/build/ReadonlyEntity.js +15 -13
- package/build/ReadonlyEntity.js.map +1 -1
- package/build/ViewerContext.d.ts +3 -3
- package/build/ViewerContext.js +3 -3
- package/build/ViewerContext.js.map +1 -1
- package/build/ViewerScopedEntityCompanion.d.ts +2 -2
- package/build/ViewerScopedEntityCompanion.js.map +1 -1
- package/build/ViewerScopedEntityCompanionProvider.d.ts +3 -3
- package/build/ViewerScopedEntityCompanionProvider.js +3 -3
- package/build/ViewerScopedEntityCompanionProvider.js.map +1 -1
- package/build/ViewerScopedEntityLoaderFactory.d.ts +1 -1
- package/build/ViewerScopedEntityMutatorFactory.d.ts +1 -1
- package/build/__tests__/ComposedCacheAdapter-test.js +4 -8
- package/build/__tests__/ComposedCacheAdapter-test.js.map +1 -1
- package/build/__tests__/EnforcingEntityLoader-test.js +1 -0
- package/build/__tests__/EnforcingEntityLoader-test.js.map +1 -1
- package/build/__tests__/Entity-test.js +42 -20
- package/build/__tests__/Entity-test.js.map +1 -1
- package/build/__tests__/EntityAssociationLoader-test.js +6 -6
- package/build/__tests__/EntityAssociationLoader-test.js.map +1 -1
- package/build/__tests__/EntityCommonUseCases-test.js +20 -22
- package/build/__tests__/EntityCommonUseCases-test.js.map +1 -1
- package/build/__tests__/EntityCompanion-test.js +2 -1
- package/build/__tests__/EntityCompanion-test.js.map +1 -1
- package/build/__tests__/EntityCompanionProvider-test.js +15 -40
- package/build/__tests__/EntityCompanionProvider-test.js.map +1 -1
- package/build/__tests__/EntityEdges-test.js +48 -54
- package/build/__tests__/EntityEdges-test.js.map +1 -1
- package/build/__tests__/EntityLoader-constructor-test.d.ts +9 -5
- package/build/__tests__/EntityLoader-constructor-test.js +13 -14
- package/build/__tests__/EntityLoader-constructor-test.js.map +1 -1
- package/build/__tests__/EntityLoader-test.js +19 -11
- package/build/__tests__/EntityLoader-test.js.map +1 -1
- package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js +20 -22
- package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +1 -1
- package/build/__tests__/EntityMutator-test.js +67 -14
- package/build/__tests__/EntityMutator-test.js.map +1 -1
- package/build/__tests__/EntityPrivacyPolicy-test.js +82 -29
- package/build/__tests__/EntityPrivacyPolicy-test.js.map +1 -1
- package/build/__tests__/EntityQueryContext-test.js +12 -0
- package/build/__tests__/EntityQueryContext-test.js.map +1 -1
- package/build/__tests__/EntitySecondaryCacheLoader-test.js +1 -2
- package/build/__tests__/EntitySecondaryCacheLoader-test.js.map +1 -1
- package/build/__tests__/EntitySelfReferentialEdges-test.js +16 -20
- package/build/__tests__/EntitySelfReferentialEdges-test.js.map +1 -1
- package/build/__tests__/GenericEntityCacheAdapter-test.d.ts +1 -0
- package/build/__tests__/GenericEntityCacheAdapter-test.js +80 -0
- package/build/__tests__/GenericEntityCacheAdapter-test.js.map +1 -0
- package/build/__tests__/ReadonlyEntity-test.js +79 -13
- package/build/__tests__/ReadonlyEntity-test.js.map +1 -1
- package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js +2 -25
- package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js.map +1 -1
- package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +20 -23
- package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +1 -1
- package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +17 -20
- package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +1 -1
- package/build/errors/EntityError.js +2 -2
- package/build/errors/EntityError.js.map +1 -1
- package/build/errors/EntityInvalidFieldValueError.d.ts +2 -2
- package/build/errors/EntityInvalidFieldValueError.js.map +1 -1
- package/build/errors/EntityNotAuthorizedError.d.ts +2 -2
- package/build/errors/EntityNotAuthorizedError.js +1 -1
- package/build/errors/EntityNotAuthorizedError.js.map +1 -1
- package/build/errors/EntityNotFoundError.d.ts +2 -2
- package/build/errors/EntityNotFoundError.js.map +1 -1
- package/build/index.d.ts +2 -1
- package/build/index.js +3 -3
- package/build/index.js.map +1 -1
- package/build/internal/EntityDataManager.d.ts +1 -1
- package/build/internal/EntityDataManager.js +1 -1
- package/build/internal/EntityDataManager.js.map +1 -1
- package/build/internal/EntityFieldTransformationUtils.d.ts +1 -1
- package/build/internal/EntityFieldTransformationUtils.js +4 -4
- package/build/internal/EntityFieldTransformationUtils.js.map +1 -1
- package/build/internal/EntityTableDataCoordinator.d.ts +3 -3
- package/build/internal/EntityTableDataCoordinator.js.map +1 -1
- package/build/internal/ReadThroughEntityCache.d.ts +3 -3
- package/build/internal/ReadThroughEntityCache.js +1 -1
- package/build/internal/ReadThroughEntityCache.js.map +1 -1
- package/build/internal/__tests__/EntityDataManager-test.js +1 -1
- package/build/internal/__tests__/EntityDataManager-test.js.map +1 -1
- package/build/internal/__tests__/ReadThroughEntityCache-test.js.map +1 -1
- package/build/metrics/EntityMetricsUtils.js.map +1 -1
- package/build/metrics/IEntityMetricsAdapter.js +4 -4
- package/build/metrics/IEntityMetricsAdapter.js.map +1 -1
- package/build/rules/AlwaysAllowPrivacyPolicyRule.d.ts +2 -2
- package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -1
- package/build/rules/AlwaysDenyPrivacyPolicyRule.d.ts +2 -2
- package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -1
- package/build/rules/AlwaysSkipPrivacyPolicyRule.d.ts +2 -2
- package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -1
- package/build/rules/PrivacyPolicyRule.d.ts +1 -1
- package/build/rules/PrivacyPolicyRule.js +1 -1
- package/build/rules/PrivacyPolicyRule.js.map +1 -1
- package/build/testfixtures/DateIDTestEntity.d.ts +2 -3
- package/build/testfixtures/DateIDTestEntity.js +7 -9
- package/build/testfixtures/DateIDTestEntity.js.map +1 -1
- package/build/testfixtures/SimpleTestEntity.d.ts +3 -4
- package/build/testfixtures/SimpleTestEntity.js +7 -9
- package/build/testfixtures/SimpleTestEntity.js.map +1 -1
- package/build/testfixtures/TestEntity.d.ts +2 -3
- package/build/testfixtures/TestEntity.js +14 -10
- package/build/testfixtures/TestEntity.js.map +1 -1
- package/build/testfixtures/TestEntity2.d.ts +2 -3
- package/build/testfixtures/TestEntity2.js +7 -9
- package/build/testfixtures/TestEntity2.js.map +1 -1
- package/build/testfixtures/TestEntityNumberKey.d.ts +2 -3
- package/build/testfixtures/TestEntityNumberKey.js +7 -9
- package/build/testfixtures/TestEntityNumberKey.js.map +1 -1
- package/build/utils/testing/PrivacyPolicyRuleTestUtils.d.ts +4 -4
- package/build/utils/testing/StubCacheAdapter.d.ts +6 -5
- package/build/utils/testing/StubCacheAdapter.js +5 -6
- package/build/utils/testing/StubCacheAdapter.js.map +1 -1
- package/build/utils/testing/StubDatabaseAdapterProvider.js.map +1 -1
- package/build/utils/testing/StubQueryContextProvider.d.ts +2 -1
- package/build/utils/testing/StubQueryContextProvider.js +1 -1
- package/build/utils/testing/StubQueryContextProvider.js.map +1 -1
- package/build/utils/testing/createUnitTestEntityCompanionProvider.js +2 -2
- package/build/utils/testing/createUnitTestEntityCompanionProvider.js.map +1 -1
- package/package.json +3 -3
- package/src/ComposedEntityCacheAdapter.ts +4 -11
- package/src/EnforcingEntityLoader.ts +1 -1
- package/src/Entity.ts +23 -12
- package/src/EntityAssociationLoader.ts +12 -12
- package/src/EntityCompanion.ts +13 -32
- package/src/EntityCompanionProvider.ts +41 -80
- package/src/EntityConfiguration.ts +4 -5
- package/src/EntityFieldDefinition.ts +2 -2
- package/src/EntityLoader.ts +19 -2
- package/src/EntityLoaderFactory.ts +7 -9
- package/src/EntityMutationInfo.ts +2 -2
- package/src/EntityMutationTriggerConfiguration.ts +3 -3
- package/src/EntityMutationValidator.ts +1 -1
- package/src/EntityMutator.ts +38 -31
- package/src/EntityMutatorFactory.ts +6 -1
- package/src/EntityPrivacyPolicy.ts +2 -2
- package/src/EntityQueryContext.ts +24 -4
- package/src/EntityQueryContextProvider.ts +7 -5
- package/src/EntitySecondaryCacheLoader.ts +1 -1
- package/src/GenericEntityCacheAdapter.ts +65 -0
- package/src/{EntityCacheAdapter.ts → IEntityCacheAdapter.ts} +5 -8
- package/src/IEntityCacheAdapterProvider.ts +2 -2
- package/src/IEntityGenericCacher.ts +32 -2
- package/src/ReadonlyEntity.ts +32 -32
- package/src/ViewerContext.ts +10 -8
- package/src/ViewerScopedEntityCompanion.ts +2 -2
- package/src/ViewerScopedEntityCompanionProvider.ts +4 -12
- package/src/ViewerScopedEntityLoaderFactory.ts +1 -1
- package/src/ViewerScopedEntityMutatorFactory.ts +1 -1
- package/src/__tests__/ComposedCacheAdapter-test.ts +6 -11
- package/src/__tests__/EnforcingEntityLoader-test.ts +1 -0
- package/src/__tests__/Entity-test.ts +42 -21
- package/src/__tests__/EntityCommonUseCases-test.ts +20 -22
- package/src/__tests__/EntityCompanion-test.ts +6 -9
- package/src/__tests__/EntityCompanionProvider-test.ts +14 -26
- package/src/__tests__/EntityEdges-test.ts +43 -49
- package/src/__tests__/EntityLoader-constructor-test.ts +16 -12
- package/src/__tests__/EntityLoader-test.ts +9 -0
- package/src/__tests__/EntityMutator-MutationCacheConsistency-test.ts +20 -22
- package/src/__tests__/EntityMutator-test.ts +119 -19
- package/src/__tests__/EntityPrivacyPolicy-test.ts +82 -29
- package/src/__tests__/EntityQueryContext-test.ts +23 -1
- package/src/__tests__/EntitySelfReferentialEdges-test.ts +8 -10
- package/src/__tests__/GenericEntityCacheAdapter-test.ts +102 -0
- package/src/__tests__/ReadonlyEntity-test.ts +79 -13
- package/src/__tests__/ViewerScopedEntityCompanionProvider-test.ts +2 -5
- package/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.ts +30 -24
- package/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.ts +14 -18
- package/src/errors/EntityInvalidFieldValueError.ts +2 -2
- package/src/errors/EntityNotAuthorizedError.ts +2 -2
- package/src/errors/EntityNotFoundError.ts +2 -2
- package/src/index.ts +2 -1
- package/src/internal/EntityDataManager.ts +1 -1
- package/src/internal/EntityTableDataCoordinator.ts +4 -4
- package/src/internal/ReadThroughEntityCache.ts +2 -2
- package/src/internal/__tests__/EntityDataManager-test.ts +2 -1
- package/src/internal/__tests__/ReadThroughEntityCache-test.ts +8 -8
- package/src/metrics/EntityMetricsUtils.ts +1 -1
- package/src/rules/AlwaysAllowPrivacyPolicyRule.ts +2 -2
- package/src/rules/AlwaysDenyPrivacyPolicyRule.ts +2 -2
- package/src/rules/AlwaysSkipPrivacyPolicyRule.ts +2 -2
- package/src/rules/PrivacyPolicyRule.ts +1 -1
- package/src/testfixtures/DateIDTestEntity.ts +6 -8
- package/src/testfixtures/SimpleTestEntity.ts +6 -8
- package/src/testfixtures/TestEntity.ts +19 -15
- package/src/testfixtures/TestEntity2.ts +6 -8
- package/src/testfixtures/TestEntityNumberKey.ts +6 -8
- package/src/utils/testing/PrivacyPolicyRuleTestUtils.ts +4 -4
- package/src/utils/testing/StubCacheAdapter.ts +9 -11
- package/src/utils/testing/StubDatabaseAdapterProvider.ts +1 -1
- package/src/utils/testing/StubQueryContextProvider.ts +4 -3
- package/src/utils/testing/createUnitTestEntityCompanionProvider.ts +3 -3
- package/build/EntityCacheAdapter.js +0 -13
- package/build/EntityCacheAdapter.js.map +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import Entity, { IEntityClass } from './Entity';
|
|
2
|
+
import EntityCompanionProvider from './EntityCompanionProvider';
|
|
2
3
|
import EntityConfiguration from './EntityConfiguration';
|
|
3
4
|
import EntityDatabaseAdapter from './EntityDatabaseAdapter';
|
|
4
5
|
import EntityLoaderFactory from './EntityLoaderFactory';
|
|
@@ -12,7 +13,8 @@ import IEntityMetricsAdapter from './metrics/IEntityMetricsAdapter';
|
|
|
12
13
|
/**
|
|
13
14
|
* The primary interface for creating, mutating, and deleting entities.
|
|
14
15
|
*/
|
|
15
|
-
export default class EntityMutatorFactory<TFields, TID extends NonNullable<TFields[TSelectedFields]>, TViewerContext extends ViewerContext, TEntity extends Entity<TFields, TID, TViewerContext, TSelectedFields>, TPrivacyPolicy extends EntityPrivacyPolicy<TFields, TID, TViewerContext, TEntity, TSelectedFields>, TSelectedFields extends keyof TFields = keyof TFields> {
|
|
16
|
+
export default class EntityMutatorFactory<TFields extends object, TID extends NonNullable<TFields[TSelectedFields]>, TViewerContext extends ViewerContext, TEntity extends Entity<TFields, TID, TViewerContext, TSelectedFields>, TPrivacyPolicy extends EntityPrivacyPolicy<TFields, TID, TViewerContext, TEntity, TSelectedFields>, TSelectedFields extends keyof TFields = keyof TFields> {
|
|
17
|
+
private readonly entityCompanionProvider;
|
|
16
18
|
private readonly entityConfiguration;
|
|
17
19
|
private readonly entityClass;
|
|
18
20
|
private readonly privacyPolicy;
|
|
@@ -21,7 +23,7 @@ export default class EntityMutatorFactory<TFields, TID extends NonNullable<TFiel
|
|
|
21
23
|
private readonly entityLoaderFactory;
|
|
22
24
|
private readonly databaseAdapter;
|
|
23
25
|
private readonly metricsAdapter;
|
|
24
|
-
constructor(entityConfiguration: EntityConfiguration<TFields>, entityClass: IEntityClass<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>, privacyPolicy: TPrivacyPolicy, mutationValidators: EntityMutationValidator<TFields, TID, TViewerContext, TEntity, TSelectedFields>[], mutationTriggers: EntityMutationTriggerConfiguration<TFields, TID, TViewerContext, TEntity, TSelectedFields>, entityLoaderFactory: EntityLoaderFactory<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>, databaseAdapter: EntityDatabaseAdapter<TFields>, metricsAdapter: IEntityMetricsAdapter);
|
|
26
|
+
constructor(entityCompanionProvider: EntityCompanionProvider, entityConfiguration: EntityConfiguration<TFields>, entityClass: IEntityClass<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>, privacyPolicy: TPrivacyPolicy, mutationValidators: EntityMutationValidator<TFields, TID, TViewerContext, TEntity, TSelectedFields>[], mutationTriggers: EntityMutationTriggerConfiguration<TFields, TID, TViewerContext, TEntity, TSelectedFields>, entityLoaderFactory: EntityLoaderFactory<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>, databaseAdapter: EntityDatabaseAdapter<TFields>, metricsAdapter: IEntityMetricsAdapter);
|
|
25
27
|
/**
|
|
26
28
|
* Vend mutator for creating a new entity in given query context.
|
|
27
29
|
* @param viewerContext - viewer context of creating user
|
|
@@ -5,7 +5,8 @@ const EntityMutator_1 = require("./EntityMutator");
|
|
|
5
5
|
* The primary interface for creating, mutating, and deleting entities.
|
|
6
6
|
*/
|
|
7
7
|
class EntityMutatorFactory {
|
|
8
|
-
constructor(entityConfiguration, entityClass, privacyPolicy, mutationValidators, mutationTriggers, entityLoaderFactory, databaseAdapter, metricsAdapter) {
|
|
8
|
+
constructor(entityCompanionProvider, entityConfiguration, entityClass, privacyPolicy, mutationValidators, mutationTriggers, entityLoaderFactory, databaseAdapter, metricsAdapter) {
|
|
9
|
+
this.entityCompanionProvider = entityCompanionProvider;
|
|
9
10
|
this.entityConfiguration = entityConfiguration;
|
|
10
11
|
this.entityClass = entityClass;
|
|
11
12
|
this.privacyPolicy = privacyPolicy;
|
|
@@ -22,7 +23,7 @@ class EntityMutatorFactory {
|
|
|
22
23
|
* @returns mutator for creating an entity
|
|
23
24
|
*/
|
|
24
25
|
forCreate(viewerContext, queryContext) {
|
|
25
|
-
return new EntityMutator_1.CreateMutator(viewerContext, queryContext, this.entityConfiguration, this.entityClass, this.privacyPolicy, this.mutationValidators, this.mutationTriggers, this.entityLoaderFactory, this.databaseAdapter, this.metricsAdapter);
|
|
26
|
+
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);
|
|
26
27
|
}
|
|
27
28
|
/**
|
|
28
29
|
* Vend mutator for updating an existing entity in given query context.
|
|
@@ -31,7 +32,7 @@ class EntityMutatorFactory {
|
|
|
31
32
|
* @returns mutator for updating existingEntity
|
|
32
33
|
*/
|
|
33
34
|
forUpdate(existingEntity, queryContext) {
|
|
34
|
-
return new EntityMutator_1.UpdateMutator(existingEntity.getViewerContext(), queryContext, this.entityConfiguration, this.entityClass, this.privacyPolicy, this.mutationValidators, this.mutationTriggers, this.entityLoaderFactory, this.databaseAdapter, this.metricsAdapter, existingEntity);
|
|
35
|
+
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);
|
|
35
36
|
}
|
|
36
37
|
/**
|
|
37
38
|
* Delete an existing entity in given query context.
|
|
@@ -39,7 +40,7 @@ class EntityMutatorFactory {
|
|
|
39
40
|
* @param queryContext - query context in which to perform the delete
|
|
40
41
|
*/
|
|
41
42
|
forDelete(existingEntity, queryContext) {
|
|
42
|
-
return new EntityMutator_1.DeleteMutator(existingEntity.getViewerContext(), queryContext, this.entityConfiguration, this.entityClass, this.privacyPolicy, this.mutationValidators, this.mutationTriggers, this.entityLoaderFactory, this.databaseAdapter, this.metricsAdapter, existingEntity);
|
|
43
|
+
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);
|
|
43
44
|
}
|
|
44
45
|
}
|
|
45
46
|
exports.default = EntityMutatorFactory;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityMutatorFactory.js","sourceRoot":"","sources":["../src/EntityMutatorFactory.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"EntityMutatorFactory.js","sourceRoot":"","sources":["../src/EntityMutatorFactory.ts"],"names":[],"mappings":";;AAOA,mDAA8E;AAM9E;;GAEG;AACH,MAAqB,oBAAoB;IAcvC,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"}
|
|
@@ -8,7 +8,7 @@ import PrivacyPolicyRule from './rules/PrivacyPolicyRule';
|
|
|
8
8
|
/**
|
|
9
9
|
* Information about the reason this privacy policy is being evaluated.
|
|
10
10
|
*/
|
|
11
|
-
export
|
|
11
|
+
export type EntityPrivacyPolicyEvaluationContext = {
|
|
12
12
|
/**
|
|
13
13
|
* When this privacy policy is being evaluated as a result of a cascading deletion, this will be populated
|
|
14
14
|
* with information on the cascading delete.
|
|
@@ -33,7 +33,7 @@ export declare enum EntityPrivacyPolicyEvaluationMode {
|
|
|
33
33
|
*/
|
|
34
34
|
ENFORCE_AND_LOG = 2
|
|
35
35
|
}
|
|
36
|
-
export
|
|
36
|
+
export type EntityPrivacyPolicyEvaluator<TFields extends object, TID extends NonNullable<TFields[TSelectedFields]>, TViewerContext extends ViewerContext, TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>, TSelectedFields extends keyof TFields = keyof TFields> = {
|
|
37
37
|
mode: EntityPrivacyPolicyEvaluationMode.ENFORCE;
|
|
38
38
|
} | {
|
|
39
39
|
mode: EntityPrivacyPolicyEvaluationMode.DRY_RUN;
|
|
@@ -69,7 +69,7 @@ export declare enum EntityAuthorizationAction {
|
|
|
69
69
|
* return not authorized if all rules skip
|
|
70
70
|
* ```
|
|
71
71
|
*/
|
|
72
|
-
export default abstract class EntityPrivacyPolicy<TFields, TID extends NonNullable<TFields[TSelectedFields]>, TViewerContext extends ViewerContext, TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>, TSelectedFields extends keyof TFields = keyof TFields> {
|
|
72
|
+
export default abstract class EntityPrivacyPolicy<TFields extends object, TID extends NonNullable<TFields[TSelectedFields]>, TViewerContext extends ViewerContext, TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>, TSelectedFields extends keyof TFields = keyof TFields> {
|
|
73
73
|
protected readonly createRules: readonly PrivacyPolicyRule<TFields, TID, TViewerContext, TEntity, TSelectedFields>[];
|
|
74
74
|
protected readonly readRules: readonly PrivacyPolicyRule<TFields, TID, TViewerContext, TEntity, TSelectedFields>[];
|
|
75
75
|
protected readonly updateRules: readonly PrivacyPolicyRule<TFields, TID, TViewerContext, TEntity, TSelectedFields>[];
|
|
@@ -25,14 +25,14 @@ var EntityPrivacyPolicyEvaluationMode;
|
|
|
25
25
|
* Enforce this privacy policy. Throw and log upon denial.
|
|
26
26
|
*/
|
|
27
27
|
EntityPrivacyPolicyEvaluationMode[EntityPrivacyPolicyEvaluationMode["ENFORCE_AND_LOG"] = 2] = "ENFORCE_AND_LOG";
|
|
28
|
-
})(EntityPrivacyPolicyEvaluationMode
|
|
28
|
+
})(EntityPrivacyPolicyEvaluationMode || (exports.EntityPrivacyPolicyEvaluationMode = EntityPrivacyPolicyEvaluationMode = {}));
|
|
29
29
|
var EntityAuthorizationAction;
|
|
30
30
|
(function (EntityAuthorizationAction) {
|
|
31
31
|
EntityAuthorizationAction[EntityAuthorizationAction["CREATE"] = 0] = "CREATE";
|
|
32
32
|
EntityAuthorizationAction[EntityAuthorizationAction["READ"] = 1] = "READ";
|
|
33
33
|
EntityAuthorizationAction[EntityAuthorizationAction["UPDATE"] = 2] = "UPDATE";
|
|
34
34
|
EntityAuthorizationAction[EntityAuthorizationAction["DELETE"] = 3] = "DELETE";
|
|
35
|
-
})(EntityAuthorizationAction
|
|
35
|
+
})(EntityAuthorizationAction || (exports.EntityAuthorizationAction = EntityAuthorizationAction = {}));
|
|
36
36
|
/**
|
|
37
37
|
* Privacy policy for an entity.
|
|
38
38
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityPrivacyPolicy.js","sourceRoot":"","sources":["../src/EntityPrivacyPolicy.ts"],"names":[],"mappings":";;;;;;AAIA,iGAAyE;AACzE,2EAEyC;AACzC,iEAAoF;AAapF;;;GAGG;AACH,IAAY,iCAeX;AAfD,WAAY,iCAAiC;IAC3C;;OAEG;IACH,+FAAO,CAAA;IAEP;;OAEG;IACH,+FAAO,CAAA;IAEP;;OAEG;IACH,+GAAe,CAAA;AACjB,CAAC,EAfW,iCAAiC,
|
|
1
|
+
{"version":3,"file":"EntityPrivacyPolicy.js","sourceRoot":"","sources":["../src/EntityPrivacyPolicy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import EntityQueryContextProvider from './EntityQueryContextProvider';
|
|
2
|
-
export
|
|
3
|
-
export
|
|
2
|
+
export type PostCommitCallback = (...args: any) => Promise<any>;
|
|
3
|
+
export type PreCommitCallback = (queryContext: EntityTransactionalQueryContext, ...args: any) => Promise<any>;
|
|
4
|
+
export declare enum TransactionIsolationLevel {
|
|
5
|
+
READ_COMMITTED = "READ_COMMITTED",
|
|
6
|
+
REPEATABLE_READ = "REPEATABLE_READ",
|
|
7
|
+
SERIALIZABLE = "SERIALIZABLE"
|
|
8
|
+
}
|
|
9
|
+
export type TransactionConfig = {
|
|
10
|
+
isolationLevel?: TransactionIsolationLevel;
|
|
11
|
+
};
|
|
4
12
|
/**
|
|
5
13
|
* Entity framework representation of transactional and non-transactional database
|
|
6
14
|
* query execution units.
|
|
@@ -13,7 +21,7 @@ export declare abstract class EntityQueryContext {
|
|
|
13
21
|
constructor(queryInterface: any);
|
|
14
22
|
abstract isInTransaction(): boolean;
|
|
15
23
|
getQueryInterface(): any;
|
|
16
|
-
abstract runInTransactionIfNotInTransactionAsync<T>(transactionScope: (queryContext: EntityTransactionalQueryContext) => Promise<T
|
|
24
|
+
abstract runInTransactionIfNotInTransactionAsync<T>(transactionScope: (queryContext: EntityTransactionalQueryContext) => Promise<T>, transactionConfig?: TransactionConfig): Promise<T>;
|
|
17
25
|
}
|
|
18
26
|
/**
|
|
19
27
|
* Entity framework representation of a non-transactional query execution unit.
|
|
@@ -25,7 +33,7 @@ export declare class EntityNonTransactionalQueryContext extends EntityQueryConte
|
|
|
25
33
|
private readonly entityQueryContextProvider;
|
|
26
34
|
constructor(queryInterface: any, entityQueryContextProvider: EntityQueryContextProvider);
|
|
27
35
|
isInTransaction(): boolean;
|
|
28
|
-
runInTransactionIfNotInTransactionAsync<T>(transactionScope: (queryContext: EntityTransactionalQueryContext) => Promise<T
|
|
36
|
+
runInTransactionIfNotInTransactionAsync<T>(transactionScope: (queryContext: EntityTransactionalQueryContext) => Promise<T>, transactionConfig?: TransactionConfig): Promise<T>;
|
|
29
37
|
}
|
|
30
38
|
/**
|
|
31
39
|
* Entity framework representation of a transactional query execution unit. When supplied
|
|
@@ -62,7 +70,7 @@ export declare class EntityTransactionalQueryContext extends EntityQueryContext
|
|
|
62
70
|
runPreCommitCallbacksAsync(): Promise<void>;
|
|
63
71
|
runPostCommitCallbacksAsync(): Promise<void>;
|
|
64
72
|
isInTransaction(): boolean;
|
|
65
|
-
runInTransactionIfNotInTransactionAsync<T>(transactionScope: (queryContext: EntityTransactionalQueryContext) => Promise<T
|
|
73
|
+
runInTransactionIfNotInTransactionAsync<T>(transactionScope: (queryContext: EntityTransactionalQueryContext) => Promise<T>, transactionConfig?: TransactionConfig): Promise<T>;
|
|
66
74
|
runInNestedTransactionAsync<T>(transactionScope: (innerQueryContext: EntityTransactionalQueryContext) => Promise<T>): Promise<T>;
|
|
67
75
|
}
|
|
68
76
|
/**
|
|
@@ -3,8 +3,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.EntityNestedTransactionalQueryContext = exports.EntityTransactionalQueryContext = exports.EntityNonTransactionalQueryContext = exports.EntityQueryContext = void 0;
|
|
6
|
+
exports.EntityNestedTransactionalQueryContext = exports.EntityTransactionalQueryContext = exports.EntityNonTransactionalQueryContext = exports.EntityQueryContext = exports.TransactionIsolationLevel = void 0;
|
|
7
7
|
const assert_1 = __importDefault(require("assert"));
|
|
8
|
+
var TransactionIsolationLevel;
|
|
9
|
+
(function (TransactionIsolationLevel) {
|
|
10
|
+
TransactionIsolationLevel["READ_COMMITTED"] = "READ_COMMITTED";
|
|
11
|
+
TransactionIsolationLevel["REPEATABLE_READ"] = "REPEATABLE_READ";
|
|
12
|
+
TransactionIsolationLevel["SERIALIZABLE"] = "SERIALIZABLE";
|
|
13
|
+
})(TransactionIsolationLevel || (exports.TransactionIsolationLevel = TransactionIsolationLevel = {}));
|
|
8
14
|
/**
|
|
9
15
|
* Entity framework representation of transactional and non-transactional database
|
|
10
16
|
* query execution units.
|
|
@@ -35,8 +41,8 @@ class EntityNonTransactionalQueryContext extends EntityQueryContext {
|
|
|
35
41
|
isInTransaction() {
|
|
36
42
|
return false;
|
|
37
43
|
}
|
|
38
|
-
async runInTransactionIfNotInTransactionAsync(transactionScope) {
|
|
39
|
-
return await this.entityQueryContextProvider.runInTransactionAsync(transactionScope);
|
|
44
|
+
async runInTransactionIfNotInTransactionAsync(transactionScope, transactionConfig) {
|
|
45
|
+
return await this.entityQueryContextProvider.runInTransactionAsync(transactionScope, transactionConfig);
|
|
40
46
|
}
|
|
41
47
|
}
|
|
42
48
|
exports.EntityNonTransactionalQueryContext = EntityNonTransactionalQueryContext;
|
|
@@ -101,7 +107,8 @@ class EntityTransactionalQueryContext extends EntityQueryContext {
|
|
|
101
107
|
isInTransaction() {
|
|
102
108
|
return true;
|
|
103
109
|
}
|
|
104
|
-
async runInTransactionIfNotInTransactionAsync(transactionScope) {
|
|
110
|
+
async runInTransactionIfNotInTransactionAsync(transactionScope, transactionConfig) {
|
|
111
|
+
(0, assert_1.default)(transactionConfig === undefined, 'Should not pass transactionConfig to a nested transaction');
|
|
105
112
|
return await transactionScope(this);
|
|
106
113
|
}
|
|
107
114
|
async runInNestedTransactionAsync(transactionScope) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityQueryContext.js","sourceRoot":"","sources":["../src/EntityQueryContext.ts"],"names":[],"mappings":";;;;;;AAAA,oDAA4B;AAU5B;;;;;;GAMG;AACH,MAAsB,kBAAkB;IACtC,YAA6B,cAAmB;QAAnB,mBAAc,GAAd,cAAc,CAAK;IAAG,CAAC;IAIpD,iBAAiB;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;
|
|
1
|
+
{"version":3,"file":"EntityQueryContext.js","sourceRoot":"","sources":["../src/EntityQueryContext.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { EntityTransactionalQueryContext, EntityNonTransactionalQueryContext, EntityNestedTransactionalQueryContext } from './EntityQueryContext';
|
|
1
|
+
import { EntityTransactionalQueryContext, EntityNonTransactionalQueryContext, EntityNestedTransactionalQueryContext, TransactionConfig } from './EntityQueryContext';
|
|
2
2
|
/**
|
|
3
3
|
* A query context provider vends transactional and non-transactional query contexts.
|
|
4
4
|
*/
|
|
@@ -14,13 +14,13 @@ export default abstract class EntityQueryContextProvider {
|
|
|
14
14
|
/**
|
|
15
15
|
* Vend a transaction runner for use in runInTransactionAsync.
|
|
16
16
|
*/
|
|
17
|
-
protected abstract createTransactionRunner<T>(): (transactionScope: (queryInterface: any) => Promise<T>) => Promise<T>;
|
|
17
|
+
protected abstract createTransactionRunner<T>(transactionConfig?: TransactionConfig): (transactionScope: (queryInterface: any) => Promise<T>) => Promise<T>;
|
|
18
18
|
protected abstract createNestedTransactionRunner<T>(outerQueryInterface: any): (transactionScope: (queryInterface: any) => Promise<T>) => Promise<T>;
|
|
19
19
|
/**
|
|
20
20
|
* Start a transaction and execute the provided transaction-scoped closure within the transaction.
|
|
21
21
|
* @param transactionScope - async callback to execute within the transaction
|
|
22
22
|
*/
|
|
23
|
-
runInTransactionAsync<T>(transactionScope: (queryContext: EntityTransactionalQueryContext) => Promise<T
|
|
23
|
+
runInTransactionAsync<T>(transactionScope: (queryContext: EntityTransactionalQueryContext) => Promise<T>, transactionConfig?: TransactionConfig): Promise<T>;
|
|
24
24
|
/**
|
|
25
25
|
* Start a nested transaction from the specified parent transaction and execure the
|
|
26
26
|
* provided nested-transaction-scoped closure within the nested transaction.
|
|
@@ -15,8 +15,8 @@ class EntityQueryContextProvider {
|
|
|
15
15
|
* Start a transaction and execute the provided transaction-scoped closure within the transaction.
|
|
16
16
|
* @param transactionScope - async callback to execute within the transaction
|
|
17
17
|
*/
|
|
18
|
-
async runInTransactionAsync(transactionScope) {
|
|
19
|
-
const [returnedValue, queryContext] = await this.createTransactionRunner()(async (queryInterface) => {
|
|
18
|
+
async runInTransactionAsync(transactionScope, transactionConfig) {
|
|
19
|
+
const [returnedValue, queryContext] = await this.createTransactionRunner(transactionConfig)(async (queryInterface) => {
|
|
20
20
|
const queryContext = new EntityQueryContext_1.EntityTransactionalQueryContext(queryInterface, this);
|
|
21
21
|
const result = await transactionScope(queryContext);
|
|
22
22
|
await queryContext.runPreCommitCallbacksAsync();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntityQueryContextProvider.js","sourceRoot":"","sources":["../src/EntityQueryContextProvider.ts"],"names":[],"mappings":";;AAAA,
|
|
1
|
+
{"version":3,"file":"EntityQueryContextProvider.js","sourceRoot":"","sources":["../src/EntityQueryContextProvider.ts"],"names":[],"mappings":";;AAAA,6DAK8B;AAE9B;;GAEG;AACH,MAA8B,0BAA0B;IACtD;;OAEG;IACI,eAAe;QACpB,OAAO,IAAI,uDAAkC,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,IAAI,CAAC,CAAC;IAChF,CAAC;IAkBD;;;OAGG;IACH,KAAK,CAAC,qBAAqB,CACzB,gBAA+E,EAC/E,iBAAqC;QAErC,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAEtE,iBAAiB,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE;YAC5C,MAAM,YAAY,GAAG,IAAI,oDAA+B,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;YAC/E,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,YAAY,CAAC,CAAC;YACpD,MAAM,YAAY,CAAC,0BAA0B,EAAE,CAAC;YAChD,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QACH,MAAM,YAAY,CAAC,2BAA2B,EAAE,CAAC;QACjD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,2BAA2B,CAC/B,iBAAkD,EAClD,gBAA0F;QAE1F,MAAM,CAAC,aAAa,EAAE,iBAAiB,CAAC,GAAG,MAAM,IAAI,CAAC,6BAA6B,CAEjF,iBAAiB,CAAC,iBAAiB,EAAE,CAAC,CAAC,KAAK,EAAE,mBAAmB,EAAE,EAAE;YACrE,MAAM,iBAAiB,GAAG,IAAI,0DAAqC,CACjE,mBAAmB,EACnB,iBAAiB,EACjB,IAAI,CACL,CAAC;YACF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;YACzD,MAAM,iBAAiB,CAAC,0BAA0B,EAAE,CAAC;YACrD,OAAO,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QACH,wHAAwH;QACxH,iBAAiB,CAAC,mCAAmC,EAAE,CAAC;QACxD,OAAO,aAAa,CAAC;IACvB,CAAC;CACF;AAtED,6CAsEC"}
|
|
@@ -33,7 +33,7 @@ export interface ISecondaryEntityCache<TFields, TLoadParams> {
|
|
|
33
33
|
* due to use of a non-unique-field-based EntityLoader method like `loadManyByFieldEqualityConjunctionAsync` or
|
|
34
34
|
* `loadManyByRawWhereClauseAsync`.
|
|
35
35
|
*/
|
|
36
|
-
export default abstract class EntitySecondaryCacheLoader<TLoadParams, TFields, 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> {
|
|
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
38
|
protected readonly entityLoader: EntityLoader<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
|
|
39
39
|
constructor(secondaryEntityCache: ISecondaryEntityCache<TFields, TLoadParams>, entityLoader: EntityLoader<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>);
|
|
@@ -26,7 +26,7 @@ class EntitySecondaryCacheLoader {
|
|
|
26
26
|
const loadParamsToFieldObjects = await this.secondaryEntityCache.loadManyThroughAsync(loadParamsArray, this.fetchObjectsFromDatabaseAsync.bind(this));
|
|
27
27
|
// convert value to and from array to reuse complex code
|
|
28
28
|
const entitiesMap = await this.entityLoader.constructAndAuthorizeEntitiesAsync((0, maps_1.mapMap)(loadParamsToFieldObjects, (fieldObject) => (fieldObject ? [fieldObject] : [])));
|
|
29
|
-
return (0, maps_1.mapMap)(entitiesMap, (fieldObjects) =>
|
|
29
|
+
return (0, maps_1.mapMap)(entitiesMap, (fieldObjects) => fieldObjects[0] ?? null);
|
|
30
30
|
}
|
|
31
31
|
/**
|
|
32
32
|
* Invalidate the cache for objects cached by loadParams.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EntitySecondaryCacheLoader.js","sourceRoot":"","sources":["../src/EntitySecondaryCacheLoader.ts"],"names":[],"mappings":";;AAMA,mDAAkD;AA4BlD;;;;;;;;;;GAUG;AACH,MAA8B,0BAA0B;IAetD,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,kCAAkC,CAC5E,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,
|
|
1
|
+
{"version":3,"file":"EntitySecondaryCacheLoader.js","sourceRoot":"","sources":["../src/EntitySecondaryCacheLoader.ts"],"names":[],"mappings":";;AAMA,mDAAkD;AA4BlD;;;;;;;;;;GAUG;AACH,MAA8B,0BAA0B;IAetD,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,kCAAkC,CAC5E,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,14 @@
|
|
|
1
|
+
import IEntityCacheAdapter from './IEntityCacheAdapter';
|
|
2
|
+
import IEntityGenericCacher from './IEntityGenericCacher';
|
|
3
|
+
import { CacheLoadResult } from './internal/ReadThroughEntityCache';
|
|
4
|
+
/**
|
|
5
|
+
* A standard IEntityCacheAdapter that coordinates caching through an IEntityGenericCacher.
|
|
6
|
+
*/
|
|
7
|
+
export default class GenericEntityCacheAdapter<TFields> implements IEntityCacheAdapter<TFields> {
|
|
8
|
+
private readonly genericCacher;
|
|
9
|
+
constructor(genericCacher: IEntityGenericCacher<TFields>);
|
|
10
|
+
loadManyAsync<N extends keyof TFields>(fieldName: N, fieldValues: readonly NonNullable<TFields[N]>[]): Promise<ReadonlyMap<NonNullable<TFields[N]>, CacheLoadResult<TFields>>>;
|
|
11
|
+
cacheManyAsync<N extends keyof TFields>(fieldName: N, objectMap: ReadonlyMap<NonNullable<TFields[N]>, Readonly<TFields>>): Promise<void>;
|
|
12
|
+
cacheDBMissesAsync<N extends keyof TFields>(fieldName: N, fieldValues: readonly NonNullable<TFields[N]>[]): Promise<void>;
|
|
13
|
+
invalidateManyAsync<N extends keyof TFields>(fieldName: N, fieldValues: readonly NonNullable<TFields[N]>[]): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
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 invariant_1 = __importDefault(require("invariant"));
|
|
7
|
+
const maps_1 = require("./utils/collections/maps");
|
|
8
|
+
/**
|
|
9
|
+
* A standard IEntityCacheAdapter that coordinates caching through an IEntityGenericCacher.
|
|
10
|
+
*/
|
|
11
|
+
class GenericEntityCacheAdapter {
|
|
12
|
+
constructor(genericCacher) {
|
|
13
|
+
this.genericCacher = genericCacher;
|
|
14
|
+
}
|
|
15
|
+
async loadManyAsync(fieldName, fieldValues) {
|
|
16
|
+
const redisCacheKeyToFieldValueMapping = new Map(fieldValues.map((fieldValue) => [
|
|
17
|
+
this.genericCacher.makeCacheKey(fieldName, fieldValue),
|
|
18
|
+
fieldValue,
|
|
19
|
+
]));
|
|
20
|
+
const cacheResults = await this.genericCacher.loadManyAsync(Array.from(redisCacheKeyToFieldValueMapping.keys()));
|
|
21
|
+
return (0, maps_1.mapKeys)(cacheResults, (redisCacheKey) => {
|
|
22
|
+
const fieldValue = redisCacheKeyToFieldValueMapping.get(redisCacheKey);
|
|
23
|
+
(0, invariant_1.default)(fieldValue !== undefined, 'Unspecified cache key %s returned from generic cacher', redisCacheKey);
|
|
24
|
+
return fieldValue;
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
async cacheManyAsync(fieldName, objectMap) {
|
|
28
|
+
await this.genericCacher.cacheManyAsync((0, maps_1.mapKeys)(objectMap, (fieldValue) => this.genericCacher.makeCacheKey(fieldName, fieldValue)));
|
|
29
|
+
}
|
|
30
|
+
async cacheDBMissesAsync(fieldName, fieldValues) {
|
|
31
|
+
await this.genericCacher.cacheDBMissesAsync(fieldValues.map((fieldValue) => this.genericCacher.makeCacheKey(fieldName, fieldValue)));
|
|
32
|
+
}
|
|
33
|
+
async invalidateManyAsync(fieldName, fieldValues) {
|
|
34
|
+
await this.genericCacher.invalidateManyAsync(fieldValues.map((fieldValue) => this.genericCacher.makeCacheKey(fieldName, fieldValue)));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
exports.default = GenericEntityCacheAdapter;
|
|
38
|
+
//# sourceMappingURL=GenericEntityCacheAdapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GenericEntityCacheAdapter.js","sourceRoot":"","sources":["../src/GenericEntityCacheAdapter.ts"],"names":[],"mappings":";;;;;AAAA,0DAAkC;AAKlC,mDAAmD;AAEnD;;GAEG;AACH,MAAqB,yBAAyB;IAC5C,YAA6B,aAA4C;QAA5C,kBAAa,GAAb,aAAa,CAA+B;IAAG,CAAC;IAEtE,KAAK,CAAC,aAAa,CACxB,SAAY,EACZ,WAA+C;QAE/C,MAAM,gCAAgC,GAAG,IAAI,GAAG,CAC9C,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC;YAC9B,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC;YACtD,UAAU;SACX,CAAC,CACH,CAAC;QACF,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,CACzD,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,IAAI,EAAE,CAAC,CACpD,CAAC;QAEF,OAAO,IAAA,cAAO,EAAC,YAAY,EAAE,CAAC,aAAa,EAAE,EAAE;YAC7C,MAAM,UAAU,GAAG,gCAAgC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACvE,IAAA,mBAAS,EACP,UAAU,KAAK,SAAS,EACxB,uDAAuD,EACvD,aAAa,CACd,CAAC;YACF,OAAO,UAAU,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,cAAc,CACzB,SAAY,EACZ,SAAkE;QAElE,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CACrC,IAAA,cAAO,EAAC,SAAS,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAC3F,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,kBAAkB,CAC7B,SAAY,EACZ,WAA+C;QAE/C,MAAM,IAAI,CAAC,aAAa,CAAC,kBAAkB,CACzC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CACxF,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAC9B,SAAY,EACZ,WAA+C;QAE/C,MAAM,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAC1C,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CACxF,CAAC;IACJ,CAAC;CACF;AAtDD,4CAsDC"}
|
|
@@ -1,36 +1,33 @@
|
|
|
1
|
-
import EntityConfiguration from './EntityConfiguration';
|
|
2
1
|
import { CacheLoadResult } from './internal/ReadThroughEntityCache';
|
|
3
2
|
/**
|
|
4
3
|
* A cache adapter is an interface by which objects can be
|
|
5
4
|
* cached, fetched from cache, and removed from cache (invalidated).
|
|
6
5
|
*/
|
|
7
|
-
export default
|
|
8
|
-
protected readonly entityConfiguration: EntityConfiguration<TFields>;
|
|
9
|
-
constructor(entityConfiguration: EntityConfiguration<TFields>);
|
|
6
|
+
export default interface IEntityCacheAdapter<TFields> {
|
|
10
7
|
/**
|
|
11
8
|
* Load many objects from cache.
|
|
12
9
|
* @param fieldName - object field being queried
|
|
13
10
|
* @param fieldValues - fieldName field values being queried
|
|
14
11
|
* @returns map from all field values to a CacheLoadResult for each input value
|
|
15
12
|
*/
|
|
16
|
-
|
|
13
|
+
loadManyAsync<N extends keyof TFields>(fieldName: N, fieldValues: readonly NonNullable<TFields[N]>[]): Promise<ReadonlyMap<NonNullable<TFields[N]>, CacheLoadResult<TFields>>>;
|
|
17
14
|
/**
|
|
18
15
|
* Cache many objects fetched from the DB.
|
|
19
16
|
* @param fieldName - object field being queried
|
|
20
17
|
* @param objectMap - map from field value to object to cache
|
|
21
18
|
*/
|
|
22
|
-
|
|
19
|
+
cacheManyAsync<N extends keyof TFields>(fieldName: N, objectMap: ReadonlyMap<NonNullable<TFields[N]>, Readonly<TFields>>): Promise<void>;
|
|
23
20
|
/**
|
|
24
21
|
* Negatively cache objects that could not be found in the cache or DB.
|
|
25
22
|
* @param fieldName - object field being queried
|
|
26
23
|
* @param fieldValues - fieldValues for objects reported as CacheStatus.NEGATIVE
|
|
27
24
|
* in the cache and not found in the DB.
|
|
28
25
|
*/
|
|
29
|
-
|
|
26
|
+
cacheDBMissesAsync<N extends keyof TFields>(fieldName: N, fieldValues: readonly NonNullable<TFields[N]>[]): Promise<void>;
|
|
30
27
|
/**
|
|
31
28
|
* Invalidate the cache for objects cached by (fieldName, fieldValue).
|
|
32
29
|
* @param fieldName - object field being queried
|
|
33
30
|
* @param fieldValues - fieldName field values to be invalidated
|
|
34
31
|
*/
|
|
35
|
-
|
|
32
|
+
invalidateManyAsync<N extends keyof TFields>(fieldName: N, fieldValues: readonly NonNullable<TFields[N]>[]): Promise<void>;
|
|
36
33
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IEntityCacheAdapter.js","sourceRoot":"","sources":["../src/IEntityCacheAdapter.ts"],"names":[],"mappings":""}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import EntityCacheAdapter from './EntityCacheAdapter';
|
|
2
1
|
import EntityConfiguration from './EntityConfiguration';
|
|
2
|
+
import IEntityCacheAdapter from './IEntityCacheAdapter';
|
|
3
3
|
/**
|
|
4
4
|
* A cache adapter provider vends cache adapters for a particular cache adapter type.
|
|
5
5
|
* Allows for passing global configuration to cache adapters.
|
|
@@ -8,5 +8,5 @@ export default interface IEntityCacheAdapterProvider {
|
|
|
8
8
|
/**
|
|
9
9
|
* Vend a cache adapter.
|
|
10
10
|
*/
|
|
11
|
-
getCacheAdapter<TFields>(entityConfiguration: EntityConfiguration<TFields>):
|
|
11
|
+
getCacheAdapter<TFields>(entityConfiguration: EntityConfiguration<TFields>): IEntityCacheAdapter<TFields>;
|
|
12
12
|
}
|
|
@@ -1,11 +1,40 @@
|
|
|
1
1
|
import { CacheLoadResult } from './internal/ReadThroughEntityCache';
|
|
2
2
|
/**
|
|
3
|
-
* A cacher stores and loads key-value pairs. It also supports negative caching - it stores the absence
|
|
4
|
-
* of keys that don't exist in the backing datastore.
|
|
3
|
+
* A generic cacher stores and loads key-value pairs. It also supports negative caching - it stores the absence
|
|
4
|
+
* of keys that don't exist in the backing datastore. It is also responsible for cache key creation.
|
|
5
5
|
*/
|
|
6
6
|
export default interface IEntityGenericCacher<TFields> {
|
|
7
|
+
/**
|
|
8
|
+
* Load many keys from the cache. Return info in a format that is useful for read-through caching and
|
|
9
|
+
* negative caching.
|
|
10
|
+
*
|
|
11
|
+
* @param keys - cache keys to load
|
|
12
|
+
*/
|
|
7
13
|
loadManyAsync(keys: readonly string[]): Promise<ReadonlyMap<string, CacheLoadResult<TFields>>>;
|
|
14
|
+
/**
|
|
15
|
+
* Cache many objects for specified keys.
|
|
16
|
+
*
|
|
17
|
+
* @param objectMap - map from cache key to object to cache for key
|
|
18
|
+
*/
|
|
8
19
|
cacheManyAsync(objectMap: ReadonlyMap<string, Readonly<TFields>>): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Negatively-cache specified keys. Subsequent loads for these keys (without calling invalidate) may
|
|
22
|
+
* return a negative CacheLoadResult
|
|
23
|
+
*
|
|
24
|
+
* @param keys - keys to cache negatively
|
|
25
|
+
*/
|
|
9
26
|
cacheDBMissesAsync(keys: readonly string[]): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Invalidate specified keys in cache. Subsequent loads for these keys may return a cache miss.
|
|
29
|
+
*
|
|
30
|
+
* @param keys - keys to invalidate
|
|
31
|
+
*/
|
|
10
32
|
invalidateManyAsync(keys: readonly string[]): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Create a cache key for a field and value of a object being cached or invalidated.
|
|
35
|
+
*
|
|
36
|
+
* @param fieldName - name of the object field for this cache key
|
|
37
|
+
* @param fieldValue - value of the obejct field for this cache key
|
|
38
|
+
*/
|
|
39
|
+
makeCacheKey<N extends keyof TFields>(fieldName: N, fieldValue: NonNullable<TFields[N]>): string;
|
|
11
40
|
}
|
|
@@ -12,19 +12,31 @@ import ViewerContext from './ViewerContext';
|
|
|
12
12
|
* - Entities representing SQL views.
|
|
13
13
|
* - Entities representing immutable tables.
|
|
14
14
|
*/
|
|
15
|
-
export default abstract class ReadonlyEntity<TFields, TID extends NonNullable<TFields[TSelectedFields]>, TViewerContext extends ViewerContext, TSelectedFields extends keyof TFields = keyof TFields> {
|
|
15
|
+
export default abstract class ReadonlyEntity<TFields extends object, TID extends NonNullable<TFields[TSelectedFields]>, TViewerContext extends ViewerContext, TSelectedFields extends keyof TFields = keyof TFields> {
|
|
16
16
|
private readonly viewerContext;
|
|
17
|
-
private readonly databaseFields;
|
|
18
17
|
private readonly id;
|
|
19
|
-
private readonly
|
|
18
|
+
private readonly databaseFields;
|
|
19
|
+
private readonly selectedFields;
|
|
20
20
|
/**
|
|
21
21
|
* Constructs an instance of an Entity.
|
|
22
|
-
*
|
|
23
|
-
* @param
|
|
22
|
+
*
|
|
23
|
+
* @param constructorParam - data needed to construct an instance of an entity
|
|
24
|
+
* viewerContext - the ViewerContext reading this entity
|
|
25
|
+
* id - the ID of this entity
|
|
26
|
+
* databaseFields - all underlying fields for this entity's data
|
|
27
|
+
* selectedFields - selected fields for this entity from TSelectedFields type
|
|
28
|
+
*
|
|
29
|
+
* This should only be overridden in cases where additional data validation is needed.
|
|
30
|
+
* The params should not be modified when calling super during constructions.
|
|
24
31
|
*
|
|
25
32
|
* @internal
|
|
26
33
|
*/
|
|
27
|
-
constructor(viewerContext
|
|
34
|
+
constructor({ viewerContext, id, databaseFields, selectedFields, }: {
|
|
35
|
+
viewerContext: TViewerContext;
|
|
36
|
+
id: TID;
|
|
37
|
+
databaseFields: Readonly<TFields>;
|
|
38
|
+
selectedFields: Readonly<Pick<TFields, TSelectedFields>>;
|
|
39
|
+
});
|
|
28
40
|
toString(): string;
|
|
29
41
|
getUniqueIdentifier(): string;
|
|
30
42
|
/**
|
|
@@ -58,5 +70,5 @@ export default abstract class ReadonlyEntity<TFields, TID extends NonNullable<TF
|
|
|
58
70
|
* @param viewerContext - viewer context of loading user
|
|
59
71
|
* @param queryContext - query context in which to perform the load
|
|
60
72
|
*/
|
|
61
|
-
static loader<TMFields, 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>;
|
|
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>;
|
|
62
74
|
}
|
package/build/ReadonlyEntity.js
CHANGED
|
@@ -5,7 +5,6 @@ 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 entityUtils_1 = require("./entityUtils");
|
|
9
8
|
/**
|
|
10
9
|
* A readonly entity exposes only the read functionality of an Entity. Used as the base
|
|
11
10
|
* type for most entity operations excluding mutations.
|
|
@@ -17,21 +16,24 @@ const entityUtils_1 = require("./entityUtils");
|
|
|
17
16
|
class ReadonlyEntity {
|
|
18
17
|
/**
|
|
19
18
|
* Constructs an instance of an Entity.
|
|
20
|
-
*
|
|
21
|
-
* @param
|
|
19
|
+
*
|
|
20
|
+
* @param constructorParam - data needed to construct an instance of an entity
|
|
21
|
+
* viewerContext - the ViewerContext reading this entity
|
|
22
|
+
* id - the ID of this entity
|
|
23
|
+
* databaseFields - all underlying fields for this entity's data
|
|
24
|
+
* selectedFields - selected fields for this entity from TSelectedFields type
|
|
25
|
+
*
|
|
26
|
+
* This should only be overridden in cases where additional data validation is needed.
|
|
27
|
+
* The params should not be modified when calling super during constructions.
|
|
22
28
|
*
|
|
23
29
|
* @internal
|
|
24
30
|
*/
|
|
25
|
-
constructor(viewerContext, databaseFields) {
|
|
31
|
+
constructor({ viewerContext, id, databaseFields, selectedFields, }) {
|
|
32
|
+
(0, invariant_1.default)(id !== null && id !== undefined, 'id must be non-null');
|
|
26
33
|
this.viewerContext = viewerContext;
|
|
27
|
-
this.databaseFields = databaseFields;
|
|
28
|
-
const companionDefinition = this.constructor.getCompanionDefinition();
|
|
29
|
-
const idField = companionDefinition.entityConfiguration.idField;
|
|
30
|
-
const id = databaseFields[idField];
|
|
31
|
-
(0, invariant_1.default)(id, 'must provide ID to create an entity');
|
|
32
34
|
this.id = id;
|
|
33
|
-
|
|
34
|
-
this.
|
|
35
|
+
this.databaseFields = databaseFields;
|
|
36
|
+
this.selectedFields = selectedFields;
|
|
35
37
|
}
|
|
36
38
|
toString() {
|
|
37
39
|
return `${this.constructor.name}[${this.getID()}]`;
|
|
@@ -63,13 +65,13 @@ class ReadonlyEntity {
|
|
|
63
65
|
* @returns the value of the field or undefined if not loaded with that field
|
|
64
66
|
*/
|
|
65
67
|
getField(fieldName) {
|
|
66
|
-
return this.
|
|
68
|
+
return this.selectedFields[fieldName];
|
|
67
69
|
}
|
|
68
70
|
/**
|
|
69
71
|
* @returns all underlying fields from this entity's data
|
|
70
72
|
*/
|
|
71
73
|
getAllFields() {
|
|
72
|
-
return { ...this.
|
|
74
|
+
return { ...this.selectedFields };
|
|
73
75
|
}
|
|
74
76
|
/**
|
|
75
77
|
* @returns all underlying fields from this entity's database data
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReadonlyEntity.js","sourceRoot":"","sources":["../src/ReadonlyEntity.ts"],"names":[],"mappings":";;;;;AAAA,0DAAkC;AAGlC,wFAAgE;AAMhE
|
|
1
|
+
{"version":3,"file":"ReadonlyEntity.js","sourceRoot":"","sources":["../src/ReadonlyEntity.ts"],"names":[],"mappings":";;;;;AAAA,0DAAkC;AAGlC,wFAAgE;AAMhE;;;;;;;GAOG;AACH,MAA8B,cAAc;IAW1C;;;;;;;;;;;;;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,oBAAoB,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;CACF;AA/ID,iCA+IC"}
|