Skip to content

Commit da645cd

Browse files
authored
Merge pull request #48 from solanamonk/permit_nullable_parent
feat: permit nullable parent
2 parents 9663935 + 97ea0d8 commit da645cd

File tree

3 files changed

+43
-12
lines changed

3 files changed

+43
-12
lines changed

src/__tests__/entities/advert.entity.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ export class AdvertEntity {
1313
})
1414
owner: UserEntity | MerchantEntity;
1515

16-
@Column()
16+
@Column({ nullable: true })
1717
entityId: number;
1818

19-
@Column()
19+
@Column({ nullable: true })
2020
entityType: string;
2121
}

src/__tests__/polymorphic.repository.spec.ts

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,6 @@ import { MerchantEntity } from './entities/merchant.entity';
1010
describe('AbstractPolymorphicRepository', () => {
1111
let connection: DataSource;
1212

13-
let userRepository: Repository<UserEntity>;
14-
let repository: AbstractPolymorphicRepository<AdvertEntity>;
15-
1613
beforeAll(async () => {
1714
config({
1815
path: resolve(__dirname, '.', '..', '..', '.env'),
@@ -33,14 +30,14 @@ describe('AbstractPolymorphicRepository', () => {
3330

3431
afterAll(async () => {
3532
await connection.destroy();
33+
});
34+
35+
afterEach(async () => {
36+
const userRepository = connection.getRepository(UserEntity);
37+
const repository = connection.getRepository(AdvertEntity);
3638

3739
await userRepository.createQueryBuilder().delete().execute();
3840
await repository.createQueryBuilder().delete().execute();
39-
40-
await Promise.all([
41-
userRepository.createQueryBuilder().delete().execute(),
42-
repository.createQueryBuilder().delete().execute(),
43-
]);
4441
});
4542

4643
describe('Childen', () => {
@@ -138,6 +135,22 @@ describe('AbstractPolymorphicRepository', () => {
138135
expect(result?.owner.id).toBe(result?.entityId);
139136
expect(result?.entityType).toBe(UserEntity.name);
140137
});
138+
139+
it('Can find entity without parent', async () => {
140+
const repository = AbstractPolymorphicRepository.createRepository(
141+
connection,
142+
AdvertRepository,
143+
);
144+
145+
const advert = await repository.save(repository.create({}));
146+
147+
const result = await repository.findOne({ where: { id: advert.id } });
148+
149+
expect(result).toBeInstanceOf(AdvertEntity);
150+
expect(result?.owner).toBeNull();
151+
expect(result?.entityId).toBeNull();
152+
expect(result?.entityType).toBeNull();
153+
});
141154
});
142155

143156
describe('find', () => {
@@ -170,6 +183,24 @@ describe('AbstractPolymorphicRepository', () => {
170183
expect(res.entityId).toBe(res.owner.id);
171184
});
172185
});
186+
187+
it('Can find entities without parent', async () => {
188+
const repository = AbstractPolymorphicRepository.createRepository(
189+
connection,
190+
AdvertRepository,
191+
);
192+
193+
await repository.save([repository.create({}), repository.create({})]);
194+
195+
const result = await repository.find();
196+
197+
result.forEach((res) => {
198+
expect(res).toBeInstanceOf(AdvertEntity);
199+
expect(res.owner).toBeNull();
200+
expect(res.entityId).toBeNull();
201+
expect(res.entityType).toBeNull();
202+
});
203+
});
173204
});
174205
});
175206
});

src/polymorphic.repository.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ export abstract class AbstractPolymorphicRepository<
127127
return values.reduce<E>((e: E, vals: PolymorphicHydrationType) => {
128128
const values =
129129
vals.type === 'parent' && Array.isArray(vals.values)
130-
? vals.values.filter((v) => typeof v !== 'undefined' && v !== null)
130+
? vals.values.filter((v) => typeof v !== 'undefined')
131131
: vals.values;
132132
const polys =
133133
vals.type === 'parent' && Array.isArray(values) ? values[0] : values; // TODO should be condition for !hasMany
@@ -153,7 +153,7 @@ export abstract class AbstractPolymorphicRepository<
153153
// TODO if not hasMany, should I return if one is found?
154154
const results = await Promise.all(
155155
entityTypes.map((type: Function) =>
156-
this.findPolymorphs(entity, type, options),
156+
type ? this.findPolymorphs(entity, type, options) : null,
157157
),
158158
);
159159

0 commit comments

Comments
 (0)