Skip to content

Commit 0402cc6

Browse files
committed
[public-api] Delete token
1 parent 28ba48f commit 0402cc6

File tree

4 files changed

+84
-9
lines changed

4 files changed

+84
-9
lines changed

components/gitpod-db/go/personal_access_token.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,25 @@ func CreatePersonalAccessToken(ctx context.Context, conn *gorm.DB, req PersonalA
8787
return token, nil
8888
}
8989

90+
func DeletePersonalAccessTokenForUser(ctx context.Context, conn *gorm.DB, tokenID uuid.UUID, userID uuid.UUID) error {
91+
db := conn.WithContext(ctx)
92+
93+
db = db.
94+
Table((&PersonalAccessToken{}).TableName()).
95+
Where("id = ?", tokenID).
96+
Where("userId = ?", userID).
97+
Where("deleted = ?", 0).
98+
Update("deleted", 1)
99+
if db.Error != nil {
100+
if errors.Is(db.Error, gorm.ErrRecordNotFound) {
101+
return fmt.Errorf("Token with ID %s does not exist: %w", tokenID, ErrorNotFound)
102+
}
103+
return fmt.Errorf("Failed to delete token: %v", db.Error)
104+
}
105+
106+
return nil
107+
}
108+
90109
func ListPersonalAccessTokensForUser(ctx context.Context, conn *gorm.DB, userID uuid.UUID, pagination Pagination) (*PaginatedResult[PersonalAccessToken], error) {
91110
if userID == uuid.Nil {
92111
return nil, fmt.Errorf("user ID is a required argument to list personal access tokens for user, got nil")

components/gitpod-db/go/personal_access_token_test.go

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,42 @@ func TestPersonalAccessToken_Create(t *testing.T) {
7474
require.Equal(t, request.ID, result.ID)
7575
}
7676

77+
func TestPersonalAccessToken_Delete(t *testing.T) {
78+
conn := dbtest.ConnectForTests(t)
79+
80+
firstUserId := uuid.New()
81+
secondUserId := uuid.New()
82+
83+
token := dbtest.NewPersonalAccessToken(t, db.PersonalAccessToken{UserID: firstUserId})
84+
token2 := dbtest.NewPersonalAccessToken(t, db.PersonalAccessToken{UserID: secondUserId})
85+
86+
tokenEntries := []db.PersonalAccessToken{token, token2}
87+
88+
dbtest.CreatePersonalAccessTokenRecords(t, conn, tokenEntries...)
89+
90+
t.Run("not matching user", func(t *testing.T) {
91+
err := db.DeletePersonalAccessTokenForUser(context.Background(), conn, token.ID, token2.UserID)
92+
require.Error(t, err, db.ErrorNotFound)
93+
})
94+
95+
t.Run("not matching token", func(t *testing.T) {
96+
err := db.DeletePersonalAccessTokenForUser(context.Background(), conn, token2.ID, token.UserID)
97+
require.Error(t, err, db.ErrorNotFound)
98+
})
99+
100+
t.Run("both token and user don't exist in the DB", func(t *testing.T) {
101+
err := db.DeletePersonalAccessTokenForUser(context.Background(), conn, uuid.New(), uuid.New())
102+
require.Error(t, err, db.ErrorNotFound)
103+
})
104+
105+
t.Run("valid", func(t *testing.T) {
106+
err := db.DeletePersonalAccessTokenForUser(context.Background(), conn, token.ID, token.UserID)
107+
require.NoError(t, err)
108+
_, err = db.GetPersonalAccessTokenForUser(context.Background(), conn, token.ID, token.UserID)
109+
require.Error(t, err, db.ErrorNotFound)
110+
})
111+
}
112+
77113
func TestListPersonalAccessTokensForUser(t *testing.T) {
78114
ctx := context.Background()
79115
conn := dbtest.ConnectForTests(t)

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -204,13 +204,18 @@ func (s *TokensService) DeletePersonalAccessToken(ctx context.Context, req *conn
204204
return nil, err
205205
}
206206

207-
_, _, err = s.getUser(ctx, conn)
207+
_, userID, err := s.getUser(ctx, conn)
208208
if err != nil {
209209
return nil, err
210210
}
211211

212-
log.Infof("Handling DeletePersonalAccessToken request for Token ID '%s'", tokenID.String())
213-
return nil, connect.NewError(connect.CodeUnimplemented, errors.New("gitpod.experimental.v1.TokensService.DeletePersonalAccessToken is not implemented"))
212+
err = db.DeletePersonalAccessTokenForUser(ctx, s.dbConn, tokenID, userID)
213+
if err != nil {
214+
log.WithError(err).Errorf("Failed to delete personal access token for user %s", userID.String())
215+
return nil, connect.NewError(connect.CodeInternal, errors.New("Failed to delete personal access token."))
216+
}
217+
218+
return connect.NewResponse(&v1.DeletePersonalAccessTokenResponse{}), nil
214219
}
215220

216221
func (s *TokensService) getUser(ctx context.Context, conn protocol.APIInterface) (*protocol.User, uuid.UUID, error) {

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

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -464,16 +464,31 @@ func TestTokensService_DeletePersonalAccessToken(t *testing.T) {
464464
require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err))
465465
})
466466

467-
t.Run("unimplemented when feature flag enabled", func(t *testing.T) {
468-
serverMock, _, client := setupTokensService(t, withTokenFeatureEnabled)
467+
t.Run("delete token", func(t *testing.T) {
468+
serverMock, dbConn, client := setupTokensService(t, withTokenFeatureEnabled)
469469

470-
serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil)
470+
tokens := dbtest.CreatePersonalAccessTokenRecords(t, dbConn,
471+
dbtest.NewPersonalAccessToken(t, db.PersonalAccessToken{
472+
UserID: uuid.MustParse(user.ID),
473+
}),
474+
)
471475

472-
_, err := client.DeletePersonalAccessToken(context.Background(), connect.NewRequest(&v1.DeletePersonalAccessTokenRequest{
473-
Id: uuid.New().String(),
476+
serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil).MaxTimes(3)
477+
478+
_, err := client.GetPersonalAccessToken(context.Background(), connect.NewRequest(&v1.GetPersonalAccessTokenRequest{
479+
Id: tokens[0].ID.String(),
474480
}))
481+
require.NoError(t, err)
475482

476-
require.Equal(t, connect.CodeUnimplemented, connect.CodeOf(err))
483+
_, err = client.DeletePersonalAccessToken(context.Background(), connect.NewRequest(&v1.DeletePersonalAccessTokenRequest{
484+
Id: tokens[0].ID.String(),
485+
}))
486+
require.NoError(t, err)
487+
488+
_, err = client.GetPersonalAccessToken(context.Background(), connect.NewRequest(&v1.GetPersonalAccessTokenRequest{
489+
Id: tokens[0].ID.String(),
490+
}))
491+
require.Error(t, err, fmt.Errorf("Token with ID %s does not exist: not found", tokens[0].ID.String()))
477492
})
478493
}
479494

0 commit comments

Comments
 (0)