From df7c7b8e4e29ddca2a3fd345c49d88c61a581b2a Mon Sep 17 00:00:00 2001 From: Florian Schmidt Date: Mon, 27 Jan 2025 07:18:51 +0100 Subject: [PATCH] fix: if a repository is now searched for, a call is made against the Git provider to get a new list of repositories. --- .../src/controllers/threatmodelcontroller.js | 5 ++-- td.server/src/repositories/bitbucketrepo.js | 8 +++--- td.server/src/repositories/githubrepo.js | 4 +-- td.server/src/repositories/gitlabrepo.js | 6 ++--- td.vue/src/components/SelectionPage.vue | 27 ++++++++++++++----- td.vue/src/service/api/threatmodelApi.js | 7 +++-- td.vue/src/store/modules/repository.js | 6 ++--- td.vue/src/views/git/BranchAccess.vue | 6 ++--- td.vue/src/views/git/RepositoryAccess.vue | 23 ++++++++++++++-- .../unit/service/api/threatmodelApi.spec.js | 2 +- 10 files changed, 65 insertions(+), 29 deletions(-) diff --git a/td.server/src/controllers/threatmodelcontroller.js b/td.server/src/controllers/threatmodelcontroller.js index 93b99ecdb..2b1b78d7f 100644 --- a/td.server/src/controllers/threatmodelcontroller.js +++ b/td.server/src/controllers/threatmodelcontroller.js @@ -10,17 +10,18 @@ const repos = (req, res) => responseWrapper.sendResponseAsync(async () => { const repository = repositories.get(); const page = req.query.page || 1; + const searchQuerys = req.query.searchQuery || []; let reposResp; let repos; // backwardly compatible with previous use of env vars GITHUB_USE_SEARCH and GITHUB_SEARCH_QUERY if (env.get().config.REPO_USE_SEARCH === 'true' || env.get().config.GITHUB_USE_SEARCH === 'true') { logger.debug('Using searchAsync'); const searchQuery = env.get().config.REPO_SEARCH_QUERY ?? env.get().config.GITHUB_SEARCH_QUERY; - reposResp = await repository.searchAsync(page, req.provider.access_token, searchQuery); + reposResp = await repository.searchAsync(page, req.provider.access_token, [searchQuery, ...searchQuerys]); repos = reposResp[0].items ?? reposResp[0]; } else { logger.debug('Using reposAsync'); - reposResp = await repository.reposAsync(page, req.provider.access_token); + reposResp = await repository.reposAsync(page, req.provider.access_token, [searchQuerys]); repos = reposResp[0]; } const headers = reposResp[1]; diff --git a/td.server/src/repositories/bitbucketrepo.js b/td.server/src/repositories/bitbucketrepo.js index ecb5c0d06..a3ecf38ad 100644 --- a/td.server/src/repositories/bitbucketrepo.js +++ b/td.server/src/repositories/bitbucketrepo.js @@ -22,10 +22,10 @@ export const getClient = (accessToken) => { return BitbucketClientWrapper.getClient(clientOptions); }; -export const reposAsync = async (page, accessToken) => { +export const reposAsync = async (page, accessToken, searchQuerys = []) => { //Migrated const workspace = env.get().config.BITBUCKET_WORKSPACE; - const repos = await getClient(accessToken).repositories.list({workspace: workspace, page: page, pagelen: 10}); + const repos = await getClient(accessToken).repositories.list({workspace: workspace, page: page, pagelen: 10, q: searchQuerys.join(' AND ')}); const responseRepos = repos.data.values.map((x) => { const newX = {}; @@ -41,10 +41,10 @@ const hasNextPage = (response) => response.data.next !== undefined && response.d const hasPreviousPage = (response) => response.data.previous !== undefined && response.data.previous !== null; //Migrate searchAsync required -const searchAsync = (page, accessToken, searchQuery) => getClient(accessToken).search(). +const searchAsync = (page, accessToken, searchQuerys) => getClient(accessToken).search(). reposAsync({ page: page, - q: searchQuery + q: searchQuerys }); export const userAsync = (accessToken) => getClient(accessToken).users.getAuthedUser(); diff --git a/td.server/src/repositories/githubrepo.js b/td.server/src/repositories/githubrepo.js index 438cc94de..c7a513bca 100644 --- a/td.server/src/repositories/githubrepo.js +++ b/td.server/src/repositories/githubrepo.js @@ -20,8 +20,8 @@ const getClient = (accessToken) => { const reposAsync = (page, accessToken) => getClient(accessToken).me(). reposAsync(page); -const searchAsync = (page, accessToken, searchQuery) => getClient(accessToken).search(). - reposAsync({ page: page, q: searchQuery }); +const searchAsync = (page, accessToken, searchQuerys= []) => getClient(accessToken).search(). + reposAsync({ page: page, q: searchQuerys }); const userAsync = async (accessToken) => { diff --git a/td.server/src/repositories/gitlabrepo.js b/td.server/src/repositories/gitlabrepo.js index cdde0a057..d11008195 100644 --- a/td.server/src/repositories/gitlabrepo.js +++ b/td.server/src/repositories/gitlabrepo.js @@ -23,7 +23,7 @@ export const getClient = (accessToken) => { return GitlabClientWrapper.getClient(clientOptions.auth); }; -export const reposAsync = (page, accessToken) => searchAsync(page, accessToken, undefined); +export const reposAsync = (page, accessToken, searchQuerys = []) => searchAsync(page, accessToken, searchQuerys); export const getPagination = (paginationInfo, page) => { const pagination = {page, next: false, prev: false}; @@ -36,8 +36,8 @@ export const getPagination = (paginationInfo, page) => { return pagination; }; -export const searchAsync = async (page, accessToken, searchQuery) => { - const repos = await getClient(accessToken).Projects.all({page: page, membership: true, showExpanded: true, search: searchQuery}); +export const searchAsync = async (page, accessToken, searchQuerys = []) => { + const repos = await getClient(accessToken).Projects.all({page: page, membership: true, showExpanded: true, search: searchQuerys.join('&')}); repos.data.map((repo) => { repo.full_name = repo.path_with_namespace; return repo; diff --git a/td.vue/src/components/SelectionPage.vue b/td.vue/src/components/SelectionPage.vue index c923dae14..de14ff39e 100644 --- a/td.vue/src/components/SelectionPage.vue +++ b/td.vue/src/components/SelectionPage.vue @@ -17,7 +17,7 @@ @@ -36,7 +36,7 @@ @click="onBackClick"> ... - + - + - +