Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/public-api-server/pkg/apiv1/user.go
2499 views
1
// Copyright (c) 2022 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
"github.com/gitpod-io/gitpod/common-go/log"
12
v1 "github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1"
13
"github.com/gitpod-io/gitpod/components/public-api/go/experimental/v1/v1connect"
14
protocol "github.com/gitpod-io/gitpod/gitpod-protocol"
15
"github.com/gitpod-io/gitpod/public-api-server/pkg/proxy"
16
)
17
18
func NewUserService(pool proxy.ServerConnectionPool) *UserService {
19
return &UserService{
20
connectionPool: pool,
21
}
22
}
23
24
var _ v1connect.UserServiceHandler = (*UserService)(nil)
25
26
type UserService struct {
27
connectionPool proxy.ServerConnectionPool
28
29
v1connect.UnimplementedUserServiceHandler
30
}
31
32
func (s *UserService) GetAuthenticatedUser(ctx context.Context, req *connect.Request[v1.GetAuthenticatedUserRequest]) (*connect.Response[v1.GetAuthenticatedUserResponse], error) {
33
conn, err := getConnection(ctx, s.connectionPool)
34
if err != nil {
35
return nil, err
36
}
37
38
user, err := conn.GetLoggedInUser(ctx)
39
if err != nil {
40
return nil, proxy.ConvertError(err)
41
}
42
log.AddFields(ctx, log.UserID(user.ID))
43
44
response := userToAPIResponse(user)
45
46
return connect.NewResponse(&v1.GetAuthenticatedUserResponse{
47
User: response,
48
}), nil
49
}
50
51
func (s *UserService) ListSSHKeys(ctx context.Context, req *connect.Request[v1.ListSSHKeysRequest]) (*connect.Response[v1.ListSSHKeysResponse], error) {
52
conn, err := getConnection(ctx, s.connectionPool)
53
if err != nil {
54
return nil, err
55
}
56
57
sshKeys, err := conn.GetSSHPublicKeys(ctx)
58
if err != nil {
59
return nil, proxy.ConvertError(err)
60
}
61
62
var response []*v1.SSHKey
63
for _, k := range sshKeys {
64
response = append(response, sshKeyToAPIResponse(k))
65
}
66
67
return connect.NewResponse(&v1.ListSSHKeysResponse{
68
Keys: response,
69
}), nil
70
}
71
72
func (s *UserService) GetGitToken(ctx context.Context, req *connect.Request[v1.GetGitTokenRequest]) (*connect.Response[v1.GetGitTokenResponse], error) {
73
conn, err := getConnection(ctx, s.connectionPool)
74
if err != nil {
75
return nil, err
76
}
77
78
token, err := conn.GetToken(ctx, &protocol.GetTokenSearchOptions{Host: req.Msg.Host})
79
if err != nil {
80
return nil, proxy.ConvertError(err)
81
}
82
83
response := gitTokenToAPIResponse(token)
84
85
return connect.NewResponse(&v1.GetGitTokenResponse{
86
Token: response,
87
}), nil
88
}
89
90
func userToAPIResponse(user *protocol.User) *v1.User {
91
name := user.Name
92
if name == "" {
93
name = user.FullName
94
}
95
96
return &v1.User{
97
Id: user.ID,
98
Name: name,
99
AvatarUrl: user.AvatarURL,
100
CreatedAt: parseGitpodTimeStampOrDefault(user.CreationDate),
101
}
102
}
103
104
func sshKeyToAPIResponse(key *protocol.UserSSHPublicKeyValue) *v1.SSHKey {
105
return &v1.SSHKey{
106
Id: key.ID,
107
Name: key.Name,
108
Key: key.Key,
109
CreatedAt: parseGitpodTimeStampOrDefault(key.CreationTime),
110
}
111
}
112
113
func gitTokenToAPIResponse(token *protocol.Token) *v1.GitToken {
114
return &v1.GitToken{
115
ExpiryDate: token.ExpiryDate,
116
IdToken: token.IDToken,
117
RefreshToken: token.RefreshToken,
118
Scopes: token.Scopes,
119
UpdateDate: token.UpdateDate,
120
Username: token.Username,
121
Value: token.Value,
122
}
123
}
124
125