diff --git a/src/routes/projects/list.js b/src/routes/projects/list.js old mode 100644 new mode 100755 index f0968295..987b99f8 --- a/src/routes/projects/list.js +++ b/src/routes/projects/list.js @@ -41,10 +41,28 @@ var _retrieveProjects = (req, criteria, sort, fields) => { let retrieveAttachments = !req.query.fields || req.query.fields.indexOf('attachments') > -1 let retrieveMembers = !req.query.fields || !!fields.project_members.length - - // special handling for name filter - if (_.has(criteria.filters, 'name')) { - criteria.filters.name = { ilike: `%${criteria.filters.name}%`} + // special handling for keyword filter + if (_.has(criteria.filters, 'keyword')) { + criteria.filters.$or = [ + { + name: { + $ilike: `%${criteria.filters.keyword}%` + }, + }, { + description: { + $ilike: `%${criteria.filters.keyword}%` + }, + }, { + details: { + utm: { + code: { + $ilike: `%${criteria.filters.keyword}%` + } + } + } + } + ] + delete criteria.filters.keyword } return models.Project.findAndCountAll({ @@ -117,7 +135,7 @@ module.exports = [ 'name', 'name asc', 'name desc', 'type', 'type asc', 'type desc' ] - if (!util.isValidFilter(filters, ['id', 'status', 'type', 'memberOnly', 'name']) || + if (!util.isValidFilter(filters, ['id', 'status', 'type', 'memberOnly', 'keyword']) || (sort && _.indexOf(sortableProps, sort) < 0)) { util.handleError('Invalid filters or sort', null, req, next) } diff --git a/src/routes/projects/list.spec.js b/src/routes/projects/list.spec.js old mode 100644 new mode 100755 index 9d8221b5..3fec4a6f --- a/src/routes/projects/list.spec.js +++ b/src/routes/projects/list.spec.js @@ -20,7 +20,11 @@ describe('LIST Project', () => { name: 'test1', description: 'test project1', status: 'active', - details: {}, + details: { + utm: { + code: 'code1' + } + }, createdBy: 1, updatedBy: 1 }).then(p => { @@ -175,6 +179,84 @@ describe('LIST Project', () => { done() }) }) - }) + it('should return all projects that match when filtering by name', done => { + request(server) + .get('/v4/projects/?filter=keyword%3Dtest') + .set({ + 'Authorization': 'Bearer ' + testUtil.jwts.admin + }) + .expect('Content-Type', /json/) + .expect(200) + .end(function(err, res) { + if (err) { + return done(err) + } + var resJson = res.body.result.content + should.exist(resJson) + resJson.should.have.lengthOf(3) + done() + }) + }) + + it('should return the project when filtering by keyword, which matches the name', done => { + request(server) + .get('/v4/projects/?filter=keyword%3D1') + .set({ + 'Authorization': 'Bearer ' + testUtil.jwts.admin + }) + .expect('Content-Type', /json/) + .expect(200) + .end(function(err, res) { + if (err) { + return done(err) + } + var resJson = res.body.result.content + should.exist(resJson) + resJson.should.have.lengthOf(1) + resJson[0].name.should.equal('test1') + done() + }) + }) + + it('should return the project when filtering by keyword, which matches the description', done => { + request(server) + .get('/v4/projects/?filter=keyword%3Dproject') + .set({ + 'Authorization': 'Bearer ' + testUtil.jwts.admin + }) + .expect('Content-Type', /json/) + .expect(200) + .end(function(err, res) { + if (err) { + return done(err) + } + var resJson = res.body.result.content + should.exist(resJson) + resJson.should.have.lengthOf(3) + done() + }) + }) + + it('should return the project when filtering by keyword, which matches the details', done => { + request(server) + .get('/v4/projects/?filter=keyword%3Dcode') + .set({ + 'Authorization': 'Bearer ' + testUtil.jwts.admin + }) + .expect('Content-Type', /json/) + .expect(200) + .end(function(err, res) { + if (err) { + return done(err) + } + var resJson = res.body.result.content + should.exist(resJson) + resJson.should.have.lengthOf(1) + resJson[0].name.should.equal('test1') + done() + }) + }) + }) + }) diff --git a/swagger.yaml b/swagger.yaml old mode 100644 new mode 100755 index 33eb66c1..ff0b6b11 --- a/swagger.yaml +++ b/swagger.yaml @@ -48,7 +48,7 @@ paths: - type - status - memberOnly - - name + - keyword - name: sort required: false description: |