Skip to content

Commit 4e40b2e

Browse files
authored
feat: support entity fields subset of db fields (#49)
1 parent ccbdbc4 commit 4e40b2e

File tree

50 files changed

+1300
-376
lines changed

Some content is hidden

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

50 files changed

+1300
-376
lines changed

.eslintrc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
],
1010
"rules": {
1111
"no-restricted-imports": ["error",{ "paths": [".", "..", "../.."] }],
12-
"tsdoc/syntax": "warn"
12+
"tsdoc/syntax": "warn",
13+
"no-console": "warn"
1314
},
1415
"overrides": [
1516
{

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ describe(RedisCacheAdapter, () => {
4444
const cacheAdapter = vc1.entityCompanionProvider.getCompanionForEntity(
4545
RedisTestEntity,
4646
RedisTestEntity.getCompanionDefinition()
47-
)['cacheAdapter'];
47+
)['tableDataCoordinator']['cacheAdapter'];
4848
const cacheKeyMaker = cacheAdapter['makeCacheKey'].bind(cacheAdapter);
4949

5050
// creating an entity should put it in cache (loader loads it after creation)

packages/entity-cache-adapter-redis/src/__tests__/RedisCacheAdapter-test.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
import { CacheStatus, UUIDField, EntityConfiguration } from '@expo/entity';
1+
import {
2+
CacheStatus,
3+
UUIDField,
4+
EntityConfiguration,
5+
DatabaseAdapterFlavor,
6+
CacheAdapterFlavor,
7+
} from '@expo/entity';
28
import { Redis, Pipeline } from 'ioredis';
39
import { mock, when, instance, anything, verify } from 'ts-mockito';
410

@@ -14,6 +20,8 @@ const entityConfiguration = new EntityConfiguration<BlahFields>({
1420
schema: {
1521
id: new UUIDField({ columnName: 'id', cache: true }),
1622
},
23+
databaseAdapterFlavor: DatabaseAdapterFlavor.POSTGRES,
24+
cacheAdapterFlavor: CacheAdapterFlavor.REDIS,
1725
});
1826

1927
describe(RedisCacheAdapter, () => {

packages/entity-cache-adapter-redis/src/testfixtures/RedisTestEntity.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,12 +85,12 @@ export const redisTestEntityConfiguration = new EntityConfiguration<RedisTestEnt
8585
columnName: 'date_field',
8686
}),
8787
},
88+
databaseAdapterFlavor: DatabaseAdapterFlavor.POSTGRES,
89+
cacheAdapterFlavor: CacheAdapterFlavor.REDIS,
8890
});
8991

90-
const redisTestEntityCompanionDefinition = {
92+
const redisTestEntityCompanionDefinition = new EntityCompanionDefinition({
9193
entityClass: RedisTestEntity,
9294
entityConfiguration: redisTestEntityConfiguration,
93-
databaseAdaptorFlavor: DatabaseAdapterFlavor.POSTGRES,
94-
cacheAdaptorFlavor: CacheAdapterFlavor.REDIS,
9595
privacyPolicyClass: RedisTestEntityPrivacyPolicy,
96-
};
96+
});

packages/entity-database-adapter-knex/src/testfixtures/InvalidTestEntity.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -104,12 +104,12 @@ export const invalidTestEntityConfiguration = new EntityConfiguration<InvalidTes
104104
columnName: 'name',
105105
}),
106106
},
107+
databaseAdapterFlavor: DatabaseAdapterFlavor.POSTGRES,
108+
cacheAdapterFlavor: CacheAdapterFlavor.REDIS,
107109
});
108110

109-
const invalidTestEntityCompanionDefinition = {
111+
const invalidTestEntityCompanionDefinition = new EntityCompanionDefinition({
110112
entityClass: InvalidTestEntity,
111113
entityConfiguration: invalidTestEntityConfiguration,
112-
databaseAdaptorFlavor: DatabaseAdapterFlavor.POSTGRES,
113-
cacheAdaptorFlavor: CacheAdapterFlavor.REDIS,
114114
privacyPolicyClass: InvalidTestEntityPrivacyPolicy,
115-
};
115+
});

packages/entity-database-adapter-knex/src/testfixtures/PostgresTestEntity.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,12 +150,12 @@ export const postgresTestEntityConfiguration = new EntityConfiguration<PostgresT
150150
columnName: 'maybe_json_array_field',
151151
}),
152152
},
153+
databaseAdapterFlavor: DatabaseAdapterFlavor.POSTGRES,
154+
cacheAdapterFlavor: CacheAdapterFlavor.REDIS,
153155
});
154156

155-
const postgresTestEntityCompanionDefinition = {
157+
const postgresTestEntityCompanionDefinition = new EntityCompanionDefinition({
156158
entityClass: PostgresTestEntity,
157159
entityConfiguration: postgresTestEntityConfiguration,
158-
databaseAdaptorFlavor: DatabaseAdapterFlavor.POSTGRES,
159-
cacheAdaptorFlavor: CacheAdapterFlavor.REDIS,
160160
privacyPolicyClass: PostgresTestEntityPrivacyPolicy,
161-
};
161+
});

packages/entity-example/src/entities/NoteEntity.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ export default class NoteEntity extends Entity<NoteFields, string, ExampleViewer
3838
* of entity. In some languages, this would be representable as "abstract" static members
3939
* of the class itself, but TypeScript disallows static generic and abstract methods.
4040
*/
41-
export const noteEntityCompanion = {
41+
export const noteEntityCompanion = new EntityCompanionDefinition({
4242
entityClass: NoteEntity,
4343
entityConfiguration: new EntityConfiguration<NoteFields>({
4444
idField: 'id',
@@ -57,8 +57,8 @@ export const noteEntityCompanion = {
5757
columnName: 'body',
5858
}),
5959
},
60+
databaseAdapterFlavor: DatabaseAdapterFlavor.POSTGRES,
61+
cacheAdapterFlavor: CacheAdapterFlavor.REDIS,
6062
}),
61-
databaseAdaptorFlavor: DatabaseAdapterFlavor.POSTGRES,
62-
cacheAdaptorFlavor: CacheAdapterFlavor.REDIS,
6363
privacyPolicyClass: NotePrivacyPolicy,
64-
};
64+
});

packages/entity/src/EnforcingEntityLoader.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,24 @@ export default class EnforcingEntityLoader<
1313
TFields,
1414
TID,
1515
TViewerContext extends ViewerContext,
16-
TEntity extends ReadonlyEntity<TFields, TID, TViewerContext>,
17-
TPrivacyPolicy extends EntityPrivacyPolicy<TFields, TID, TViewerContext, TEntity>
16+
TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
17+
TPrivacyPolicy extends EntityPrivacyPolicy<
18+
TFields,
19+
TID,
20+
TViewerContext,
21+
TEntity,
22+
TSelectedFields
23+
>,
24+
TSelectedFields extends keyof TFields = keyof TFields
1825
> {
1926
constructor(
2027
private readonly entityLoader: EntityLoader<
2128
TFields,
2229
TID,
2330
TViewerContext,
2431
TEntity,
25-
TPrivacyPolicy
32+
TPrivacyPolicy,
33+
TSelectedFields
2634
>
2735
) {}
2836

packages/entity/src/Entity.ts

Lines changed: 118 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@ import ViewerContext from './ViewerContext';
2828
export default abstract class Entity<
2929
TFields,
3030
TID,
31-
TViewerContext extends ViewerContext
32-
> extends ReadonlyEntity<TFields, TID, TViewerContext> {
31+
TViewerContext extends ViewerContext,
32+
TSelectedFields extends keyof TFields = keyof TFields
33+
> extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields> {
3334
/**
3435
* Vend mutator for creating a new entity in given query context.
3536
* @param viewerContext - viewer context of creating user
@@ -41,16 +42,30 @@ export default abstract class Entity<
4142
TMID,
4243
TMViewerContext extends ViewerContext,
4344
TMViewerContext2 extends TMViewerContext,
44-
TMEntity extends Entity<TMFields, TMID, TMViewerContext>,
45-
TMPrivacyPolicy extends EntityPrivacyPolicy<TMFields, TMID, TMViewerContext, TMEntity>
45+
TMEntity extends Entity<TMFields, TMID, TMViewerContext, TMSelectedFields>,
46+
TMPrivacyPolicy extends EntityPrivacyPolicy<
47+
TMFields,
48+
TMID,
49+
TMViewerContext,
50+
TMEntity,
51+
TMSelectedFields
52+
>,
53+
TMSelectedFields extends keyof TMFields = keyof TMFields
4654
>(
47-
this: IEntityClass<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy>,
55+
this: IEntityClass<
56+
TMFields,
57+
TMID,
58+
TMViewerContext,
59+
TMEntity,
60+
TMPrivacyPolicy,
61+
TMSelectedFields
62+
>,
4863
viewerContext: TMViewerContext2,
4964
queryContext: EntityQueryContext = viewerContext
5065
.getViewerScopedEntityCompanionForClass(this)
5166
.getQueryContextProvider()
5267
.getRegularEntityQueryContext()
53-
): CreateMutator<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy> {
68+
): CreateMutator<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields> {
5469
return viewerContext
5570
.getViewerScopedEntityCompanionForClass(this)
5671
.getMutatorFactory()
@@ -67,17 +82,31 @@ export default abstract class Entity<
6782
TMFields,
6883
TMID,
6984
TMViewerContext extends ViewerContext,
70-
TMEntity extends Entity<TMFields, TMID, TMViewerContext>,
71-
TMPrivacyPolicy extends EntityPrivacyPolicy<TMFields, TMID, TMViewerContext, TMEntity>
85+
TMEntity extends Entity<TMFields, TMID, TMViewerContext, TMSelectedFields>,
86+
TMPrivacyPolicy extends EntityPrivacyPolicy<
87+
TMFields,
88+
TMID,
89+
TMViewerContext,
90+
TMEntity,
91+
TMSelectedFields
92+
>,
93+
TMSelectedFields extends keyof TMFields = keyof TMFields
7294
>(
73-
this: IEntityClass<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy>,
95+
this: IEntityClass<
96+
TMFields,
97+
TMID,
98+
TMViewerContext,
99+
TMEntity,
100+
TMPrivacyPolicy,
101+
TMSelectedFields
102+
>,
74103
existingEntity: TMEntity,
75104
queryContext: EntityQueryContext = existingEntity
76105
.getViewerContext()
77106
.getViewerScopedEntityCompanionForClass(this)
78107
.getQueryContextProvider()
79108
.getRegularEntityQueryContext()
80-
): UpdateMutator<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy> {
109+
): UpdateMutator<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields> {
81110
return existingEntity
82111
.getViewerContext()
83112
.getViewerScopedEntityCompanionForClass(this)
@@ -94,10 +123,24 @@ export default abstract class Entity<
94123
TMFields,
95124
TMID,
96125
TMViewerContext extends ViewerContext,
97-
TMEntity extends Entity<TMFields, TMID, TMViewerContext>,
98-
TMPrivacyPolicy extends EntityPrivacyPolicy<TMFields, TMID, TMViewerContext, TMEntity>
126+
TMEntity extends Entity<TMFields, TMID, TMViewerContext, TMSelectedFields>,
127+
TMPrivacyPolicy extends EntityPrivacyPolicy<
128+
TMFields,
129+
TMID,
130+
TMViewerContext,
131+
TMEntity,
132+
TMSelectedFields
133+
>,
134+
TMSelectedFields extends keyof TMFields = keyof TMFields
99135
>(
100-
this: IEntityClass<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy>,
136+
this: IEntityClass<
137+
TMFields,
138+
TMID,
139+
TMViewerContext,
140+
TMEntity,
141+
TMPrivacyPolicy,
142+
TMSelectedFields
143+
>,
101144
existingEntity: TMEntity,
102145
queryContext: EntityQueryContext = existingEntity
103146
.getViewerContext()
@@ -122,10 +165,24 @@ export default abstract class Entity<
122165
TMFields,
123166
TMID,
124167
TMViewerContext extends ViewerContext,
125-
TMEntity extends Entity<TMFields, TMID, TMViewerContext>,
126-
TMPrivacyPolicy extends EntityPrivacyPolicy<TMFields, TMID, TMViewerContext, TMEntity>
168+
TMEntity extends Entity<TMFields, TMID, TMViewerContext, TMSelectedFields>,
169+
TMPrivacyPolicy extends EntityPrivacyPolicy<
170+
TMFields,
171+
TMID,
172+
TMViewerContext,
173+
TMEntity,
174+
TMSelectedFields
175+
>,
176+
TMSelectedFields extends keyof TMFields = keyof TMFields
127177
>(
128-
this: IEntityClass<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy>,
178+
this: IEntityClass<
179+
TMFields,
180+
TMID,
181+
TMViewerContext,
182+
TMEntity,
183+
TMPrivacyPolicy,
184+
TMSelectedFields
185+
>,
129186
existingEntity: TMEntity,
130187
queryContext: EntityQueryContext = existingEntity
131188
.getViewerContext()
@@ -161,10 +218,24 @@ export default abstract class Entity<
161218
TMFields,
162219
TMID,
163220
TMViewerContext extends ViewerContext,
164-
TMEntity extends Entity<TMFields, TMID, TMViewerContext>,
165-
TMPrivacyPolicy extends EntityPrivacyPolicy<TMFields, TMID, TMViewerContext, TMEntity>
221+
TMEntity extends Entity<TMFields, TMID, TMViewerContext, TMSelectedFields>,
222+
TMPrivacyPolicy extends EntityPrivacyPolicy<
223+
TMFields,
224+
TMID,
225+
TMViewerContext,
226+
TMEntity,
227+
TMSelectedFields
228+
>,
229+
TMSelectedFields extends keyof TMFields = keyof TMFields
166230
>(
167-
this: IEntityClass<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy>,
231+
this: IEntityClass<
232+
TMFields,
233+
TMID,
234+
TMViewerContext,
235+
TMEntity,
236+
TMPrivacyPolicy,
237+
TMSelectedFields
238+
>,
168239
existingEntity: TMEntity,
169240
queryContext: EntityQueryContext = existingEntity
170241
.getViewerContext()
@@ -196,10 +267,24 @@ export default abstract class Entity<
196267
TMFields,
197268
TMID,
198269
TMViewerContext extends ViewerContext,
199-
TMEntity extends Entity<TMFields, TMID, TMViewerContext>,
200-
TMPrivacyPolicy extends EntityPrivacyPolicy<TMFields, TMID, TMViewerContext, TMEntity>
270+
TMEntity extends Entity<TMFields, TMID, TMViewerContext, TMSelectedFields>,
271+
TMPrivacyPolicy extends EntityPrivacyPolicy<
272+
TMFields,
273+
TMID,
274+
TMViewerContext,
275+
TMEntity,
276+
TMSelectedFields
277+
>,
278+
TMSelectedFields extends keyof TMFields = keyof TMFields
201279
>(
202-
this: IEntityClass<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy>,
280+
this: IEntityClass<
281+
TMFields,
282+
TMID,
283+
TMViewerContext,
284+
TMEntity,
285+
TMPrivacyPolicy,
286+
TMSelectedFields
287+
>,
203288
existingEntity: TMEntity,
204289
queryContext: EntityQueryContext = existingEntity
205290
.getViewerContext()
@@ -226,15 +311,23 @@ export interface IEntityClass<
226311
TFields,
227312
TID,
228313
TViewerContext extends ViewerContext,
229-
TEntity extends ReadonlyEntity<TFields, TID, TViewerContext>,
230-
TPrivacyPolicy extends EntityPrivacyPolicy<TFields, TID, TViewerContext, TEntity>
314+
TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
315+
TPrivacyPolicy extends EntityPrivacyPolicy<
316+
TFields,
317+
TID,
318+
TViewerContext,
319+
TEntity,
320+
TSelectedFields
321+
>,
322+
TSelectedFields extends keyof TFields = keyof TFields
231323
> {
232324
new (viewerContext: TViewerContext, obj: Readonly<TFields>): TEntity;
233325
getCompanionDefinition(): EntityCompanionDefinition<
234326
TFields,
235327
TID,
236328
TViewerContext,
237329
TEntity,
238-
TPrivacyPolicy
330+
TPrivacyPolicy,
331+
TSelectedFields
239332
>;
240333
}

0 commit comments

Comments
 (0)