Skip to content

Commit 0cb0729

Browse files
committed
[public-api] Initial stub implemention for CreateToken
1 parent d9bd0bf commit 0cb0729

File tree

2 files changed

+75
-12
lines changed

2 files changed

+75
-12
lines changed

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

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"context"
99
"errors"
1010
"fmt"
11+
"strings"
1112

1213
"github.com/bufbuild/connect-go"
1314
"github.com/gitpod-io/gitpod/common-go/experiments"
@@ -17,6 +18,7 @@ import (
1718
protocol "github.com/gitpod-io/gitpod/gitpod-protocol"
1819
"github.com/gitpod-io/gitpod/public-api-server/pkg/auth"
1920
"github.com/gitpod-io/gitpod/public-api-server/pkg/proxy"
21+
"github.com/google/uuid"
2022
)
2123

2224
func NewTokensService(connPool proxy.ServerConnectionPool, expClient experiments.Client) *TokensService {
@@ -35,24 +37,50 @@ type TokensService struct {
3537
}
3638

3739
func (s *TokensService) CreatePersonalAccessToken(ctx context.Context, req *connect.Request[v1.CreatePersonalAccessTokenRequest]) (*connect.Response[v1.CreatePersonalAccessTokenResponse], error) {
40+
conn, err := s.getConnection(ctx)
41+
if err != nil {
42+
return nil, err
43+
}
44+
45+
_, err = s.getUser(ctx, conn)
46+
if err != nil {
47+
return nil, err
48+
}
49+
50+
return nil, connect.NewError(connect.CodeUnimplemented, errors.New("gitpod.experimental.v1.TokensService.CreatePersonalAccessToken is not implemented"))
51+
}
52+
53+
func (s *TokensService) GetPersonalAccessToken(ctx context.Context, req *connect.Request[v1.GetPersonalAccessTokenRequest]) (*connect.Response[v1.GetPersonalAccessTokenResponse], error) {
54+
tokenID, err := validateTokenID(req.Msg.GetId())
55+
if err != nil {
56+
return nil, err
57+
}
3858

3959
conn, err := s.getConnection(ctx)
4060
if err != nil {
4161
return nil, err
4262
}
4363

64+
_, err = s.getUser(ctx, conn)
65+
if err != nil {
66+
return nil, err
67+
}
68+
69+
log.Infof("Handling GetPersonalAccessToken request for Token ID '%s'", tokenID.String())
70+
return nil, connect.NewError(connect.CodeUnimplemented, errors.New("gitpod.experimental.v1.TokensService.GetPersonalAccessToken is not implemented"))
71+
}
72+
73+
func (s *TokensService) getUser(ctx context.Context, conn protocol.APIInterface) (*protocol.User, error) {
4474
user, err := conn.GetLoggedInUser(ctx)
4575
if err != nil {
4676
return nil, proxy.ConvertError(err)
4777
}
4878

49-
isEnabled := experiments.IsPersonalAccessTokensEnabled(ctx, s.expClient, experiments.Attributes{UserID: user.ID})
50-
51-
if !isEnabled {
79+
if !experiments.IsPersonalAccessTokensEnabled(ctx, s.expClient, experiments.Attributes{UserID: user.ID}) {
5280
return nil, connect.NewError(connect.CodePermissionDenied, errors.New("This feature is currently in beta. If you would like to be part of the beta, please contact us."))
5381
}
5482

55-
return nil, connect.NewError(connect.CodeUnimplemented, errors.New("gitpod.experimental.v1.TokensService.CreatePersonalAccessToken is not implemented"))
83+
return user, nil
5684
}
5785

5886
func (s *TokensService) getConnection(ctx context.Context) (protocol.APIInterface, error) {
@@ -69,3 +97,17 @@ func (s *TokensService) getConnection(ctx context.Context) (protocol.APIInterfac
6997

7098
return conn, nil
7199
}
100+
101+
func validateTokenID(id string) (uuid.UUID, error) {
102+
trimmed := strings.TrimSpace(id)
103+
if trimmed == "" {
104+
return uuid.Nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("Token ID is a required argument."))
105+
}
106+
107+
tokenID, err := uuid.Parse(trimmed)
108+
if err != nil {
109+
return uuid.Nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("Token ID must be a valid UUID"))
110+
}
111+
112+
return tokenID, nil
113+
}

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

Lines changed: 29 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,21 +21,24 @@ import (
2121
"github.com/stretchr/testify/require"
2222
)
2323

24-
func TestTokensService_CreatePersonalAccessTokenWithoutFeatureFlag(t *testing.T) {
25-
experimentsClient := &experimentstest.Client{
24+
var (
25+
withTokenServiceFeatureDisabled = &experimentstest.Client{
26+
BoolMatcher: func(ctx context.Context, experiment string, defaultValue bool, attributes experiments.Attributes) bool {
27+
return false
28+
},
29+
}
30+
withTokenServiceFeatureEnabled = &experimentstest.Client{
2631
BoolMatcher: func(ctx context.Context, experiment string, defaultValue bool, attributes experiments.Attributes) bool {
2732
return experiment == experiments.PersonalAccessTokensEnabledFlag
2833
},
2934
}
35+
)
3036

37+
func TestTokensService_CreatePersonalAccessTokenWithoutFeatureFlag(t *testing.T) {
3138
user := newUser(&protocol.User{})
3239

3340
t.Run("permission denied when feature flag is not enabled", func(t *testing.T) {
34-
serverMock, client := setupTokensService(t, &experimentstest.Client{
35-
BoolMatcher: func(ctx context.Context, experiment string, defaultValue bool, attributes experiments.Attributes) bool {
36-
return false
37-
},
38-
})
41+
serverMock, client := setupTokensService(t, withTokenServiceFeatureDisabled)
3942

4043
serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil)
4144

@@ -46,7 +49,7 @@ func TestTokensService_CreatePersonalAccessTokenWithoutFeatureFlag(t *testing.T)
4649
})
4750

4851
t.Run("unimplemented when feature flag enabled", func(t *testing.T) {
49-
serverMock, client := setupTokensService(t, experimentsClient)
52+
serverMock, client := setupTokensService(t, withTokenServiceFeatureDisabled)
5053

5154
serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil)
5255

@@ -55,6 +58,24 @@ func TestTokensService_CreatePersonalAccessTokenWithoutFeatureFlag(t *testing.T)
5558
})
5659
}
5760

61+
func TestTokensService_GetPersonalAccessToken(t *testing.T) {
62+
t.Run("permission denied when feature flag is disabled", func(t *testing.T) {
63+
64+
})
65+
66+
t.Run("invalid argument when Token ID is empty", func(t *testing.T) {
67+
68+
})
69+
70+
t.Run("invalid argument when Token ID is not a valid UUID", func(t *testing.T) {
71+
72+
})
73+
74+
t.Run("unimplemented when feature flag enabled", func(t *testing.T) {
75+
76+
})
77+
}
78+
5879
func setupTokensService(t *testing.T, expClient experiments.Client) (*protocol.MockAPIInterface, v1connect.TokensServiceClient) {
5980
t.Helper()
6081

0 commit comments

Comments
 (0)