diff --git a/src/frontend/packages/cloud-foundry/src/shared/data-services/scm/gitlab-scm.ts b/src/frontend/packages/cloud-foundry/src/shared/data-services/scm/gitlab-scm.ts index 0d6b210764..943a674f9f 100644 --- a/src/frontend/packages/cloud-foundry/src/shared/data-services/scm/gitlab-scm.ts +++ b/src/frontend/packages/cloud-foundry/src/shared/data-services/scm/gitlab-scm.ts @@ -1,6 +1,6 @@ import { HttpClient, HttpErrorResponse } from '@angular/common/http'; -import { Observable, of as observableOf } from 'rxjs'; -import { map } from 'rxjs/operators'; +import { combineLatest, Observable, of as observableOf, of } from 'rxjs'; +import { catchError, map } from 'rxjs/operators'; import { Md5 } from 'ts-md5/dist/md5'; import { GitBranch, GitCommit, GitRepo } from '../../../store/types/git.types'; @@ -29,19 +29,18 @@ export class GitLabSCM implements GitSCM { getRepository(httpClient: HttpClient, projectName: string): Observable { const parts = projectName.split('/'); - let obs$ = httpClient.get(`${gitLabAPIUrl}/users/${parts[0]}/projects?search=${parts[1]}`); - if (parts.length !== 2) { - obs$ = observableOf(null); - } + const obs$ = parts.length !== 2 ? + observableOf(null) : + httpClient.get(`${gitLabAPIUrl}/projects/${parts.join('%2F')}`); return obs$.pipe( map((data: any) => { - if (data.length !== 1) { + if (!data) { throw new HttpErrorResponse({ status: 404 }); } - return this.convertProject(data[0]); + return this.convertProject(data); }) ); } @@ -110,17 +109,25 @@ export class GitLabSCM implements GitSCM { getMatchingRepositories(httpClient: HttpClient, projectName: string): Observable { const prjParts = projectName.split('/'); - let url = `${gitLabAPIUrl}/projects?search=${projectName}`; - if (prjParts.length > 1) { - url = `${gitLabAPIUrl}/users/${prjParts[0]}/projects?search=${prjParts[1]}`; - } - return httpClient.get(url).pipe( - map((repos: any) => { - return repos.map(item => item.path_with_namespace); - }) + + const obs$ = prjParts.length > 1 ? + this.getMatchingUserGroupRepositories(httpClient, prjParts) : + httpClient.get(`${gitLabAPIUrl}/projects?search=${projectName}`); + + return obs$.pipe( + map((repos: any[]) => repos.map(item => item.path_with_namespace)), ); } + private getMatchingUserGroupRepositories(httpClient: HttpClient, prjParts: string[]): Observable { + return combineLatest([ + httpClient.get<[]>(`${gitLabAPIUrl}/users/${prjParts[0]}/projects/?search=${prjParts[1]}`).pipe(catchError(() => of([]))), + httpClient.get<[]>(`${gitLabAPIUrl}/groups/${prjParts[0]}/projects?search=${prjParts[1]}`).pipe(catchError(() => of([]))), + ]).pipe( + map(([a, b]: [any[], any[]]) => a.concat(b)), + ) + } + private convertProject(prj: any): GitRepo { return { ...prj, diff --git a/src/frontend/packages/cloud-foundry/src/store/effects/deploy-app.effects.ts b/src/frontend/packages/cloud-foundry/src/store/effects/deploy-app.effects.ts index 11a4310bf8..58a30bbace 100644 --- a/src/frontend/packages/cloud-foundry/src/store/effects/deploy-app.effects.ts +++ b/src/frontend/packages/cloud-foundry/src/store/effects/deploy-app.effects.ts @@ -52,8 +52,8 @@ export function createFailedGithubRequestMessage(error: any, logger: LoggerServi const response = parseHttpPipeError(error, logger); const message = response.message || ''; return error.status === 403 && message.startsWith('API rate limit exceeded for') ? - 'Github ' + message.substring(0, message.indexOf('(')) : - 'Github request failed'; + 'Git ' + message.substring(0, message.indexOf('(')) : + 'Git request failed'; } @Injectable()