-
Notifications
You must be signed in to change notification settings - Fork 0
/
user.go
172 lines (144 loc) · 4.95 KB
/
user.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
package mycscloud
import (
"context"
"fmt"
"strconv"
"github.com/appbricks/cloud-builder/userspace"
"github.com/hasura/go-graphql-client"
"github.com/mevansam/goutils/logger"
)
type UserAPI struct {
apiClient *graphql.Client
}
func NewUserAPI(apiClient *graphql.Client) *UserAPI {
return &UserAPI{
apiClient: apiClient,
}
}
func (u *UserAPI) UserSearch(name string) ([]*userspace.User, error) {
var (
users []*userspace.User
)
var query struct {
UserSearch []struct {
UserID graphql.String `graphql:"userID"`
UserName graphql.String
FirstName graphql.String
MiddleName graphql.String
FamilyName graphql.String
} `graphql:"userSearch(filter: { userName: $userName }, limit: 5)"`
}
variables := map[string]interface{}{
"userName": graphql.String(name),
}
if err := u.apiClient.Query(context.Background(), &query, variables); err != nil {
logger.ErrorMessage("UserAPI.UserSearch(): userSearch query returned an error: %s", err.Error())
return nil, err
}
logger.TraceMessage("UserAPI.UserSearch(): userSearch query returned response: %# v", query)
if numUsers := len(query.UserSearch); numUsers > 0 {
users = make([]*userspace.User, 0, numUsers)
for _, u := range query.UserSearch {
users = append(users, &userspace.User{
UserID: string(u.UserID),
Name: string(u.UserName),
FirstName: string(u.FirstName),
MiddleName: string(u.MiddleName),
FamilyName: string(u.FamilyName),
})
}
}
return users, nil
}
func (u *UserAPI) GetUser(user *userspace.User) (*userspace.User, error) {
var query struct {
GetUser struct {
UserID graphql.String `graphql:"userID"`
PublicKey graphql.String
Certificate graphql.String
} `graphql:"getUser"`
}
if err := u.apiClient.Query(context.Background(), &query, map[string]interface{}{}); err != nil {
logger.DebugMessage("UserAPI: getUser query to retrieve user returned an error: %s", err.Error())
return nil, err
}
logger.TraceMessage("UserAPI: getUser query to retrieve user returned response: %# v", query)
if (user.UserID != string(query.GetUser.UserID)) {
return nil, fmt.Errorf("returned user does not match given user")
}
user.RSAPublicKey = string(query.GetUser.PublicKey)
user.Certificate = string(query.GetUser.Certificate)
return user, nil
}
func (u *UserAPI) GetUserConfig(user *userspace.User) ([]byte, error) {
var (
err error
configData []byte
)
var query struct {
GetUser struct {
UserID graphql.String `graphql:"userID"`
UniversalConfig graphql.String
} `graphql:"getUser"`
}
if err = u.apiClient.Query(context.Background(), &query, map[string]interface{}{}); err != nil {
logger.DebugMessage("UserAPI: getUser query to retrieve user returned an error: %s", err.Error())
return nil, err
}
logger.TraceMessage("UserAPI: getUser query to retrieve user returned response: %# v", query)
if (user.UserID != string(query.GetUser.UserID)) {
return nil, fmt.Errorf("returned user does not match given user")
}
if len(query.GetUser.UniversalConfig) > 0 {
if configData, err = user.DecryptConfig(string(query.GetUser.UniversalConfig)); err != nil {
return nil, err
}
}
return configData, nil
}
func (u *UserAPI) UpdateUserKey(user *userspace.User) error {
var mutation struct {
UpdateUserKey struct {
UserID graphql.String `graphql:"userID"`
} `graphql:"updateUserKey(userKey: { publicKey: $publicKey, keyTimestamp: $keyTimestamp })"`
}
variables := map[string]interface{}{
"publicKey": graphql.String(user.RSAPublicKey),
"keyTimestamp": graphql.String(strconv.FormatInt(user.KeyTimestamp, 10)),
}
if err := u.apiClient.Mutate(context.Background(), &mutation, variables); err != nil {
logger.DebugMessage("UserAPI: updateUserKey mutation returned an error: %s", err.Error())
return err
}
logger.TraceMessage("UserAPI: updateUserKey mutation returned response: %# v", mutation)
if (user.UserID != string(mutation.UpdateUserKey.UserID)) {
return fmt.Errorf("updateUserKey returned user does not match given user")
}
return nil
}
func (u *UserAPI) UpdateUserConfig(user *userspace.User, config []byte, asOfTimestamp int64) (int64, error) {
var (
err error
configData string
configTimestamp int64
)
if configData, err = user.EncryptConfig(config); err != nil {
return 0, err
}
var mutation struct {
UpdateUserConfig string `graphql:"updateUserConfig(universalConfig: $config, asOf: $asOf)"`
}
variables := map[string]interface{}{
"config": graphql.String(configData),
"asOf": graphql.String(strconv.FormatInt(asOfTimestamp, 10)),
}
if err = u.apiClient.Mutate(context.Background(), &mutation, variables); err != nil {
logger.DebugMessage("UserAPI: updateUserConfig mutation returned an error: %s", err.Error())
return 0, err
}
logger.TraceMessage("UserAPI: updateUserConfig mutation returned response: %# v", mutation)
if configTimestamp, err = strconv.ParseInt(mutation.UpdateUserConfig, 10, 64); err != nil {
return 0, err
}
return configTimestamp, nil
}