Skip to content

Commit 2a66e59

Browse files
authored
fix(repository): added checks for fields passed as an array in case of findbyid (#122)
added checks for fields passed as an array in function findById. GH-117
1 parent d125f02 commit 2a66e59

File tree

3 files changed

+60
-10
lines changed

3 files changed

+60
-10
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/__tests__/unit/repository/soft-crud.repository.unit.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,16 @@ describe('SoftCrudRepository', () => {
366366
expect(e.message).to.be.equal('EntityNotFound');
367367
}
368368
});
369+
it('should not return soft deleted entry by id, without using deleted in fields filter(fields fileter is passed as array)', async () => {
370+
try {
371+
await repo.findById(3, {
372+
fields: ['id', 'email'],
373+
});
374+
fail();
375+
} catch (e) {
376+
expect(e.message).to.be.equal('EntityNotFound');
377+
}
378+
});
369379
it('should return requested fields only when not using deleted in fields filter', async () => {
370380
const customer = await repo.findById(4, {
371381
fields: {
@@ -385,6 +395,18 @@ describe('SoftCrudRepository', () => {
385395
});
386396
expect(customer).to.have.property('deleted');
387397
});
398+
it('should return requested fields only when not using deleted in fields filter array', async () => {
399+
const customer = await repo.findById(4, {
400+
fields: ['id', 'email'],
401+
});
402+
expect(customer).to.not.have.property('deleted');
403+
});
404+
it('should return requested fields matched with fields filter array', async () => {
405+
const customer = await repo.findById(4, {
406+
fields: ['id', 'email', 'deleted'],
407+
});
408+
expect(customer).to.have.property('deleted');
409+
});
388410
});
389411

390412
describe('findByIdIncludeSoftDelete', () => {

src/repositories/soft-crud.repository.base.ts

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -175,18 +175,46 @@ export abstract class SoftCrudRepository<
175175
[pk]: id,
176176
} as Condition<T>;
177177
}
178-
const finalFilter: Filter<T> = {};
179-
Object.assign(finalFilter, filter);
178+
let finalFilter: Filter<T> = {};
179+
//In case of array of fields, we need to copy the array
180+
// by value and not by reference
181+
finalFilter = {
182+
...filter,
183+
fields:
184+
filter?.fields && Array.isArray(filter.fields)
185+
? [...filter.fields]
186+
: filter.fields,
187+
};
180188
if (finalFilter.fields) {
181-
finalFilter.fields = {
182-
...finalFilter.fields,
183-
deleted: true,
184-
};
189+
if (Array.isArray(finalFilter.fields)) {
190+
const fields = finalFilter.fields as Extract<
191+
keyof SoftDeleteEntity,
192+
string
193+
>[];
194+
if (!fields.includes('deleted')) {
195+
fields.push('deleted');
196+
}
197+
} else {
198+
finalFilter.fields = {
199+
...finalFilter.fields,
200+
deleted: true,
201+
};
202+
}
185203
}
186204
const entity = await super.findById(id, finalFilter, options);
187205
if (entity && !entity.deleted) {
188-
if (filter.fields && !(filter.fields as AnyObject).deleted) {
189-
delete entity.deleted;
206+
if (filter.fields) {
207+
if (Array.isArray(filter.fields)) {
208+
const temp = filter.fields as Extract<
209+
keyof SoftDeleteEntity,
210+
string
211+
>[];
212+
if (!temp.includes('deleted')) {
213+
delete entity.deleted;
214+
}
215+
} else if (!(filter.fields as AnyObject).deleted) {
216+
delete entity.deleted;
217+
}
190218
}
191219
return entity;
192220
} else {

0 commit comments

Comments
 (0)