@expo/entity 0.31.0 → 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 +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 +19 -2
- package/build/EntityLoader.js +41 -5
- 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 +26 -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 +80 -10
- 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 +17 -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 +45 -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 +41 -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 +105 -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
|
@@ -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,
|
|
@@ -87,17 +87,22 @@ export default class TestEntity extends Entity<
|
|
|
87
87
|
ViewerContext,
|
|
88
88
|
TestFieldSelection
|
|
89
89
|
> {
|
|
90
|
-
constructor(
|
|
91
|
-
|
|
90
|
+
constructor(constructorParams: {
|
|
91
|
+
viewerContext: ViewerContext;
|
|
92
|
+
id: string;
|
|
93
|
+
databaseFields: Readonly<TestFields>;
|
|
94
|
+
selectedFields: Readonly<TestFields>;
|
|
95
|
+
}) {
|
|
96
|
+
if (constructorParams.selectedFields.id === ID_SENTINEL_THROW_LITERAL) {
|
|
92
97
|
// eslint-disable-next-line no-throw-literal,@typescript-eslint/no-throw-literal
|
|
93
98
|
throw 'hello';
|
|
94
|
-
} else if (
|
|
99
|
+
} else if (constructorParams.selectedFields.id === ID_SENTINEL_THROW_ERROR) {
|
|
95
100
|
throw new Error('world');
|
|
96
101
|
}
|
|
97
|
-
super(
|
|
102
|
+
super(constructorParams);
|
|
98
103
|
}
|
|
99
104
|
|
|
100
|
-
static
|
|
105
|
+
static defineCompanionDefinition(): EntityCompanionDefinition<
|
|
101
106
|
TestFields,
|
|
102
107
|
string,
|
|
103
108
|
ViewerContext,
|
|
@@ -105,16 +110,14 @@ export default class TestEntity extends Entity<
|
|
|
105
110
|
TestEntityPrivacyPolicy,
|
|
106
111
|
TestFieldSelection
|
|
107
112
|
> {
|
|
108
|
-
return
|
|
113
|
+
return {
|
|
114
|
+
entityClass: TestEntity,
|
|
115
|
+
entityConfiguration: testEntityConfiguration,
|
|
116
|
+
privacyPolicyClass: TestEntityPrivacyPolicy,
|
|
117
|
+
};
|
|
109
118
|
}
|
|
110
119
|
}
|
|
111
120
|
|
|
112
|
-
export const testEntityCompanion = new EntityCompanionDefinition({
|
|
113
|
-
entityClass: TestEntity,
|
|
114
|
-
entityConfiguration: testEntityConfiguration,
|
|
115
|
-
privacyPolicyClass: TestEntityPrivacyPolicy,
|
|
116
|
-
});
|
|
117
|
-
|
|
118
121
|
describe(EntityLoader, () => {
|
|
119
122
|
it('handles thrown errors and literals from constructor', async () => {
|
|
120
123
|
const viewerContext = instance(mock(ViewerContext));
|
|
@@ -158,6 +161,7 @@ describe(EntityLoader, () => {
|
|
|
158
161
|
privacyPolicyEvaluationContext,
|
|
159
162
|
testEntityConfiguration,
|
|
160
163
|
TestEntity,
|
|
164
|
+
/* entitySelectedFields */ undefined,
|
|
161
165
|
privacyPolicy,
|
|
162
166
|
dataManager,
|
|
163
167
|
metricsAdapter
|
|
@@ -2,6 +2,7 @@ import { enforceAsyncResult } from '@expo/results';
|
|
|
2
2
|
import { mock, instance, verify, spy, deepEqual, anyOfClass, anything, when } from 'ts-mockito';
|
|
3
3
|
import { v4 as uuidv4 } from 'uuid';
|
|
4
4
|
|
|
5
|
+
import { OrderByOrdering } from '../EntityDatabaseAdapter';
|
|
5
6
|
import EntityLoader from '../EntityLoader';
|
|
6
7
|
import { EntityPrivacyPolicyEvaluationContext } from '../EntityPrivacyPolicy';
|
|
7
8
|
import ViewerContext from '../ViewerContext';
|
|
@@ -74,6 +75,7 @@ describe(EntityLoader, () => {
|
|
|
74
75
|
privacyPolicyEvaluationContext,
|
|
75
76
|
testEntityConfiguration,
|
|
76
77
|
TestEntity,
|
|
78
|
+
/* entitySelectedFields */ undefined,
|
|
77
79
|
privacyPolicy,
|
|
78
80
|
dataManager,
|
|
79
81
|
metricsAdapter
|
|
@@ -176,6 +178,7 @@ describe(EntityLoader, () => {
|
|
|
176
178
|
privacyPolicyEvaluationContext,
|
|
177
179
|
testEntityConfiguration,
|
|
178
180
|
TestEntity,
|
|
181
|
+
/* entitySelectedFields */ undefined,
|
|
179
182
|
privacyPolicy,
|
|
180
183
|
dataManager,
|
|
181
184
|
metricsAdapter
|
|
@@ -210,6 +213,102 @@ describe(EntityLoader, () => {
|
|
|
210
213
|
).rejects.toThrowError('Entity field not valid: TestEntity (customIdField = not-a-uuid)');
|
|
211
214
|
});
|
|
212
215
|
|
|
216
|
+
it('loads entities with loadFirstByFieldEqualityConjunction', async () => {
|
|
217
|
+
const privacyPolicy = new TestEntityPrivacyPolicy();
|
|
218
|
+
const spiedPrivacyPolicy = spy(privacyPolicy);
|
|
219
|
+
const viewerContext = instance(mock(ViewerContext));
|
|
220
|
+
const privacyPolicyEvaluationContext = instance(mock<EntityPrivacyPolicyEvaluationContext>());
|
|
221
|
+
const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
|
|
222
|
+
const queryContext = StubQueryContextProvider.getQueryContext();
|
|
223
|
+
|
|
224
|
+
const id1 = uuidv4();
|
|
225
|
+
const id2 = uuidv4();
|
|
226
|
+
const id3 = uuidv4();
|
|
227
|
+
const databaseAdapter = new StubDatabaseAdapter<TestFields>(
|
|
228
|
+
testEntityConfiguration,
|
|
229
|
+
StubDatabaseAdapter.convertFieldObjectsToDataStore(
|
|
230
|
+
testEntityConfiguration,
|
|
231
|
+
new Map([
|
|
232
|
+
[
|
|
233
|
+
testEntityConfiguration.tableName,
|
|
234
|
+
[
|
|
235
|
+
{
|
|
236
|
+
customIdField: id1,
|
|
237
|
+
stringField: 'huh',
|
|
238
|
+
intField: 4,
|
|
239
|
+
testIndexedField: '4',
|
|
240
|
+
dateField: new Date(),
|
|
241
|
+
nullableField: null,
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
customIdField: id2,
|
|
245
|
+
stringField: 'huh',
|
|
246
|
+
intField: 4,
|
|
247
|
+
testIndexedField: '5',
|
|
248
|
+
dateField: new Date(),
|
|
249
|
+
nullableField: null,
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
customIdField: id3,
|
|
253
|
+
stringField: 'huh2',
|
|
254
|
+
intField: 4,
|
|
255
|
+
testIndexedField: '6',
|
|
256
|
+
dateField: new Date(),
|
|
257
|
+
nullableField: null,
|
|
258
|
+
},
|
|
259
|
+
],
|
|
260
|
+
],
|
|
261
|
+
])
|
|
262
|
+
)
|
|
263
|
+
);
|
|
264
|
+
const cacheAdapterProvider = new NoCacheStubCacheAdapterProvider();
|
|
265
|
+
const cacheAdapter = cacheAdapterProvider.getCacheAdapter(testEntityConfiguration);
|
|
266
|
+
const entityCache = new ReadThroughEntityCache(testEntityConfiguration, cacheAdapter);
|
|
267
|
+
const dataManager = new EntityDataManager(
|
|
268
|
+
databaseAdapter,
|
|
269
|
+
entityCache,
|
|
270
|
+
StubQueryContextProvider,
|
|
271
|
+
instance(mock<IEntityMetricsAdapter>()),
|
|
272
|
+
TestEntity.name
|
|
273
|
+
);
|
|
274
|
+
const entityLoader = new EntityLoader(
|
|
275
|
+
viewerContext,
|
|
276
|
+
queryContext,
|
|
277
|
+
privacyPolicyEvaluationContext,
|
|
278
|
+
testEntityConfiguration,
|
|
279
|
+
TestEntity,
|
|
280
|
+
/* entitySelectedFields */ undefined,
|
|
281
|
+
privacyPolicy,
|
|
282
|
+
dataManager,
|
|
283
|
+
metricsAdapter
|
|
284
|
+
);
|
|
285
|
+
const result = await entityLoader.loadFirstByFieldEqualityConjunctionAsync(
|
|
286
|
+
[
|
|
287
|
+
{
|
|
288
|
+
fieldName: 'stringField',
|
|
289
|
+
fieldValue: 'huh',
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
fieldName: 'intField',
|
|
293
|
+
fieldValue: 4,
|
|
294
|
+
},
|
|
295
|
+
],
|
|
296
|
+
{ orderBy: [{ fieldName: 'testIndexedField', order: OrderByOrdering.DESCENDING }] }
|
|
297
|
+
);
|
|
298
|
+
expect(result).not.toBeNull();
|
|
299
|
+
expect(result!.ok).toBe(true);
|
|
300
|
+
expect(result!.enforceValue().getField('testIndexedField')).toEqual('5');
|
|
301
|
+
verify(
|
|
302
|
+
spiedPrivacyPolicy.authorizeReadAsync(
|
|
303
|
+
viewerContext,
|
|
304
|
+
queryContext,
|
|
305
|
+
privacyPolicyEvaluationContext,
|
|
306
|
+
anyOfClass(TestEntity),
|
|
307
|
+
anything()
|
|
308
|
+
)
|
|
309
|
+
).once();
|
|
310
|
+
});
|
|
311
|
+
|
|
213
312
|
it('authorizes loaded entities', async () => {
|
|
214
313
|
const privacyPolicy = new TestEntityPrivacyPolicy();
|
|
215
314
|
const spiedPrivacyPolicy = spy(privacyPolicy);
|
|
@@ -257,6 +356,7 @@ describe(EntityLoader, () => {
|
|
|
257
356
|
privacyPolicyEvaluationContext,
|
|
258
357
|
testEntityConfiguration,
|
|
259
358
|
TestEntity,
|
|
359
|
+
/* entitySelectedFields */ undefined,
|
|
260
360
|
privacyPolicy,
|
|
261
361
|
dataManager,
|
|
262
362
|
metricsAdapter
|
|
@@ -289,6 +389,7 @@ describe(EntityLoader, () => {
|
|
|
289
389
|
privacyPolicyEvaluationContext,
|
|
290
390
|
testEntityConfiguration,
|
|
291
391
|
TestEntity,
|
|
392
|
+
/* entitySelectedFields */ undefined,
|
|
292
393
|
privacyPolicy,
|
|
293
394
|
dataManagerInstance,
|
|
294
395
|
metricsAdapter
|
|
@@ -316,6 +417,7 @@ describe(EntityLoader, () => {
|
|
|
316
417
|
privacyPolicyEvaluationContext,
|
|
317
418
|
testEntityConfiguration,
|
|
318
419
|
TestEntity,
|
|
420
|
+
/* entitySelectedFields */ undefined,
|
|
319
421
|
privacyPolicy,
|
|
320
422
|
dataManagerInstance,
|
|
321
423
|
metricsAdapter
|
|
@@ -346,6 +448,7 @@ describe(EntityLoader, () => {
|
|
|
346
448
|
privacyPolicyEvaluationContext,
|
|
347
449
|
testEntityConfiguration,
|
|
348
450
|
TestEntity,
|
|
451
|
+
/* entitySelectedFields */ undefined,
|
|
349
452
|
privacyPolicy,
|
|
350
453
|
dataManagerInstance,
|
|
351
454
|
metricsAdapter
|
|
@@ -390,6 +493,7 @@ describe(EntityLoader, () => {
|
|
|
390
493
|
privacyPolicyEvaluationContext,
|
|
391
494
|
testEntityConfiguration,
|
|
392
495
|
TestEntity,
|
|
496
|
+
/* entitySelectedFields */ undefined,
|
|
393
497
|
privacyPolicy,
|
|
394
498
|
dataManagerInstance,
|
|
395
499
|
metricsAdapter
|
|
@@ -423,6 +527,7 @@ describe(EntityLoader, () => {
|
|
|
423
527
|
privacyPolicyEvaluationContext,
|
|
424
528
|
testEntityConfiguration,
|
|
425
529
|
TestEntity,
|
|
530
|
+
/* entitySelectedFields */ undefined,
|
|
426
531
|
privacyPolicy,
|
|
427
532
|
dataManagerInstance,
|
|
428
533
|
metricsAdapter
|
|
@@ -34,37 +34,35 @@ class BlahEntityPrivacyPolicy extends EntityPrivacyPolicy<
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
class BlahEntity extends Entity<BlahFields, string, ViewerContext> {
|
|
37
|
-
static
|
|
37
|
+
static defineCompanionDefinition(): EntityCompanionDefinition<
|
|
38
38
|
BlahFields,
|
|
39
39
|
string,
|
|
40
40
|
ViewerContext,
|
|
41
41
|
BlahEntity,
|
|
42
42
|
BlahEntityPrivacyPolicy
|
|
43
43
|
> {
|
|
44
|
-
return
|
|
44
|
+
return {
|
|
45
|
+
entityClass: BlahEntity,
|
|
46
|
+
entityConfiguration: new EntityConfiguration<BlahFields>({
|
|
47
|
+
idField: 'id',
|
|
48
|
+
tableName: 'blah_table',
|
|
49
|
+
schema: {
|
|
50
|
+
id: new UUIDField({
|
|
51
|
+
columnName: 'id',
|
|
52
|
+
cache: true,
|
|
53
|
+
}),
|
|
54
|
+
},
|
|
55
|
+
databaseAdapterFlavor: 'postgres',
|
|
56
|
+
cacheAdapterFlavor: 'redis',
|
|
57
|
+
}),
|
|
58
|
+
privacyPolicyClass: BlahEntityPrivacyPolicy,
|
|
59
|
+
mutationTriggers: {
|
|
60
|
+
afterCommit: [new TestNonTransactionalMutationTrigger()],
|
|
61
|
+
},
|
|
62
|
+
};
|
|
45
63
|
}
|
|
46
64
|
}
|
|
47
65
|
|
|
48
|
-
const blahCompanion = new EntityCompanionDefinition({
|
|
49
|
-
entityClass: BlahEntity,
|
|
50
|
-
entityConfiguration: new EntityConfiguration<BlahFields>({
|
|
51
|
-
idField: 'id',
|
|
52
|
-
tableName: 'blah_table',
|
|
53
|
-
schema: {
|
|
54
|
-
id: new UUIDField({
|
|
55
|
-
columnName: 'id',
|
|
56
|
-
cache: true,
|
|
57
|
-
}),
|
|
58
|
-
},
|
|
59
|
-
databaseAdapterFlavor: 'postgres',
|
|
60
|
-
cacheAdapterFlavor: 'redis',
|
|
61
|
-
}),
|
|
62
|
-
privacyPolicyClass: BlahEntityPrivacyPolicy,
|
|
63
|
-
mutationTriggers: () => ({
|
|
64
|
-
afterCommit: [new TestNonTransactionalMutationTrigger()],
|
|
65
|
-
}),
|
|
66
|
-
});
|
|
67
|
-
|
|
68
66
|
class TestNonTransactionalMutationTrigger extends EntityNonTransactionalMutationTrigger<
|
|
69
67
|
BlahFields,
|
|
70
68
|
string,
|