diff --git a/package-lock.json b/package-lock.json index 9e6fc4e..c88c137 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "loopback4-soft-delete", - "version": "7.0.2", + "version": "7.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "loopback4-soft-delete", - "version": "7.0.2", + "version": "7.1.0", "license": "MIT", "dependencies": { "@loopback/core": "^4.0.7", diff --git a/src/__tests__/unit/repository/soft-crud.repository.unit.ts b/src/__tests__/unit/repository/soft-crud.repository.unit.ts index eea72b1..cfdaee3 100644 --- a/src/__tests__/unit/repository/soft-crud.repository.unit.ts +++ b/src/__tests__/unit/repository/soft-crud.repository.unit.ts @@ -366,6 +366,16 @@ describe('SoftCrudRepository', () => { expect(e.message).to.be.equal('EntityNotFound'); } }); + it('should not return soft deleted entry by id, without using deleted in fields filter(fields fileter is passed as array)', async () => { + try { + await repo.findById(3, { + fields: ['id', 'email'], + }); + fail(); + } catch (e) { + expect(e.message).to.be.equal('EntityNotFound'); + } + }); it('should return requested fields only when not using deleted in fields filter', async () => { const customer = await repo.findById(4, { fields: { @@ -385,6 +395,18 @@ describe('SoftCrudRepository', () => { }); expect(customer).to.have.property('deleted'); }); + it('should return requested fields only when not using deleted in fields filter array', async () => { + const customer = await repo.findById(4, { + fields: ['id', 'email'], + }); + expect(customer).to.not.have.property('deleted'); + }); + it('should return requested fields matched with fields filter array', async () => { + const customer = await repo.findById(4, { + fields: ['id', 'email', 'deleted'], + }); + expect(customer).to.have.property('deleted'); + }); }); describe('findByIdIncludeSoftDelete', () => { diff --git a/src/repositories/soft-crud.repository.base.ts b/src/repositories/soft-crud.repository.base.ts index be38d38..9017c70 100644 --- a/src/repositories/soft-crud.repository.base.ts +++ b/src/repositories/soft-crud.repository.base.ts @@ -175,18 +175,46 @@ export abstract class SoftCrudRepository< [pk]: id, } as Condition; } - const finalFilter: Filter = {}; - Object.assign(finalFilter, filter); + let finalFilter: Filter = {}; + //In case of array of fields, we need to copy the array + // by value and not by reference + finalFilter = { + ...filter, + fields: + filter?.fields && Array.isArray(filter.fields) + ? [...filter.fields] + : filter.fields, + }; if (finalFilter.fields) { - finalFilter.fields = { - ...finalFilter.fields, - deleted: true, - }; + if (Array.isArray(finalFilter.fields)) { + const fields = finalFilter.fields as Extract< + keyof SoftDeleteEntity, + string + >[]; + if (!fields.includes('deleted')) { + fields.push('deleted'); + } + } else { + finalFilter.fields = { + ...finalFilter.fields, + deleted: true, + }; + } } const entity = await super.findById(id, finalFilter, options); if (entity && !entity.deleted) { - if (filter.fields && !(filter.fields as AnyObject).deleted) { - delete entity.deleted; + if (filter.fields) { + if (Array.isArray(filter.fields)) { + const temp = filter.fields as Extract< + keyof SoftDeleteEntity, + string + >[]; + if (!temp.includes('deleted')) { + delete entity.deleted; + } + } else if (!(filter.fields as AnyObject).deleted) { + delete entity.deleted; + } } return entity; } else {