Skip to content

Commit 648de2b

Browse files
committed
feat!: move knex loaders into entity-database-adapter-knex package
1 parent 733b363 commit 648de2b

68 files changed

Lines changed: 2171 additions & 1633 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.ctirc

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,44 +7,42 @@
77
{
88
"project": "packages/entity/tsconfig.json",
99
"output": "packages/entity/src",
10-
"exclude": [
11-
"**/__testfixtures__/**",
12-
"**/__tests__/**"
13-
]
10+
"exclude": [ "**/__testfixtures__/**", "**/__tests__/**" ]
1411
},
1512
{
1613
"project": "packages/entity-cache-adapter-local-memory/tsconfig.json",
1714
"output": "packages/entity-cache-adapter-local-memory/src",
18-
"exclude": [ "**/__testfixtures__/**" ]
15+
"exclude": [ "**/__testfixtures__/**", "**/__tests__/**" ]
1916
},
2017
{
2118
"project": "packages/entity-cache-adapter-redis/tsconfig.json",
2219
"output": "packages/entity-cache-adapter-redis/src",
23-
"exclude": [ "**/__testfixtures__/**" ]
20+
"exclude": [ "**/__testfixtures__/**", "**/__tests__/**" ]
2421
},
2522
{
2623
"project": "packages/entity-database-adapter-knex/tsconfig.json",
2724
"output": "packages/entity-database-adapter-knex/src",
28-
"exclude": [ "**/__testfixtures__/**" ]
25+
"exclude": [ "**/__testfixtures__/**", "**/__tests__/**" ]
2926
},
3027
{
3128
"project": "packages/entity-ip-address-field/tsconfig.json",
3229
"output": "packages/entity-ip-address-field/src",
30+
"exclude": [ "**/__testfixtures__/**", "**/__tests__/**" ]
3331
},
3432
{
3533
"project": "packages/entity-secondary-cache-local-memory/tsconfig.json",
3634
"output": "packages/entity-secondary-cache-local-memory/src",
37-
"exclude": [ "**/__tests__/**" ]
35+
"exclude": [ "**/__testfixtures__/**", "**/__tests__/**" ]
3836
},
3937
{
4038
"project": "packages/entity-secondary-cache-redis/tsconfig.json",
4139
"output": "packages/entity-secondary-cache-redis/src",
42-
"exclude": [ "**/__testfixtures__/**" ]
40+
"exclude": [ "**/__testfixtures__/**", "**/__tests__/**" ]
4341
},
4442
{
4543
"project": "packages/entity-testing-utils/tsconfig.json",
4644
"output": "packages/entity-testing-utils/src",
47-
"exclude": [ "**/__testfixtures__/**" ]
45+
"exclude": [ "**/__testfixtures__/**", "**/__tests__/**" ]
4846
}
4947
]
5048
}

packages/entity-cache-adapter-local-memory/src/__tests__/GenericLocalMemoryCacher-full-test.ts

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {
22
CacheStatus,
3+
GenericEntityCacheAdapter,
34
IEntityGenericCacher,
45
SingleFieldHolder,
56
SingleFieldValueHolder,
@@ -23,12 +24,11 @@ describe(GenericLocalMemoryCacher, () => {
2324
it('has correct caching behavior', async () => {
2425
const entityCompanionProvider = createLocalMemoryTestEntityCompanionProvider();
2526
const viewerContext = new ViewerContext(entityCompanionProvider);
26-
const genericCacher = viewerContext.entityCompanionProvider.getCompanionForEntity(
27-
LocalMemoryTestEntity,
28-
)['tableDataCoordinator']['cacheAdapter']['genericCacher'] as IEntityGenericCacher<
29-
LocalMemoryTestEntityFields,
30-
'id'
31-
>;
27+
const genericCacher = (
28+
viewerContext.entityCompanionProvider.getCompanionForEntity(LocalMemoryTestEntity)[
29+
'tableDataCoordinator'
30+
]['cacheAdapter'] as GenericEntityCacheAdapter<LocalMemoryTestEntityFields, 'id'>
31+
)['genericCacher'];
3232

3333
const date = new Date();
3434
const entity1Created = await LocalMemoryTestEntity.creator(viewerContext)
@@ -105,7 +105,7 @@ describe(GenericLocalMemoryCacher, () => {
105105
expect(entityNonExistentResult2.ok).toBe(false);
106106

107107
// invalidate from cache to ensure it invalidates correctly
108-
await LocalMemoryTestEntity.loaderUtils(viewerContext).invalidateFieldsAsync(
108+
await LocalMemoryTestEntity.invalidationUtils(viewerContext).invalidateFieldsAsync(
109109
entity1.getAllFields(),
110110
);
111111
const keys = genericCacher.makeCacheKeysForInvalidation(
@@ -121,12 +121,11 @@ describe(GenericLocalMemoryCacher, () => {
121121
it('respects the parameters of a noop cache', async () => {
122122
const entityCompanionProvider = createNoOpLocalMemoryIntegrationTestEntityCompanionProvider();
123123
const viewerContext = new ViewerContext(entityCompanionProvider);
124-
const genericCacher = viewerContext.entityCompanionProvider.getCompanionForEntity(
125-
LocalMemoryTestEntity,
126-
)['tableDataCoordinator']['cacheAdapter']['genericCacher'] as IEntityGenericCacher<
127-
LocalMemoryTestEntityFields,
128-
'id'
129-
>;
124+
const genericCacher = (
125+
viewerContext.entityCompanionProvider.getCompanionForEntity(LocalMemoryTestEntity)[
126+
'tableDataCoordinator'
127+
]['cacheAdapter'] as GenericEntityCacheAdapter<LocalMemoryTestEntityFields, 'id'>
128+
)['genericCacher'];
130129
const cacheKeyMaker = genericCacher['makeCacheKeyForStorage'].bind(genericCacher);
131130

132131
const date = new Date();

packages/entity-cache-adapter-redis/src/__integration-tests__/BatchedRedisCacheAdapter-integration-test.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Batcher } from '@expo/batcher';
22
import {
3-
IEntityGenericCacher,
3+
GenericEntityCacheAdapter,
44
SingleFieldHolder,
55
SingleFieldValueHolder,
66
ViewerContext,
@@ -109,12 +109,11 @@ describe(GenericRedisCacher, () => {
109109

110110
const mgetSpy = jest.spyOn(redis, 'mget');
111111

112-
const genericCacher = viewerContext.entityCompanionProvider.getCompanionForEntity(
113-
RedisTestEntity,
114-
)['tableDataCoordinator']['cacheAdapter']['genericCacher'] as IEntityGenericCacher<
115-
RedisTestEntityFields,
116-
'id'
117-
>;
112+
const genericCacher = (
113+
viewerContext.entityCompanionProvider.getCompanionForEntity(RedisTestEntity)[
114+
'tableDataCoordinator'
115+
]['cacheAdapter'] as GenericEntityCacheAdapter<RedisTestEntityFields, 'id'>
116+
)['genericCacher'];
118117

119118
const entity1Created = await RedisTestEntity.creator(viewerContext)
120119
.setField('name', 'blah')
@@ -187,7 +186,9 @@ describe(GenericRedisCacher, () => {
187186
expect(entityNonExistentResult2.ok).toBe(false);
188187

189188
// invalidate from cache to ensure it invalidates correctly in both caches
190-
await RedisTestEntity.loaderUtils(viewerContext).invalidateFieldsAsync(entity1.getAllFields());
189+
await RedisTestEntity.invalidationUtils(viewerContext).invalidateFieldsAsync(
190+
entity1.getAllFields(),
191+
);
191192
await expect(redis.get(cacheKeyEntity1)).resolves.toBeNull();
192193
await expect(redis.get(cacheKeyEntity1NameField)).resolves.toBeNull();
193194
});

packages/entity-cache-adapter-redis/src/__integration-tests__/GenericRedisCacher-full-integration-test.ts

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {
22
CompositeFieldHolder,
33
CompositeFieldValueHolder,
4-
IEntityGenericCacher,
4+
GenericEntityCacheAdapter,
55
SingleFieldHolder,
66
SingleFieldValueHolder,
77
ViewerContext,
@@ -55,12 +55,11 @@ describe(GenericRedisCacher, () => {
5555
const viewerContext = new TestViewerContext(
5656
createRedisIntegrationTestEntityCompanionProvider(genericRedisCacheContext),
5757
);
58-
const genericCacher = viewerContext.entityCompanionProvider.getCompanionForEntity(
59-
RedisTestEntity,
60-
)['tableDataCoordinator']['cacheAdapter']['genericCacher'] as IEntityGenericCacher<
61-
RedisTestEntityFields,
62-
'id'
63-
>;
58+
const genericCacher = (
59+
viewerContext.entityCompanionProvider.getCompanionForEntity(RedisTestEntity)[
60+
'tableDataCoordinator'
61+
]['cacheAdapter'] as GenericEntityCacheAdapter<RedisTestEntityFields, 'id'>
62+
)['genericCacher'];
6463

6564
const entity1Created = await RedisTestEntity.creator(viewerContext)
6665
.setField('name', 'blah')
@@ -144,7 +143,9 @@ describe(GenericRedisCacher, () => {
144143
expect(entityNonExistentCompositeResult2).toBe(null);
145144

146145
// invalidate from cache to ensure it invalidates correctly
147-
await RedisTestEntity.loaderUtils(viewerContext).invalidateFieldsAsync(entity1.getAllFields());
146+
await RedisTestEntity.invalidationUtils(viewerContext).invalidateFieldsAsync(
147+
entity1.getAllFields(),
148+
);
148149
const cachedValueNullKeys = genericCacher.makeCacheKeysForInvalidation(
149150
new SingleFieldHolder('id'),
150151
new SingleFieldValueHolder(entity1.getID()),

packages/entity-database-adapter-knex/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
"@expo/entity-testing-utils": "workspace:^",
3636
"@jest/globals": "30.2.0",
3737
"pg": "8.18.0",
38+
"ts-mockito": "2.6.1",
3839
"typescript": "5.9.3"
3940
}
4041
}

packages/entity/src/AuthorizationResultBasedKnexEntityLoader.ts renamed to packages/entity-database-adapter-knex/src/AuthorizationResultBasedKnexEntityLoader.ts

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
1+
import {
2+
EntityConstructionUtils,
3+
EntityPrivacyPolicy,
4+
EntityQueryContext,
5+
ReadonlyEntity,
6+
ViewerContext,
7+
IEntityMetricsAdapter,
8+
} from '@expo/entity';
19
import { Result } from '@expo/results';
210

311
import {
412
FieldEqualityCondition,
513
isSingleValueFieldEqualityCondition,
614
QuerySelectionModifiers,
715
QuerySelectionModifiersWithOrderByRaw,
8-
} from './EntityDatabaseAdapter';
9-
import { EntityLoaderUtils } from './EntityLoaderUtils';
10-
import { EntityPrivacyPolicy } from './EntityPrivacyPolicy';
11-
import { EntityQueryContext } from './EntityQueryContext';
12-
import { ReadonlyEntity } from './ReadonlyEntity';
13-
import { ViewerContext } from './ViewerContext';
16+
} from './BasePostgresEntityDatabaseAdapter';
1417
import { EntityKnexDataManager } from './internal/EntityKnexDataManager';
15-
import { IEntityMetricsAdapter } from './metrics/IEntityMetricsAdapter';
1618

1719
/**
1820
* Authorization-result-based knex entity loader for non-data-loader-based load methods.
@@ -38,7 +40,7 @@ export class AuthorizationResultBasedKnexEntityLoader<
3840
private readonly queryContext: EntityQueryContext,
3941
private readonly knexDataManager: EntityKnexDataManager<TFields, TIDField>,
4042
protected readonly metricsAdapter: IEntityMetricsAdapter,
41-
public readonly utils: EntityLoaderUtils<
43+
public readonly constructionUtils: EntityConstructionUtils<
4244
TFields,
4345
TIDField,
4446
TViewerContext,
@@ -77,15 +79,15 @@ export class AuthorizationResultBasedKnexEntityLoader<
7779
const fieldValues = isSingleValueFieldEqualityCondition(fieldEqualityOperand)
7880
? [fieldEqualityOperand.fieldValue]
7981
: fieldEqualityOperand.fieldValues;
80-
this.utils.validateFieldAndValues(fieldEqualityOperand.fieldName, fieldValues);
82+
this.constructionUtils.validateFieldAndValues(fieldEqualityOperand.fieldName, fieldValues);
8183
}
8284

8385
const fieldObjects = await this.knexDataManager.loadManyByFieldEqualityConjunctionAsync(
8486
this.queryContext,
8587
fieldEqualityOperands,
8688
querySelectionModifiers,
8789
);
88-
return await this.utils.constructAndAuthorizeEntitiesArrayAsync(fieldObjects);
90+
return await this.constructionUtils.constructAndAuthorizeEntitiesArrayAsync(fieldObjects);
8991
}
9092

9193
/**
@@ -104,6 +106,6 @@ export class AuthorizationResultBasedKnexEntityLoader<
104106
bindings,
105107
querySelectionModifiers,
106108
);
107-
return await this.utils.constructAndAuthorizeEntitiesArrayAsync(fieldObjects);
109+
return await this.constructionUtils.constructAndAuthorizeEntitiesArrayAsync(fieldObjects);
108110
}
109111
}

0 commit comments

Comments
 (0)