Skip to content

Commit 614007d

Browse files
[papi]: Add GetSuggestedRepoURLs (#18514)
* [papi]: Add `GetSuggestedRepos` * Rename method * req to be consistent * Move to SCMService * Remove usr impl * Add tests * Revert billing test change * Revert user changes * --
1 parent 93ec6ab commit 614007d

File tree

14 files changed

+775
-48
lines changed

14 files changed

+775
-48
lines changed

components/gitpod-protocol/go/gitpod-service.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ type APIInterface interface {
4242
GetWorkspaceOwner(ctx context.Context, workspaceID string) (res *UserInfo, err error)
4343
GetWorkspaceUsers(ctx context.Context, workspaceID string) (res []*WorkspaceInstanceUser, err error)
4444
GetFeaturedRepositories(ctx context.Context) (res []*WhitelistedRepository, err error)
45+
GetSuggestedContextURLs(ctx context.Context) (res []*string, err error)
4546
GetWorkspace(ctx context.Context, id string) (res *WorkspaceInfo, err error)
4647
IsWorkspaceOwner(ctx context.Context, workspaceID string) (res bool, err error)
4748
CreateWorkspace(ctx context.Context, options *CreateWorkspaceOptions) (res *WorkspaceCreationResult, err error)
@@ -140,6 +141,8 @@ const (
140141
FunctionGetWorkspaceUsers FunctionName = "getWorkspaceUsers"
141142
// FunctionGetFeaturedRepositories is the name of the getFeaturedRepositories function
142143
FunctionGetFeaturedRepositories FunctionName = "getFeaturedRepositories"
144+
// FunctionGetSuggestedContextURLs is the name of the getSuggestedContextURLs function
145+
FunctionGetSuggestedContextURLs FunctionName = "getSuggestedContextURLs"
143146
// FunctionGetWorkspace is the name of the getWorkspace function
144147
FunctionGetWorkspace FunctionName = "getWorkspace"
145148
// FunctionIsWorkspaceOwner is the name of the isWorkspaceOwner function
@@ -1020,6 +1023,24 @@ func (gp *APIoverJSONRPC) ClosePort(ctx context.Context, workspaceID string, por
10201023
return
10211024
}
10221025

1026+
// GetSuggestedContextURLs calls getSuggestedContextURLs on the server
1027+
func (gp *APIoverJSONRPC) GetSuggestedContextURLs(ctx context.Context) (res []*string, err error) {
1028+
if gp == nil {
1029+
err = errNotConnected
1030+
return
1031+
}
1032+
var _params []interface{}
1033+
1034+
var result []*string
1035+
err = gp.C.Call(ctx, "getSuggestedContextURLs", _params, &result)
1036+
if err != nil {
1037+
return
1038+
}
1039+
res = result
1040+
1041+
return
1042+
}
1043+
10231044
// UpdateGitStatus calls UpdateGitStatus on the server
10241045
func (gp *APIoverJSONRPC) UpdateGitStatus(ctx context.Context, workspaceID string, status *WorkspaceInstanceRepoStatus) (err error) {
10251046
if gp == nil {

components/gitpod-protocol/go/mock.go

Lines changed: 44 additions & 44 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Copyright (c) 2023 Gitpod GmbH. All rights reserved.
2+
// Licensed under the GNU Affero General Public License (AGPL).
3+
// See License.AGPL.txt in the project root for license information.
4+
5+
package apiv1
6+
7+
import (
8+
"context"
9+
10+
connect "github.com/bufbuild/connect-go"
11+
v1 "github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1"
12+
"github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1/v1connect"
13+
"github.com/gitpod-io/gitpod/public-api-server/pkg/proxy"
14+
)
15+
16+
func NewSCMService(pool proxy.ServerConnectionPool) *SCMService {
17+
return &SCMService{
18+
connectionPool: pool,
19+
}
20+
}
21+
22+
var _ v1connect.SCMServiceHandler = (*SCMService)(nil)
23+
24+
type SCMService struct {
25+
connectionPool proxy.ServerConnectionPool
26+
27+
v1connect.UnimplementedSCMServiceHandler
28+
}
29+
30+
func (s *SCMService) GetSuggestedRepoURLs(ctx context.Context, req *connect.Request[v1.GetSuggestedRepoURLsRequest]) (*connect.Response[v1.GetSuggestedRepoURLsResponse], error) {
31+
conn, err := getConnection(ctx, s.connectionPool)
32+
if err != nil {
33+
return nil, err
34+
}
35+
36+
reposPtrs, err := conn.GetSuggestedContextURLs(ctx)
37+
if err != nil {
38+
return nil, proxy.ConvertError(err)
39+
}
40+
41+
repos := make([]string, len(reposPtrs))
42+
for i, repoPtr := range reposPtrs {
43+
if repoPtr != nil {
44+
repos[i] = *repoPtr
45+
}
46+
}
47+
48+
return connect.NewResponse(&v1.GetSuggestedRepoURLsResponse{
49+
Repos: repos,
50+
}), nil
51+
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// Copyright (c) 2023 Gitpod GmbH. All rights reserved.
2+
// Licensed under the GNU Affero General Public License (AGPL).
3+
// See License.AGPL.txt in the project root for license information.
4+
5+
package apiv1
6+
7+
import (
8+
"context"
9+
"net/http"
10+
"net/http/httptest"
11+
"testing"
12+
13+
"github.com/bufbuild/connect-go"
14+
"github.com/gitpod-io/gitpod/components/public-api/go/config"
15+
v1 "github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1"
16+
"github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1/v1connect"
17+
protocol "github.com/gitpod-io/gitpod/gitpod-protocol"
18+
"github.com/gitpod-io/gitpod/public-api-server/pkg/auth"
19+
"github.com/gitpod-io/gitpod/public-api-server/pkg/jws"
20+
"github.com/gitpod-io/gitpod/public-api-server/pkg/jws/jwstest"
21+
"github.com/golang/mock/gomock"
22+
"github.com/stretchr/testify/require"
23+
)
24+
25+
func TestSCMService_GetSuggestedRepoURLs(t *testing.T) {
26+
t.Run("proxies request to server", func(t *testing.T) {
27+
serverMock, client := setupSCMService(t)
28+
29+
str := ""
30+
serverMock.EXPECT().GetSuggestedContextURLs(gomock.Any()).Return([]*string{&str}, nil)
31+
32+
retrieved, err := client.GetSuggestedRepoURLs(context.Background(), connect.NewRequest(&v1.GetSuggestedRepoURLsRequest{}))
33+
require.NoError(t, err)
34+
requireEqualProto(t, &v1.GetSuggestedRepoURLsResponse{
35+
Repos: []string{""},
36+
}, retrieved.Msg)
37+
})
38+
}
39+
40+
func setupSCMService(t *testing.T) (*protocol.MockAPIInterface, v1connect.SCMServiceClient) {
41+
t.Helper()
42+
43+
ctrl := gomock.NewController(t)
44+
t.Cleanup(ctrl.Finish)
45+
46+
serverMock := protocol.NewMockAPIInterface(ctrl)
47+
48+
svc := NewSCMService(&FakeServerConnPool{
49+
api: serverMock,
50+
})
51+
52+
keyset := jwstest.GenerateKeySet(t)
53+
rsa256, err := jws.NewRSA256(keyset)
54+
require.NoError(t, err)
55+
56+
_, handler := v1connect.NewSCMServiceHandler(svc, connect.WithInterceptors(auth.NewServerInterceptor(config.SessionConfig{
57+
Issuer: "unitetest.com",
58+
Cookie: config.CookieConfig{
59+
Name: "cookie_jwt",
60+
},
61+
}, rsa256)))
62+
63+
srv := httptest.NewServer(handler)
64+
t.Cleanup(srv.Close)
65+
66+
client := v1connect.NewSCMServiceClient(http.DefaultClient, srv.URL, connect.WithInterceptors(
67+
auth.NewClientInterceptor("auth-token"),
68+
))
69+
70+
return serverMock, client
71+
}

components/public-api-server/pkg/server/server.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,15 +123,15 @@ func Start(logger *logrus.Entry, version string, cfg *config.Configuration) erro
123123

124124
signer = auth.NewHS256Signer([]byte(personalACcessTokenSigningKey))
125125
} else {
126-
log.Info("No Personal Access Token signign key specified, PersonalAccessToken service will be disabled.")
126+
log.Info("No Personal Access Token signing key specified, PersonalAccessToken service will be disabled.")
127127
}
128128

129129
srv.HTTPMux().Handle("/stripe/invoices/webhook", handlers.ContentTypeHandler(stripeWebhookHandler, "application/json"))
130130

131131
oidcService := oidc.NewService(cfg.SessionServiceAddress, dbConn, cipherSet, hs256, 5*time.Minute)
132132

133133
if redisClient == nil {
134-
return fmt.Errorf("no Redis configiured")
134+
return fmt.Errorf("no Redis configured")
135135
}
136136
idpService, err := identityprovider.NewService(strings.TrimSuffix(cfg.PublicURL, "/")+"/idp", identityprovider.NewRedisCache(context.Background(), redisClient))
137137
if err != nil {
@@ -198,6 +198,7 @@ func register(srv *baseserver.Server, deps *registerDependencies) error {
198198
rootHandler.Mount(v1connect.NewWorkspacesServiceHandler(apiv1.NewWorkspaceService(deps.connPool, deps.expClient), handlerOptions...))
199199
rootHandler.Mount(v1connect.NewTeamsServiceHandler(apiv1.NewTeamsService(deps.connPool), handlerOptions...))
200200
rootHandler.Mount(v1connect.NewUserServiceHandler(apiv1.NewUserService(deps.connPool), handlerOptions...))
201+
rootHandler.Mount(v1connect.NewSCMServiceHandler(apiv1.NewSCMService(deps.connPool), handlerOptions...))
201202
rootHandler.Mount(v1connect.NewIDEClientServiceHandler(apiv1.NewIDEClientService(deps.connPool), handlerOptions...))
202203
rootHandler.Mount(v1connect.NewProjectsServiceHandler(apiv1.NewProjectsService(deps.connPool), handlerOptions...))
203204
rootHandler.Mount(v1connect.NewOIDCServiceHandler(apiv1.NewOIDCService(deps.connPool, deps.expClient, deps.dbConn, deps.cipher), handlerOptions...))
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
syntax = "proto3";
2+
3+
package gitpod.experimental.v1;
4+
5+
option go_package = "github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1";
6+
7+
service SCMService {
8+
// GetSuggestedRepoURLs returns a list of suggested repositories to open for
9+
// the user.
10+
rpc GetSuggestedRepoURLs(GetSuggestedRepoURLsRequest)
11+
returns (GetSuggestedRepoURLsResponse) {}
12+
}
13+
14+
message GetSuggestedRepoURLsRequest {}
15+
16+
message GetSuggestedRepoURLsResponse { repeated string repos = 1; }

0 commit comments

Comments
 (0)