@expo/entity 0.31.1 → 0.33.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 +6 -1
- package/build/EnforcingEntityLoader.js +8 -0
- package/build/EnforcingEntityLoader.js.map +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 +10 -2
- package/build/EntityLoader.js +32 -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 +28 -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 +22 -12
- 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 +10 -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 +36 -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 +44 -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 +14 -1
- 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
package/src/ViewerContext.ts
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { IEntityClass } from './Entity';
|
|
2
2
|
import EntityCompanionProvider, { DatabaseAdapterFlavor } from './EntityCompanionProvider';
|
|
3
3
|
import EntityPrivacyPolicy from './EntityPrivacyPolicy';
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
EntityQueryContext,
|
|
6
|
+
EntityTransactionalQueryContext,
|
|
7
|
+
TransactionConfig,
|
|
8
|
+
} from './EntityQueryContext';
|
|
5
9
|
import ReadonlyEntity from './ReadonlyEntity';
|
|
6
10
|
import ViewerScopedEntityCompanion from './ViewerScopedEntityCompanion';
|
|
7
11
|
import ViewerScopedEntityCompanionProvider from './ViewerScopedEntityCompanionProvider';
|
|
@@ -27,7 +31,7 @@ export default class ViewerContext {
|
|
|
27
31
|
}
|
|
28
32
|
|
|
29
33
|
getViewerScopedEntityCompanionForClass<
|
|
30
|
-
TMFields,
|
|
34
|
+
TMFields extends object,
|
|
31
35
|
TMID extends NonNullable<TMFields[TMSelectedFields]>,
|
|
32
36
|
TMViewerContext extends ViewerContext,
|
|
33
37
|
TMEntity extends ReadonlyEntity<TMFields, TMID, TMViewerContext, TMSelectedFields>,
|
|
@@ -56,10 +60,7 @@ export default class ViewerContext {
|
|
|
56
60
|
TMPrivacyPolicy,
|
|
57
61
|
TMSelectedFields
|
|
58
62
|
> {
|
|
59
|
-
return this.viewerScopedEntityCompanionProvider.getViewerScopedCompanionForEntity(
|
|
60
|
-
entityClass,
|
|
61
|
-
entityClass.getCompanionDefinition()
|
|
62
|
-
);
|
|
63
|
+
return this.viewerScopedEntityCompanionProvider.getViewerScopedCompanionForEntity(entityClass);
|
|
63
64
|
}
|
|
64
65
|
|
|
65
66
|
/**
|
|
@@ -82,11 +83,12 @@ export default class ViewerContext {
|
|
|
82
83
|
*/
|
|
83
84
|
async runInTransactionForDatabaseAdaptorFlavorAsync<TResult>(
|
|
84
85
|
databaseAdaptorFlavor: DatabaseAdapterFlavor,
|
|
85
|
-
transactionScope: (queryContext: EntityTransactionalQueryContext) => Promise<TResult
|
|
86
|
+
transactionScope: (queryContext: EntityTransactionalQueryContext) => Promise<TResult>,
|
|
87
|
+
transactionConfig?: TransactionConfig
|
|
86
88
|
): Promise<TResult> {
|
|
87
89
|
return await this.entityCompanionProvider
|
|
88
90
|
.getQueryContextProviderForDatabaseAdaptorFlavor(databaseAdaptorFlavor)
|
|
89
91
|
.getQueryContext()
|
|
90
|
-
.runInTransactionIfNotInTransactionAsync(transactionScope);
|
|
92
|
+
.runInTransactionIfNotInTransactionAsync(transactionScope, transactionConfig);
|
|
91
93
|
}
|
|
92
94
|
}
|
|
@@ -12,7 +12,7 @@ import IEntityMetricsAdapter from './metrics/IEntityMetricsAdapter';
|
|
|
12
12
|
* from the viewer-scoped entity companion provider.
|
|
13
13
|
*/
|
|
14
14
|
export default class ViewerScopedEntityCompanion<
|
|
15
|
-
TFields,
|
|
15
|
+
TFields extends object,
|
|
16
16
|
TID extends NonNullable<TFields[TSelectedFields]>,
|
|
17
17
|
TViewerContext extends ViewerContext,
|
|
18
18
|
TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
|
|
@@ -26,7 +26,7 @@ export default class ViewerScopedEntityCompanion<
|
|
|
26
26
|
TSelectedFields extends keyof TFields
|
|
27
27
|
> {
|
|
28
28
|
constructor(
|
|
29
|
-
|
|
29
|
+
public readonly entityCompanion: EntityCompanion<
|
|
30
30
|
TFields,
|
|
31
31
|
TID,
|
|
32
32
|
TViewerContext,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { IEntityClass } from './Entity';
|
|
2
|
-
import EntityCompanionProvider
|
|
2
|
+
import EntityCompanionProvider from './EntityCompanionProvider';
|
|
3
3
|
import EntityPrivacyPolicy from './EntityPrivacyPolicy';
|
|
4
4
|
import ReadonlyEntity from './ReadonlyEntity';
|
|
5
5
|
import ViewerContext from './ViewerContext';
|
|
@@ -19,10 +19,10 @@ export default class ViewerScopedEntityCompanionProvider {
|
|
|
19
19
|
* companion is constructed using the configuration provided by the factory.
|
|
20
20
|
*
|
|
21
21
|
* @param entityClass - entity class to load
|
|
22
|
-
* @param
|
|
22
|
+
* @param entityCompanionDefinitionFn - function defining entity companion definition
|
|
23
23
|
*/
|
|
24
24
|
getViewerScopedCompanionForEntity<
|
|
25
|
-
TFields,
|
|
25
|
+
TFields extends object,
|
|
26
26
|
TID extends NonNullable<TFields[TSelectedFields]>,
|
|
27
27
|
TViewerContext extends ViewerContext,
|
|
28
28
|
TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
|
|
@@ -42,14 +42,6 @@ export default class ViewerScopedEntityCompanionProvider {
|
|
|
42
42
|
TEntity,
|
|
43
43
|
TPrivacyPolicy,
|
|
44
44
|
TSelectedFields
|
|
45
|
-
>,
|
|
46
|
-
entityCompanionDefinition: EntityCompanionDefinition<
|
|
47
|
-
TFields,
|
|
48
|
-
TID,
|
|
49
|
-
TViewerContext,
|
|
50
|
-
TEntity,
|
|
51
|
-
TPrivacyPolicy,
|
|
52
|
-
TSelectedFields
|
|
53
45
|
>
|
|
54
46
|
): ViewerScopedEntityCompanion<
|
|
55
47
|
TFields,
|
|
@@ -60,7 +52,7 @@ export default class ViewerScopedEntityCompanionProvider {
|
|
|
60
52
|
TSelectedFields
|
|
61
53
|
> {
|
|
62
54
|
return new ViewerScopedEntityCompanion(
|
|
63
|
-
this.entityCompanionProvider.getCompanionForEntity(entityClass
|
|
55
|
+
this.entityCompanionProvider.getCompanionForEntity(entityClass),
|
|
64
56
|
this.viewerContext as TViewerContext
|
|
65
57
|
);
|
|
66
58
|
}
|
|
@@ -9,7 +9,7 @@ import ViewerContext from './ViewerContext';
|
|
|
9
9
|
* Provides a cleaner API for loading entities by passing through the ViewerContext.
|
|
10
10
|
*/
|
|
11
11
|
export default class ViewerScopedEntityLoaderFactory<
|
|
12
|
-
TFields,
|
|
12
|
+
TFields extends object,
|
|
13
13
|
TID extends NonNullable<TFields[TSelectedFields]>,
|
|
14
14
|
TViewerContext extends ViewerContext,
|
|
15
15
|
TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
|
|
@@ -9,7 +9,7 @@ import ViewerContext from './ViewerContext';
|
|
|
9
9
|
* Provides a cleaner API for mutating entities by passing through the ViewerContext.
|
|
10
10
|
*/
|
|
11
11
|
export default class ViewerScopedEntityMutatorFactory<
|
|
12
|
-
TFields,
|
|
12
|
+
TFields extends object,
|
|
13
13
|
TID extends NonNullable<TFields[TSelectedFields]>,
|
|
14
14
|
TViewerContext extends ViewerContext,
|
|
15
15
|
TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import invariant from 'invariant';
|
|
2
2
|
|
|
3
3
|
import ComposedEntityCacheAdapter from '../ComposedEntityCacheAdapter';
|
|
4
|
-
import EntityCacheAdapter from '../EntityCacheAdapter';
|
|
5
4
|
import EntityConfiguration from '../EntityConfiguration';
|
|
6
5
|
import { UUIDField } from '../EntityFields';
|
|
6
|
+
import IEntityCacheAdapter from '../IEntityCacheAdapter';
|
|
7
7
|
import { CacheLoadResult, CacheStatus } from '../internal/ReadThroughEntityCache';
|
|
8
8
|
|
|
9
9
|
type BlahFields = {
|
|
@@ -23,13 +23,11 @@ const entityConfiguration = new EntityConfiguration<BlahFields>({
|
|
|
23
23
|
export const DOES_NOT_EXIST_LOCAL_MEMORY_CACHE = Symbol('doesNotExist');
|
|
24
24
|
type LocalMemoryCacheValue<TFields> = Readonly<TFields> | typeof DOES_NOT_EXIST_LOCAL_MEMORY_CACHE;
|
|
25
25
|
|
|
26
|
-
class TestLocalCacheAdapter<TFields>
|
|
26
|
+
class TestLocalCacheAdapter<TFields> implements IEntityCacheAdapter<TFields> {
|
|
27
27
|
constructor(
|
|
28
|
-
entityConfiguration: EntityConfiguration<TFields>,
|
|
28
|
+
private readonly entityConfiguration: EntityConfiguration<TFields>,
|
|
29
29
|
private readonly cache: Map<string, LocalMemoryCacheValue<TFields>>
|
|
30
|
-
) {
|
|
31
|
-
super(entityConfiguration);
|
|
32
|
-
}
|
|
30
|
+
) {}
|
|
33
31
|
|
|
34
32
|
public async loadManyAsync<N extends keyof TFields>(
|
|
35
33
|
fieldName: N,
|
|
@@ -123,10 +121,7 @@ function makeTestCacheAdapters(): {
|
|
|
123
121
|
const fallbackCache = new Map();
|
|
124
122
|
const fallbackCacheAdapter = new TestLocalCacheAdapter(entityConfiguration, fallbackCache);
|
|
125
123
|
|
|
126
|
-
const cacheAdapter = new ComposedEntityCacheAdapter(
|
|
127
|
-
primaryCacheAdapter,
|
|
128
|
-
fallbackCacheAdapter,
|
|
129
|
-
]);
|
|
124
|
+
const cacheAdapter = new ComposedEntityCacheAdapter([primaryCacheAdapter, fallbackCacheAdapter]);
|
|
130
125
|
|
|
131
126
|
return {
|
|
132
127
|
primaryCache,
|
|
@@ -229,7 +224,7 @@ describe(ComposedEntityCacheAdapter, () => {
|
|
|
229
224
|
});
|
|
230
225
|
|
|
231
226
|
it('handles 0 cache adapter compose case', async () => {
|
|
232
|
-
const cacheAdapter = new ComposedEntityCacheAdapter(
|
|
227
|
+
const cacheAdapter = new ComposedEntityCacheAdapter<any>([]);
|
|
233
228
|
const results = await cacheAdapter.loadManyAsync('id', []);
|
|
234
229
|
expect(results).toEqual(new Map());
|
|
235
230
|
});
|
|
@@ -222,6 +222,49 @@ describe(EnforcingEntityLoader, () => {
|
|
|
222
222
|
});
|
|
223
223
|
});
|
|
224
224
|
|
|
225
|
+
describe('loadManyByIDsNullableAsync', () => {
|
|
226
|
+
it('throws when result is unsuccessful even when there is a null result', async () => {
|
|
227
|
+
const entityLoaderMock = mock<EntityLoader<any, any, any, any, any, any>>(EntityLoader);
|
|
228
|
+
const rejection = new Error();
|
|
229
|
+
when(entityLoaderMock.loadManyByIDsNullableAsync(anything())).thenResolve(
|
|
230
|
+
new Map(
|
|
231
|
+
Object.entries({
|
|
232
|
+
hello: result(rejection),
|
|
233
|
+
world: null,
|
|
234
|
+
})
|
|
235
|
+
)
|
|
236
|
+
);
|
|
237
|
+
const entityLoader = instance(entityLoaderMock);
|
|
238
|
+
const enforcingEntityLoader = new EnforcingEntityLoader(entityLoader);
|
|
239
|
+
await expect(enforcingEntityLoader.loadManyByIDsNullableAsync(anything())).rejects.toThrow(
|
|
240
|
+
rejection
|
|
241
|
+
);
|
|
242
|
+
});
|
|
243
|
+
|
|
244
|
+
it('returns value when result is successful', async () => {
|
|
245
|
+
const entityLoaderMock = mock<EntityLoader<any, any, any, any, any, any>>(EntityLoader);
|
|
246
|
+
const resolved = {};
|
|
247
|
+
when(entityLoaderMock.loadManyByIDsNullableAsync(anything())).thenResolve(
|
|
248
|
+
new Map(
|
|
249
|
+
Object.entries({
|
|
250
|
+
hello: result(resolved),
|
|
251
|
+
world: null,
|
|
252
|
+
})
|
|
253
|
+
)
|
|
254
|
+
);
|
|
255
|
+
const entityLoader = instance(entityLoaderMock);
|
|
256
|
+
const enforcingEntityLoader = new EnforcingEntityLoader(entityLoader);
|
|
257
|
+
await expect(enforcingEntityLoader.loadManyByIDsNullableAsync(anything())).resolves.toEqual(
|
|
258
|
+
new Map(
|
|
259
|
+
Object.entries({
|
|
260
|
+
hello: resolved,
|
|
261
|
+
world: null,
|
|
262
|
+
})
|
|
263
|
+
)
|
|
264
|
+
);
|
|
265
|
+
});
|
|
266
|
+
});
|
|
267
|
+
|
|
225
268
|
describe('loadFirstByFieldEqualityConjunction', () => {
|
|
226
269
|
it('throws when result is unsuccessful', async () => {
|
|
227
270
|
const entityLoaderMock = mock<EntityLoader<any, any, any, any, any, any>>(EntityLoader);
|
|
@@ -330,6 +373,7 @@ describe(EnforcingEntityLoader, () => {
|
|
|
330
373
|
'tryConstructEntities',
|
|
331
374
|
'validateFieldValues',
|
|
332
375
|
'constructAndAuthorizeEntitiesAsync',
|
|
376
|
+
'constructEntity',
|
|
333
377
|
];
|
|
334
378
|
expect(loaderProperties).toEqual(expect.arrayContaining(knownLoaderOnlyDifferences));
|
|
335
379
|
|
|
@@ -26,7 +26,12 @@ describe(Entity, () => {
|
|
|
26
26
|
const data = {
|
|
27
27
|
id: 'what',
|
|
28
28
|
};
|
|
29
|
-
const testEntity = new SimpleTestEntity(
|
|
29
|
+
const testEntity = new SimpleTestEntity({
|
|
30
|
+
viewerContext,
|
|
31
|
+
id: 'what',
|
|
32
|
+
databaseFields: data,
|
|
33
|
+
selectedFields: data,
|
|
34
|
+
});
|
|
30
35
|
expect(SimpleTestEntity.updater(testEntity)).toBeInstanceOf(UpdateMutator);
|
|
31
36
|
});
|
|
32
37
|
});
|
|
@@ -38,7 +43,12 @@ describe(Entity, () => {
|
|
|
38
43
|
const data = {
|
|
39
44
|
id: 'what',
|
|
40
45
|
};
|
|
41
|
-
const testEntity = new SimpleTestDenyDeleteEntity(
|
|
46
|
+
const testEntity = new SimpleTestDenyDeleteEntity({
|
|
47
|
+
viewerContext,
|
|
48
|
+
id: 'what',
|
|
49
|
+
databaseFields: data,
|
|
50
|
+
selectedFields: data,
|
|
51
|
+
});
|
|
42
52
|
const canViewerUpdate = await SimpleTestDenyDeleteEntity.canViewerUpdateAsync(testEntity);
|
|
43
53
|
expect(canViewerUpdate).toBe(true);
|
|
44
54
|
});
|
|
@@ -49,7 +59,12 @@ describe(Entity, () => {
|
|
|
49
59
|
const data = {
|
|
50
60
|
id: 'what',
|
|
51
61
|
};
|
|
52
|
-
const testEntity = new SimpleTestDenyUpdateEntity(
|
|
62
|
+
const testEntity = new SimpleTestDenyUpdateEntity({
|
|
63
|
+
viewerContext,
|
|
64
|
+
id: 'what',
|
|
65
|
+
databaseFields: data,
|
|
66
|
+
selectedFields: data,
|
|
67
|
+
});
|
|
53
68
|
const canViewerUpdate = await SimpleTestDenyUpdateEntity.canViewerUpdateAsync(testEntity);
|
|
54
69
|
expect(canViewerUpdate).toBe(false);
|
|
55
70
|
});
|
|
@@ -62,7 +77,12 @@ describe(Entity, () => {
|
|
|
62
77
|
const data = {
|
|
63
78
|
id: 'what',
|
|
64
79
|
};
|
|
65
|
-
const testEntity = new SimpleTestDenyUpdateEntity(
|
|
80
|
+
const testEntity = new SimpleTestDenyUpdateEntity({
|
|
81
|
+
viewerContext,
|
|
82
|
+
id: 'what',
|
|
83
|
+
databaseFields: data,
|
|
84
|
+
selectedFields: data,
|
|
85
|
+
});
|
|
66
86
|
const canViewerDelete = await SimpleTestDenyUpdateEntity.canViewerDeleteAsync(testEntity);
|
|
67
87
|
expect(canViewerDelete).toBe(true);
|
|
68
88
|
});
|
|
@@ -73,7 +93,12 @@ describe(Entity, () => {
|
|
|
73
93
|
const data = {
|
|
74
94
|
id: 'what',
|
|
75
95
|
};
|
|
76
|
-
const testEntity = new SimpleTestDenyDeleteEntity(
|
|
96
|
+
const testEntity = new SimpleTestDenyDeleteEntity({
|
|
97
|
+
viewerContext,
|
|
98
|
+
id: 'what',
|
|
99
|
+
databaseFields: data,
|
|
100
|
+
selectedFields: data,
|
|
101
|
+
});
|
|
77
102
|
const canViewerDelete = await SimpleTestDenyDeleteEntity.canViewerDeleteAsync(testEntity);
|
|
78
103
|
expect(canViewerDelete).toBe(false);
|
|
79
104
|
});
|
|
@@ -177,37 +202,33 @@ class SimpleTestDenyDeleteEntityPrivacyPolicy extends EntityPrivacyPolicy<
|
|
|
177
202
|
}
|
|
178
203
|
|
|
179
204
|
class SimpleTestDenyUpdateEntity extends Entity<TestEntityFields, string, ViewerContext> {
|
|
180
|
-
static
|
|
205
|
+
static defineCompanionDefinition(): EntityCompanionDefinition<
|
|
181
206
|
TestEntityFields,
|
|
182
207
|
string,
|
|
183
208
|
ViewerContext,
|
|
184
209
|
SimpleTestDenyUpdateEntity,
|
|
185
210
|
SimpleTestDenyUpdateEntityPrivacyPolicy
|
|
186
211
|
> {
|
|
187
|
-
return
|
|
212
|
+
return {
|
|
213
|
+
entityClass: SimpleTestDenyUpdateEntity,
|
|
214
|
+
entityConfiguration: testEntityConfiguration,
|
|
215
|
+
privacyPolicyClass: SimpleTestDenyUpdateEntityPrivacyPolicy,
|
|
216
|
+
};
|
|
188
217
|
}
|
|
189
218
|
}
|
|
190
219
|
|
|
191
|
-
const simpleTestDenyUpdateEntityCompanion = new EntityCompanionDefinition({
|
|
192
|
-
entityClass: SimpleTestDenyUpdateEntity,
|
|
193
|
-
entityConfiguration: testEntityConfiguration,
|
|
194
|
-
privacyPolicyClass: SimpleTestDenyUpdateEntityPrivacyPolicy,
|
|
195
|
-
});
|
|
196
|
-
|
|
197
220
|
class SimpleTestDenyDeleteEntity extends Entity<TestEntityFields, string, ViewerContext> {
|
|
198
|
-
static
|
|
221
|
+
static defineCompanionDefinition(): EntityCompanionDefinition<
|
|
199
222
|
TestEntityFields,
|
|
200
223
|
string,
|
|
201
224
|
ViewerContext,
|
|
202
225
|
SimpleTestDenyDeleteEntity,
|
|
203
226
|
SimpleTestDenyDeleteEntityPrivacyPolicy
|
|
204
227
|
> {
|
|
205
|
-
return
|
|
228
|
+
return {
|
|
229
|
+
entityClass: SimpleTestDenyDeleteEntity,
|
|
230
|
+
entityConfiguration: testEntityConfiguration,
|
|
231
|
+
privacyPolicyClass: SimpleTestDenyDeleteEntityPrivacyPolicy,
|
|
232
|
+
};
|
|
206
233
|
}
|
|
207
234
|
}
|
|
208
|
-
|
|
209
|
-
const simpleTestDenyDeleteEntityCompanion = new EntityCompanionDefinition({
|
|
210
|
-
entityClass: SimpleTestDenyDeleteEntity,
|
|
211
|
-
entityConfiguration: testEntityConfiguration,
|
|
212
|
-
privacyPolicyClass: SimpleTestDenyDeleteEntityPrivacyPolicy,
|
|
213
|
-
});
|
|
@@ -31,14 +31,32 @@ type BlahFields = {
|
|
|
31
31
|
};
|
|
32
32
|
|
|
33
33
|
class BlahEntity extends Entity<BlahFields, string, TestUserViewerContext> {
|
|
34
|
-
static
|
|
34
|
+
static defineCompanionDefinition(): EntityCompanionDefinition<
|
|
35
35
|
BlahFields,
|
|
36
36
|
string,
|
|
37
37
|
TestUserViewerContext,
|
|
38
38
|
BlahEntity,
|
|
39
39
|
BlahEntityPrivacyPolicy
|
|
40
40
|
> {
|
|
41
|
-
return
|
|
41
|
+
return {
|
|
42
|
+
entityClass: BlahEntity,
|
|
43
|
+
entityConfiguration: new EntityConfiguration<BlahFields>({
|
|
44
|
+
idField: 'id',
|
|
45
|
+
tableName: 'blah_table',
|
|
46
|
+
schema: {
|
|
47
|
+
id: new UUIDField({
|
|
48
|
+
columnName: 'id',
|
|
49
|
+
cache: true,
|
|
50
|
+
}),
|
|
51
|
+
ownerID: new UUIDField({
|
|
52
|
+
columnName: 'owner_id',
|
|
53
|
+
}),
|
|
54
|
+
},
|
|
55
|
+
databaseAdapterFlavor: 'postgres',
|
|
56
|
+
cacheAdapterFlavor: 'redis',
|
|
57
|
+
}),
|
|
58
|
+
privacyPolicyClass: BlahEntityPrivacyPolicy,
|
|
59
|
+
};
|
|
42
60
|
}
|
|
43
61
|
}
|
|
44
62
|
|
|
@@ -84,26 +102,6 @@ class BlahEntityPrivacyPolicy extends EntityPrivacyPolicy<
|
|
|
84
102
|
];
|
|
85
103
|
}
|
|
86
104
|
|
|
87
|
-
const blahCompanion = new EntityCompanionDefinition({
|
|
88
|
-
entityClass: BlahEntity,
|
|
89
|
-
entityConfiguration: new EntityConfiguration<BlahFields>({
|
|
90
|
-
idField: 'id',
|
|
91
|
-
tableName: 'blah_table',
|
|
92
|
-
schema: {
|
|
93
|
-
id: new UUIDField({
|
|
94
|
-
columnName: 'id',
|
|
95
|
-
cache: true,
|
|
96
|
-
}),
|
|
97
|
-
ownerID: new UUIDField({
|
|
98
|
-
columnName: 'owner_id',
|
|
99
|
-
}),
|
|
100
|
-
},
|
|
101
|
-
databaseAdapterFlavor: 'postgres',
|
|
102
|
-
cacheAdapterFlavor: 'redis',
|
|
103
|
-
}),
|
|
104
|
-
privacyPolicyClass: BlahEntityPrivacyPolicy,
|
|
105
|
-
});
|
|
106
|
-
|
|
107
105
|
it('runs through a common workflow', async () => {
|
|
108
106
|
// will be one entity companion provider for each request, so
|
|
109
107
|
// share amongst all VCs created in that request
|
|
@@ -1,27 +1,24 @@
|
|
|
1
1
|
import { instance, mock, when } from 'ts-mockito';
|
|
2
2
|
|
|
3
3
|
import EntityCompanion from '../EntityCompanion';
|
|
4
|
+
import EntityCompanionProvider from '../EntityCompanionProvider';
|
|
4
5
|
import EntityLoaderFactory from '../EntityLoaderFactory';
|
|
5
6
|
import EntityMutatorFactory from '../EntityMutatorFactory';
|
|
6
7
|
import EntityTableDataCoordinator from '../internal/EntityTableDataCoordinator';
|
|
7
8
|
import IEntityMetricsAdapter from '../metrics/IEntityMetricsAdapter';
|
|
8
|
-
import TestEntity, {
|
|
9
|
-
TestEntityPrivacyPolicy,
|
|
10
|
-
testEntityConfiguration,
|
|
11
|
-
TestFields,
|
|
12
|
-
} from '../testfixtures/TestEntity';
|
|
9
|
+
import TestEntity, { testEntityConfiguration, TestFields } from '../testfixtures/TestEntity';
|
|
13
10
|
|
|
14
11
|
describe(EntityCompanion, () => {
|
|
15
12
|
it('correctly instantiates mutator and loader factories', () => {
|
|
13
|
+
const entityCompanionProvider = instance(mock<EntityCompanionProvider>());
|
|
14
|
+
|
|
16
15
|
const tableDataCoordinatorMock = mock<EntityTableDataCoordinator<TestFields>>();
|
|
17
16
|
when(tableDataCoordinatorMock.entityConfiguration).thenReturn(testEntityConfiguration);
|
|
18
17
|
|
|
19
18
|
const companion = new EntityCompanion(
|
|
20
|
-
|
|
19
|
+
entityCompanionProvider,
|
|
20
|
+
TestEntity.defineCompanionDefinition(),
|
|
21
21
|
instance(tableDataCoordinatorMock),
|
|
22
|
-
TestEntityPrivacyPolicy,
|
|
23
|
-
[],
|
|
24
|
-
{},
|
|
25
22
|
instance(mock<IEntityMetricsAdapter>())
|
|
26
23
|
);
|
|
27
24
|
expect(companion.getLoaderFactory()).toBeInstanceOf(EntityLoaderFactory);
|
|
@@ -23,26 +23,34 @@ const blahConfiguration = new EntityConfiguration<BlahFields>({
|
|
|
23
23
|
});
|
|
24
24
|
|
|
25
25
|
class Blah1Entity extends Entity<BlahFields, string, ViewerContext> {
|
|
26
|
-
static
|
|
26
|
+
static defineCompanionDefinition(): EntityCompanionDefinition<
|
|
27
27
|
BlahFields,
|
|
28
28
|
string,
|
|
29
29
|
ViewerContext,
|
|
30
30
|
Blah1Entity,
|
|
31
31
|
NoOpTest1PrivacyPolicy
|
|
32
32
|
> {
|
|
33
|
-
return
|
|
33
|
+
return {
|
|
34
|
+
entityClass: Blah1Entity,
|
|
35
|
+
entityConfiguration: blahConfiguration,
|
|
36
|
+
privacyPolicyClass: NoOpTest1PrivacyPolicy,
|
|
37
|
+
};
|
|
34
38
|
}
|
|
35
39
|
}
|
|
36
40
|
|
|
37
41
|
class Blah2Entity extends Entity<BlahFields, string, ViewerContext> {
|
|
38
|
-
static
|
|
42
|
+
static defineCompanionDefinition(): EntityCompanionDefinition<
|
|
39
43
|
BlahFields,
|
|
40
44
|
string,
|
|
41
45
|
ViewerContext,
|
|
42
46
|
Blah2Entity,
|
|
43
47
|
NoOpTest2PrivacyPolicy
|
|
44
48
|
> {
|
|
45
|
-
return
|
|
49
|
+
return {
|
|
50
|
+
entityClass: Blah2Entity,
|
|
51
|
+
entityConfiguration: blahConfiguration,
|
|
52
|
+
privacyPolicyClass: NoOpTest2PrivacyPolicy,
|
|
53
|
+
};
|
|
46
54
|
}
|
|
47
55
|
}
|
|
48
56
|
|
|
@@ -59,31 +67,11 @@ class NoOpTest2PrivacyPolicy extends EntityPrivacyPolicy<
|
|
|
59
67
|
Blah2Entity
|
|
60
68
|
> {}
|
|
61
69
|
|
|
62
|
-
const blah1CompanionDefinition = new EntityCompanionDefinition({
|
|
63
|
-
entityClass: Blah1Entity,
|
|
64
|
-
entityConfiguration: blahConfiguration,
|
|
65
|
-
privacyPolicyClass: NoOpTest1PrivacyPolicy,
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
const blah2CompanionDefinition = new EntityCompanionDefinition({
|
|
69
|
-
entityClass: Blah2Entity,
|
|
70
|
-
entityConfiguration: blahConfiguration,
|
|
71
|
-
privacyPolicyClass: NoOpTest2PrivacyPolicy,
|
|
72
|
-
});
|
|
73
|
-
|
|
74
70
|
describe(EntityCompanionProvider, () => {
|
|
75
71
|
it('returns different instances for different entity types, but share table data coordinators', () => {
|
|
76
72
|
const entityCompanionProvider = createUnitTestEntityCompanionProvider();
|
|
77
|
-
const companion1 = entityCompanionProvider.getCompanionForEntity(
|
|
78
|
-
|
|
79
|
-
blah1CompanionDefinition
|
|
80
|
-
);
|
|
81
|
-
|
|
82
|
-
const companion2 = entityCompanionProvider.getCompanionForEntity(
|
|
83
|
-
Blah2Entity,
|
|
84
|
-
blah2CompanionDefinition
|
|
85
|
-
);
|
|
86
|
-
|
|
73
|
+
const companion1 = entityCompanionProvider.getCompanionForEntity(Blah1Entity);
|
|
74
|
+
const companion2 = entityCompanionProvider.getCompanionForEntity(Blah2Entity);
|
|
87
75
|
expect(companion1).not.toEqual(companion2);
|
|
88
76
|
expect(companion1['tableDataCoordinator']).toEqual(companion2['tableDataCoordinator']);
|
|
89
77
|
});
|
|
@@ -322,45 +322,78 @@ const makeEntityClasses = (edgeDeletionBehavior: EntityEdgeDeletionBehavior) =>
|
|
|
322
322
|
}
|
|
323
323
|
|
|
324
324
|
class ParentEntity extends Entity<ParentFields, string, TestViewerContext> {
|
|
325
|
-
static
|
|
325
|
+
static defineCompanionDefinition(): EntityCompanionDefinition<
|
|
326
326
|
ParentFields,
|
|
327
327
|
string,
|
|
328
328
|
TestViewerContext,
|
|
329
329
|
ParentEntity,
|
|
330
330
|
TestEntityPrivacyPolicy
|
|
331
331
|
> {
|
|
332
|
-
return
|
|
332
|
+
return {
|
|
333
|
+
entityClass: ParentEntity,
|
|
334
|
+
entityConfiguration: parentEntityConfiguration,
|
|
335
|
+
privacyPolicyClass: TestEntityPrivacyPolicy,
|
|
336
|
+
mutationTriggers: {
|
|
337
|
+
beforeDelete: [new ParentCheckInfoDeletionTrigger()],
|
|
338
|
+
afterDelete: [new ParentCheckInfoDeletionTrigger()],
|
|
339
|
+
|
|
340
|
+
beforeUpdate: [new ParentCheckInfoUpdateTrigger()],
|
|
341
|
+
afterUpdate: [new ParentCheckInfoUpdateTrigger()],
|
|
342
|
+
},
|
|
343
|
+
};
|
|
333
344
|
}
|
|
334
345
|
}
|
|
335
346
|
|
|
336
347
|
class ChildEntity extends Entity<ChildFields, string, TestViewerContext> {
|
|
337
|
-
static
|
|
348
|
+
static defineCompanionDefinition(): EntityCompanionDefinition<
|
|
338
349
|
ChildFields,
|
|
339
350
|
string,
|
|
340
351
|
TestViewerContext,
|
|
341
352
|
ChildEntity,
|
|
342
353
|
TestEntityPrivacyPolicy
|
|
343
354
|
> {
|
|
344
|
-
return
|
|
355
|
+
return {
|
|
356
|
+
entityClass: ChildEntity,
|
|
357
|
+
entityConfiguration: childEntityConfiguration,
|
|
358
|
+
privacyPolicyClass: TestEntityPrivacyPolicy,
|
|
359
|
+
mutationTriggers: {
|
|
360
|
+
beforeDelete: [new ChildCheckInfoDeletionTrigger()],
|
|
361
|
+
afterDelete: [new ChildCheckInfoDeletionTrigger()],
|
|
362
|
+
|
|
363
|
+
beforeUpdate: [new ChildCheckInfoUpdateTrigger()],
|
|
364
|
+
afterUpdate: [new ChildCheckInfoUpdateTrigger()],
|
|
365
|
+
},
|
|
366
|
+
};
|
|
345
367
|
}
|
|
346
368
|
}
|
|
347
369
|
|
|
348
370
|
class GrandChildEntity extends Entity<GrandChildFields, string, TestViewerContext> {
|
|
349
|
-
static
|
|
371
|
+
static defineCompanionDefinition(): EntityCompanionDefinition<
|
|
350
372
|
GrandChildFields,
|
|
351
373
|
string,
|
|
352
374
|
TestViewerContext,
|
|
353
375
|
GrandChildEntity,
|
|
354
376
|
TestEntityPrivacyPolicy
|
|
355
377
|
> {
|
|
356
|
-
return
|
|
378
|
+
return {
|
|
379
|
+
entityClass: GrandChildEntity,
|
|
380
|
+
entityConfiguration: grandChildEntityConfiguration,
|
|
381
|
+
privacyPolicyClass: TestEntityPrivacyPolicy,
|
|
382
|
+
mutationTriggers: {
|
|
383
|
+
beforeDelete: [new GrandChildCheckInfoDeletionTrigger()],
|
|
384
|
+
afterDelete: [new GrandChildCheckInfoDeletionTrigger()],
|
|
385
|
+
|
|
386
|
+
beforeUpdate: [new GrandChildCheckInfoUpdateTrigger()],
|
|
387
|
+
afterUpdate: [new GrandChildCheckInfoUpdateTrigger()],
|
|
388
|
+
},
|
|
389
|
+
};
|
|
357
390
|
}
|
|
358
391
|
}
|
|
359
392
|
|
|
360
393
|
const parentEntityConfiguration = new EntityConfiguration<ParentFields>({
|
|
361
394
|
idField: 'id',
|
|
362
395
|
tableName: 'parents',
|
|
363
|
-
|
|
396
|
+
inboundEdges: [ChildEntity],
|
|
364
397
|
schema: {
|
|
365
398
|
id: new UUIDField({
|
|
366
399
|
columnName: 'id',
|
|
@@ -374,7 +407,7 @@ const makeEntityClasses = (edgeDeletionBehavior: EntityEdgeDeletionBehavior) =>
|
|
|
374
407
|
const childEntityConfiguration = new EntityConfiguration<ChildFields>({
|
|
375
408
|
idField: 'id',
|
|
376
409
|
tableName: 'children',
|
|
377
|
-
|
|
410
|
+
inboundEdges: [GrandChildEntity],
|
|
378
411
|
schema: {
|
|
379
412
|
id: new UUIDField({
|
|
380
413
|
columnName: 'id',
|
|
@@ -384,7 +417,7 @@ const makeEntityClasses = (edgeDeletionBehavior: EntityEdgeDeletionBehavior) =>
|
|
|
384
417
|
columnName: 'parent_id',
|
|
385
418
|
cache: true,
|
|
386
419
|
association: {
|
|
387
|
-
|
|
420
|
+
associatedEntityClass: ParentEntity,
|
|
388
421
|
edgeDeletionBehavior,
|
|
389
422
|
},
|
|
390
423
|
}),
|
|
@@ -405,7 +438,7 @@ const makeEntityClasses = (edgeDeletionBehavior: EntityEdgeDeletionBehavior) =>
|
|
|
405
438
|
columnName: 'parent_id',
|
|
406
439
|
cache: true,
|
|
407
440
|
association: {
|
|
408
|
-
|
|
441
|
+
associatedEntityClass: ChildEntity,
|
|
409
442
|
edgeDeletionBehavior,
|
|
410
443
|
},
|
|
411
444
|
}),
|
|
@@ -414,45 +447,6 @@ const makeEntityClasses = (edgeDeletionBehavior: EntityEdgeDeletionBehavior) =>
|
|
|
414
447
|
cacheAdapterFlavor: 'redis',
|
|
415
448
|
});
|
|
416
449
|
|
|
417
|
-
const parentEntityCompanion = new EntityCompanionDefinition({
|
|
418
|
-
entityClass: ParentEntity,
|
|
419
|
-
entityConfiguration: parentEntityConfiguration,
|
|
420
|
-
privacyPolicyClass: TestEntityPrivacyPolicy,
|
|
421
|
-
mutationTriggers: () => ({
|
|
422
|
-
beforeDelete: [new ParentCheckInfoDeletionTrigger()],
|
|
423
|
-
afterDelete: [new ParentCheckInfoDeletionTrigger()],
|
|
424
|
-
|
|
425
|
-
beforeUpdate: [new ParentCheckInfoUpdateTrigger()],
|
|
426
|
-
afterUpdate: [new ParentCheckInfoUpdateTrigger()],
|
|
427
|
-
}),
|
|
428
|
-
});
|
|
429
|
-
|
|
430
|
-
const childEntityCompanion = new EntityCompanionDefinition({
|
|
431
|
-
entityClass: ChildEntity,
|
|
432
|
-
entityConfiguration: childEntityConfiguration,
|
|
433
|
-
privacyPolicyClass: TestEntityPrivacyPolicy,
|
|
434
|
-
mutationTriggers: () => ({
|
|
435
|
-
beforeDelete: [new ChildCheckInfoDeletionTrigger()],
|
|
436
|
-
afterDelete: [new ChildCheckInfoDeletionTrigger()],
|
|
437
|
-
|
|
438
|
-
beforeUpdate: [new ChildCheckInfoUpdateTrigger()],
|
|
439
|
-
afterUpdate: [new ChildCheckInfoUpdateTrigger()],
|
|
440
|
-
}),
|
|
441
|
-
});
|
|
442
|
-
|
|
443
|
-
const grandChildEntityCompanion = new EntityCompanionDefinition({
|
|
444
|
-
entityClass: GrandChildEntity,
|
|
445
|
-
entityConfiguration: grandChildEntityConfiguration,
|
|
446
|
-
privacyPolicyClass: TestEntityPrivacyPolicy,
|
|
447
|
-
mutationTriggers: () => ({
|
|
448
|
-
beforeDelete: [new GrandChildCheckInfoDeletionTrigger()],
|
|
449
|
-
afterDelete: [new GrandChildCheckInfoDeletionTrigger()],
|
|
450
|
-
|
|
451
|
-
beforeUpdate: [new GrandChildCheckInfoUpdateTrigger()],
|
|
452
|
-
afterUpdate: [new GrandChildCheckInfoUpdateTrigger()],
|
|
453
|
-
}),
|
|
454
|
-
});
|
|
455
|
-
|
|
456
450
|
return {
|
|
457
451
|
ParentEntity,
|
|
458
452
|
ChildEntity,
|