From 8d4f35ceed8d0013c5481f54eaa2b2fee3866964 Mon Sep 17 00:00:00 2001 From: y-oksaku <43719835+y-oksaku@users.noreply.github.com> Date: Thu, 20 Feb 2025 04:09:00 +0900 Subject: [PATCH] feat(3284): add scmUri param for search pipelines [1] (#3285) Co-authored-by: Ming-Hay <157658916+minghay@users.noreply.github.com> --- plugins/pipelines/list.js | 15 +++++++++++++-- test/plugins/pipelines.test.js | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/plugins/pipelines/list.js b/plugins/pipelines/list.js index 450fb76e7..a2770d9bc 100644 --- a/plugins/pipelines/list.js +++ b/plugins/pipelines/list.js @@ -3,6 +3,7 @@ const joi = require('joi'); const schema = require('screwdriver-data-schema'); const idSchema = schema.models.pipeline.base.extract('id'); +const scmUriSchema = schema.models.pipeline.base.extract('scmUri'); const listSchema = joi.array().items(schema.models.pipeline.get).label('List of Pipelines'); const pipelineIdsSchema = joi.alternatives().try(joi.array().items(idSchema), idSchema).required(); const IDS_KEY = 'ids[]'; @@ -21,7 +22,7 @@ module.exports = () => ({ handler: async (request, h) => { const { pipelineFactory } = request.server.app; - const { sort, configPipelineId, sortBy, search, page, count } = request.query; + const { sort, configPipelineId, sortBy, search, scmUri, page, count } = request.query; const scmContexts = pipelineFactory.scm.getScmContexts(); let pipelineArray = []; @@ -55,6 +56,15 @@ module.exports = () => ({ // See https://www.w3schools.com/sql/sql_like.asp for syntax keyword: `%${search}%` }; + } else if (scmUri) { + // The format of scmUri is 'github.com:123:main:source-dir' + // Search pipelines based on the same repository (include other branch) + const [scm, id] = scmUri.split(':'); + + config.search = { + field: 'scmUri', + keyword: `${scm}:${id}:%` + }; } else { // default list all to 50 max count, according to schema.api.pagination config.paginate = { @@ -118,7 +128,8 @@ module.exports = () => ({ query: schema.api.pagination.concat( joi.object({ configPipelineId: idSchema, - 'ids[]': pipelineIdsSchema.optional() + 'ids[]': pipelineIdsSchema.optional(), + scmUri: scmUriSchema }) ) } diff --git a/test/plugins/pipelines.test.js b/test/plugins/pipelines.test.js index 5fc911618..ea1dba4ac 100644 --- a/test/plugins/pipelines.test.js +++ b/test/plugins/pipelines.test.js @@ -634,6 +634,39 @@ describe('pipeline plugin test', () => { }); }); + it('returns 200 and all pipelines with matched scmUri', () => { + options.url = '/pipelines?scmUri=github.com:123:main'; + pipelineFactoryMock.list + .withArgs({ + params: { + scmContext: 'github:github.com' + }, + sort: 'descending', + search: { + field: 'scmUri', + keyword: 'github.com:123:%' + } + }) + .resolves(getPipelineMocks(testPipelines)); + pipelineFactoryMock.list + .withArgs({ + params: { + scmContext: 'gitlab:mygitlab' + }, + sort: 'descending', + search: { + field: 'scmUri', + keyword: 'github.com:123:%' + } + }) + .resolves([]); + + return server.inject(options).then(reply => { + assert.equal(reply.statusCode, 200); + assert.deepEqual(reply.result, testPipelines); + }); + }); + it('returns 200 and all pipelines with matched configPipelineId', () => { options.url = '/pipelines?page=1&count=3&configPipelineId=123'; pipelineFactoryMock.list