diff --git a/components/gitpod-db/go/personal_access_token.go b/components/gitpod-db/go/personal_access_token.go index b93937ca5f1a6a..09097930e3270e 100644 --- a/components/gitpod-db/go/personal_access_token.go +++ b/components/gitpod-db/go/personal_access_token.go @@ -235,10 +235,6 @@ func UpdatePersonalAccessTokenForUser(ctx context.Context, conn *gorm.DB, opts U return PersonalAccessToken{}, fmt.Errorf("failed to update personal access token: %w", tx.Error) } - if tx.RowsAffected == 0 { - return PersonalAccessToken{}, fmt.Errorf("token (ID: %s) for user (ID: %s) does not exist: %w", opts.TokenID, opts.UserID, ErrorNotFound) - } - return GetPersonalAccessTokenForUser(ctx, conn, opts.TokenID, opts.UserID) } diff --git a/components/gitpod-db/go/personal_access_token_test.go b/components/gitpod-db/go/personal_access_token_test.go index f7aed73b411608..a62edeb489de0b 100644 --- a/components/gitpod-db/go/personal_access_token_test.go +++ b/components/gitpod-db/go/personal_access_token_test.go @@ -285,6 +285,24 @@ func TestUpdatePersonalAccessTokenForUser(t *testing.T) { require.ErrorIs(t, err, db.ErrorNotFound) }) + t.Run("no modified field completes gracefully", func(t *testing.T) { + conn := dbtest.ConnectForTests(t) + name := "first" + + created := dbtest.CreatePersonalAccessTokenRecords(t, conn, dbtest.NewPersonalAccessToken(t, db.PersonalAccessToken{ + Name: name, + }))[0] + + udpated, err := db.UpdatePersonalAccessTokenForUser(context.Background(), conn, db.UpdatePersonalAccessTokenOpts{ + TokenID: created.ID, + UserID: created.UserID, + Name: &name, + }) + require.NoError(t, err) + require.Equal(t, name, udpated.Name) + require.Len(t, udpated.Scopes, 0) + }) + t.Run("no update when all options are nil", func(t *testing.T) { conn := dbtest.ConnectForTests(t) diff --git a/components/public-api-server/pkg/apiv1/tokens_test.go b/components/public-api-server/pkg/apiv1/tokens_test.go index b9a33c3dbd18f1..239647974200be 100644 --- a/components/public-api-server/pkg/apiv1/tokens_test.go +++ b/components/public-api-server/pkg/apiv1/tokens_test.go @@ -552,6 +552,31 @@ func TestTokensService_UpdatePersonalAccessToken(t *testing.T) { require.Equal(t, connect.CodeInvalidArgument, connect.CodeOf(err)) }) + t.Run("allows unmodified udpate", func(t *testing.T) { + serverMock, _, client := setupTokensService(t, withTokenFeatureEnabled) + + serverMock.EXPECT().GetLoggedInUser(gomock.Any()).Return(user, nil).Times(2) + + createResponse, err := client.CreatePersonalAccessToken(context.Background(), connect.NewRequest(&v1.CreatePersonalAccessTokenRequest{ + Token: &v1.PersonalAccessToken{ + Name: "first", + ExpirationTime: timestamppb.Now(), + }, + })) + require.NoError(t, err) + + _, err = client.UpdatePersonalAccessToken(context.Background(), connect.NewRequest(&v1.UpdatePersonalAccessTokenRequest{ + Token: &v1.PersonalAccessToken{ + Id: createResponse.Msg.GetToken().GetId(), + Name: createResponse.Msg.GetToken().GetName(), + }, + UpdateMask: &fieldmaskpb.FieldMask{ + Paths: []string{"name", "scopes"}, + }, + })) + require.NoError(t, err) + }) + t.Run("default updates both name and scopes, when no mask specified", func(t *testing.T) { serverMock, _, client := setupTokensService(t, withTokenFeatureEnabled)