Skip to content

Commit aca6a81

Browse files
committed
[server] handle searchRepositories
1 parent ae72514 commit aca6a81

File tree

4 files changed

+71
-47
lines changed

4 files changed

+71
-47
lines changed

components/gitpod-protocol/src/public-api-converter.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ import {
4343
EnvironmentVariableAdmission,
4444
UserEnvironmentVariable,
4545
} from "@gitpod/public-api/lib/gitpod/v1/envvar_pb";
46-
import { SCMToken } from "@gitpod/public-api/lib/gitpod/v1/scm_pb";
46+
import { SCMToken, SuggestedRepository } from "@gitpod/public-api/lib/gitpod/v1/scm_pb";
4747
import { ContextURL } from "./context-url";
4848
import { ApplicationError, ErrorCode, ErrorCodes } from "./messaging/error";
4949
import {
@@ -59,6 +59,7 @@ import {
5959
UserEnvVarValue,
6060
ProjectEnvVar,
6161
Token,
62+
SuggestedRepository as SuggestedRepositoryProtocol,
6263
} from "./protocol";
6364
import {
6465
OrgMemberInfo,
@@ -556,4 +557,13 @@ export class PublicAPIConverter {
556557
idToken: t.idToken,
557558
});
558559
}
560+
561+
toSuggestedRepository(r: SuggestedRepositoryProtocol): SuggestedRepository {
562+
return new SuggestedRepository({
563+
url: r.url,
564+
repoName: r.repositoryName,
565+
configurationId: r.projectId,
566+
configurationName: r.projectName,
567+
});
568+
}
559569
}

components/server/src/api/scm-service-api.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export class ScmServiceAPI implements ServiceImpl<typeof ScmServiceInterface> {
4141

4242
async guessTokenScopes(
4343
request: GuessTokenScopesRequest,
44-
context: HandlerContext,
44+
_context: HandlerContext,
4545
): Promise<GuessTokenScopesResponse> {
4646
const userId = ctxUserId();
4747
const { scopes, message } = await this.scmService.guessTokenScopes(userId, request);
@@ -53,14 +53,21 @@ export class ScmServiceAPI implements ServiceImpl<typeof ScmServiceInterface> {
5353

5454
async searchRepositories(
5555
request: SearchRepositoriesRequest,
56-
context: HandlerContext,
56+
_context: HandlerContext,
5757
): Promise<SearchRepositoriesResponse> {
58-
throw new ConnectError("unimplemented", Code.Unimplemented);
58+
const userId = ctxUserId();
59+
const repos = await this.scmService.searchRepositories(userId, {
60+
searchString: request.searchString,
61+
limit: request.limit,
62+
});
63+
return new SearchRepositoriesResponse({
64+
repositories: repos.map((r) => this.apiConverter.toSuggestedRepository(r)),
65+
});
5966
}
6067

6168
async listSuggestedRepositories(
6269
request: ListSuggestedRepositoriesRequest,
63-
context: HandlerContext,
70+
_context: HandlerContext,
6471
): Promise<ListSuggestedRepositoriesResponse> {
6572
throw new ConnectError("unimplemented", Code.Unimplemented);
6673
}

components/server/src/scm/scm-service.ts

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,19 @@ import { inject, injectable } from "inversify";
88
import { Authorizer } from "../authorization/authorizer";
99
import { Config } from "../config";
1010
import { TokenProvider } from "../user/token-provider";
11-
import { Project, Token, User } from "@gitpod/gitpod-protocol";
11+
import { Project, SuggestedRepository, Token, User } from "@gitpod/gitpod-protocol";
1212
import { HostContextProvider } from "../auth/host-context-provider";
1313
import { RepoURL } from "../repohost";
1414
import { log } from "@gitpod/gitpod-protocol/lib/util/logging";
1515
import { AuthProviderService } from "../auth/auth-provider-service";
1616
import { UserService } from "../user/user-service";
1717
import { GitTokenScopeGuesser } from "../workspace/git-token-scope-guesser";
1818
import { ApplicationError, ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error";
19+
import {
20+
SuggestedRepositoryWithSorting,
21+
sortSuggestedRepositories,
22+
suggestionFromUserRepo,
23+
} from "../workspace/suggested-repos-sorter";
1924

2025
@injectable()
2126
export class ScmService {
@@ -74,4 +79,45 @@ export class ScmService {
7479
currentToken,
7580
});
7681
}
82+
83+
public async searchRepositories(userId: string, params: { searchString: string; limit?: number }) {
84+
const user = await this.userService.findUserById(userId, userId);
85+
const hosts = (await this.authProviderService.getAuthProviderDescriptions(user)).map((p) => p.host);
86+
87+
const limit: number = params.limit || 30;
88+
89+
const providerRepos = await Promise.all(
90+
hosts.map(async (host): Promise<SuggestedRepositoryWithSorting[]> => {
91+
try {
92+
const hostContext = this.hostContextProvider.get(host);
93+
const services = hostContext?.services;
94+
if (!services) {
95+
return [];
96+
}
97+
const repos = await services.repositoryProvider.searchRepos(user, params.searchString, limit);
98+
99+
return repos.map((r) =>
100+
suggestionFromUserRepo({
101+
url: r.url.replace(/\.git$/, ""),
102+
repositoryName: r.name,
103+
}),
104+
);
105+
} catch (error) {
106+
log.warn("Could not search repositories from host " + host, error);
107+
}
108+
109+
return [];
110+
}),
111+
);
112+
113+
const sortedRepos = sortSuggestedRepositories(providerRepos.flat());
114+
115+
//return only the first 'limit' results
116+
return sortedRepos.slice(0, limit).map(
117+
(repo): SuggestedRepository => ({
118+
url: repo.url,
119+
repositoryName: repo.repositoryName,
120+
}),
121+
);
122+
}
77123
}

components/server/src/workspace/gitpod-server-impl.ts

Lines changed: 2 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1484,49 +1484,10 @@ export class GitpodServerImpl implements GitpodServerWithTracing, Disposable {
14841484
ctx: TraceContext,
14851485
params: SearchRepositoriesParams,
14861486
): Promise<SuggestedRepository[]> {
1487+
traceAPIParams(ctx, { params });
14871488
const user = await this.checkAndBlockUser("searchRepositories");
14881489

1489-
const logCtx: LogContext = { userId: user.id };
1490-
const limit: number = params.limit || 30;
1491-
1492-
// Search repos across scm providers for this user
1493-
// Will search personal, and org repos
1494-
const authProviders = await this.getAuthProviders(ctx);
1495-
1496-
const providerRepos = await Promise.all(
1497-
authProviders.map(async (p): Promise<SuggestedRepositoryWithSorting[]> => {
1498-
try {
1499-
const hostContext = this.hostContextProvider.get(p.host);
1500-
const services = hostContext?.services;
1501-
if (!services) {
1502-
log.error(logCtx, "Unsupported repository host: " + p.host);
1503-
return [];
1504-
}
1505-
const repos = await services.repositoryProvider.searchRepos(user, params.searchString, limit);
1506-
1507-
return repos.map((r) =>
1508-
suggestionFromUserRepo({
1509-
url: r.url.replace(/\.git$/, ""),
1510-
repositoryName: r.name,
1511-
}),
1512-
);
1513-
} catch (error) {
1514-
log.warn(logCtx, "Could not search repositories from host " + p.host, error);
1515-
}
1516-
1517-
return [];
1518-
}),
1519-
);
1520-
1521-
const sortedRepos = sortSuggestedRepositories(providerRepos.flat());
1522-
1523-
//return only the first 'limit' results
1524-
return sortedRepos.slice(0, limit).map(
1525-
(repo): SuggestedRepository => ({
1526-
url: repo.url,
1527-
repositoryName: repo.repositoryName,
1528-
}),
1529-
);
1490+
return await this.scmService.searchRepositories(user.id, params);
15301491
}
15311492

15321493
public async setWorkspaceTimeout(

0 commit comments

Comments
 (0)