Skip to content

Commit fcda24f

Browse files
authored
Merge pull request #50 from solanamonk/entity_id_column_option
fix: use a constistent name for entityId column option
2 parents a3d806d + 781dde2 commit fcda24f

6 files changed

+87
-3
lines changed

src/__tests__/entities/advert.entity.ts

+13
Original file line numberDiff line numberDiff line change
@@ -18,4 +18,17 @@ export class AdvertEntity {
1818

1919
@Column({ nullable: true })
2020
entityType: string;
21+
22+
@PolymorphicParent(() => [UserEntity, MerchantEntity], {
23+
entityTypeColumn: 'creatorType',
24+
entityIdColumn: 'creatorId',
25+
eager: true,
26+
})
27+
creator: UserEntity | MerchantEntity;
28+
29+
@Column({ nullable: true })
30+
creatorId: number;
31+
32+
@Column({ nullable: true })
33+
creatorType: string;
2134
}

src/__tests__/entities/merchant.entity.ts

+7
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,11 @@ export class MerchantEntity {
1111
eager: false,
1212
})
1313
adverts: AdvertEntity[];
14+
15+
@PolymorphicChildren(() => AdvertEntity, {
16+
entityTypeColumn: 'creatorType',
17+
entityIdColumn: 'creatorId',
18+
eager: false,
19+
})
20+
createdAdverts: AdvertEntity[];
1421
}

src/__tests__/entities/user.entity.ts

+7
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,11 @@ export class UserEntity {
1111
eager: false,
1212
})
1313
adverts: AdvertEntity[];
14+
15+
@PolymorphicChildren(() => AdvertEntity, {
16+
entityTypeColumn: 'creatorType',
17+
entityIdColumn: 'creatorId',
18+
eager: false,
19+
})
20+
createdAdverts: AdvertEntity[];
1421
}

src/__tests__/polymorphic.repository.spec.ts

+57
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,31 @@ describe('AbstractPolymorphicRepository', () => {
179179
expect(result?.entityId).toBeNull();
180180
expect(result?.entityType).toBeNull();
181181
});
182+
183+
it('Can find entity with customized entity and id columns', async () => {
184+
const repository = AbstractPolymorphicRepository.createRepository(
185+
connection,
186+
AdvertRepository,
187+
);
188+
const userRepository = connection.getRepository(UserEntity);
189+
190+
const user = await userRepository.save(new UserEntity());
191+
192+
const advert = await repository.save(
193+
repository.create({
194+
creator: user,
195+
}),
196+
);
197+
198+
const result = await repository.findOne({ where: { id: advert.id } });
199+
200+
expect(result).toBeInstanceOf(AdvertEntity);
201+
202+
expect(result?.creator).toBeInstanceOf(UserEntity);
203+
expect(result?.creator.id).toBe(result?.creatorId);
204+
expect(result?.creatorType).toBe(UserEntity.name);
205+
expect(result?.creatorId).toBe(result?.creator.id);
206+
});
182207
});
183208

184209
describe('find', () => {
@@ -265,6 +290,38 @@ describe('AbstractPolymorphicRepository', () => {
265290
expect(result?.adverts[0].entityType).toBe(UserEntity.name);
266291
expect(result?.adverts[0].entityId).toBe(user.id);
267292
});
293+
294+
it('Can find parent entity with children with customized entity and id columns', async () => {
295+
const repository = AbstractPolymorphicRepository.createRepository(
296+
connection,
297+
UserRepository,
298+
);
299+
const advertRepository = AbstractPolymorphicRepository.createRepository(
300+
connection,
301+
AdvertRepository,
302+
);
303+
304+
const user = await repository.save(new UserEntity());
305+
306+
const advert = await advertRepository.save(
307+
advertRepository.create({
308+
creator: user,
309+
}),
310+
);
311+
312+
let result = await repository.findOne({
313+
where: { id: user.id },
314+
});
315+
316+
result = await repository.hydrateOne(result);
317+
318+
expect(result).toBeInstanceOf(UserEntity);
319+
expect(result?.createdAdverts).toHaveLength(1);
320+
expect(result?.createdAdverts[0]).toBeInstanceOf(AdvertEntity);
321+
expect(result?.createdAdverts[0].id).toBe(advert.id);
322+
expect(result?.createdAdverts[0].creatorType).toBe(UserEntity.name);
323+
expect(result?.createdAdverts[0].creatorId).toBe(user.id);
324+
});
268325
});
269326
});
270327
});

src/polymorphic.interface.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export interface PolymorphicInterface {
88
hasMany: boolean;
99
primaryColumn?: string;
1010
entityTypeColumn?: string;
11-
entityTypeId?: string;
11+
entityIdColumn?: string;
1212
eager: boolean;
1313
cascade: boolean;
1414
deleteBeforeUpdate: boolean;
@@ -31,7 +31,7 @@ export interface PolymorphicDecoratorOptionsInterface {
3131
cascade?: boolean;
3232
eager?: boolean;
3333
entityTypeColumn?: string;
34-
entityTypeId?: string;
34+
entityIdColumn?: string;
3535
}
3636

3737
export type PolymorphicChildType = {

src/polymorphic.repository.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ type PolymorphicHydrationType = {
3131
const entityTypeColumn = (options: PolymorphicMetadataInterface): string =>
3232
options.entityTypeColumn || 'entityType';
3333
const entityIdColumn = (options: PolymorphicMetadataInterface): string =>
34-
options.entityTypeId || 'entityId';
34+
options.entityIdColumn || 'entityId';
3535
const PrimaryColumn = (options: PolymorphicMetadataInterface): string =>
3636
options.primaryColumn || 'id';
3737

0 commit comments

Comments
 (0)