-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathusers.go
More file actions
441 lines (347 loc) · 11.6 KB
/
users.go
File metadata and controls
441 lines (347 loc) · 11.6 KB
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
package lever
import (
"bytes"
"context"
"encoding/json"
"fmt"
"io"
"net/http"
"net/url"
"github.com/corbaltcode/lever-data-api-go/model"
)
// Lever users client interface
type UsersClientInterface interface {
ClientInterface
// Retrieve a single user.
//
// This method returns the full user record for a single user.
GetUser(ctx context.Context, req *GetUserRequest) (*GetUserResponse, error)
// List users
//
// Lists the users in your Lever account. Only active users are returned by default.
ListUsers(ctx context.Context, req *ListUsersRequest) (*ListUsersResponse, error)
// Create a user
//
// This endpoint enables integrations to create users in your Lever account.
//
// Users will be created with the Interviewer access role by default. Users may be created with
// Interviewer, Limited Team Member, Team Member, Admin, or Super Admin access.
//
// Note: This will not send an invite to the user, so direct auth users will need to go through
// the direct auth password flow.
CreateUser(ctx context.Context, req *CreateUserRequest) (*CreateUserResponse, error)
// Update a user
//
// When you update a user, Lever expects you to send the entire resource. Every field will be
// overwritten by the body of the request. If you don't include a field, it will be deleted or
// reset to its default. Be sure to include all fields you still want to be populated. name,
// email, and accessRole are required fields. Note that resetting accessRole to interviewer
// will result in a user losing all of their followed profiles.
UpdateUser(ctx context.Context, req *UpdateUserRequest) (*UpdateUserResponse, error)
// Deactivate a user
//
// Deactivated users remain in the system for historical record keeping, but can no longer log
// in and use Lever.
DeactivateUser(ctx context.Context, req *DeactivateUserRequest) (*DeactivateUserResponse, error)
// Reactivate a user
//
// Reactivate a user that has been previously deactivated
ReactivateUser(ctx context.Context, req *ReactivateUserRequest) (*ReactivateUserResponse, error)
}
// Parameters for retrieving a single user.
type GetUserRequest struct {
BaseRequest
// The user id. This is required.
UserId string
}
// Create a new GetUserRequest with the required fields.
func NewGetUserRequest(userId string) *GetUserRequest {
return &GetUserRequest{
UserId: userId,
}
}
func (r *GetUserRequest) GetPath() string {
return fmt.Sprintf("users/%s", url.PathEscape(r.UserId))
}
// Response for retrieving a single user.
type GetUserResponse struct {
BaseResponse
// The user record.
User *model.User `json:"data"`
}
// Parameters for listing users.
type ListUsersRequest struct {
BaseListRequest
// If set, filter results to users that match an email address. Provided email must exactly
// match the canonicalized version of the user's email.
Email []string
// If set, filter by access role. One of: 'super admin', 'admin', 'team member',
// 'limited team member', 'interviewer', or the ID for a custom role listed on your roles page.
AccessRole []string
// If set, include deactivated users along with activated users.
IncludeDeactivated bool
// If set, filter results that match a user's external directory id.
ExternalDirectoryID []string
}
// Create a new ListUsersRequest with the required fields.
func NewListUsersRequest() *ListUsersRequest {
return &ListUsersRequest{}
}
func (r *ListUsersRequest) GetPath() string {
return "users"
}
func (r *ListUsersRequest) AddAPIQueryParams(query *url.Values) {
r.BaseListRequest.AddAPIQueryParams(query)
for _, email := range r.Email {
query.Add(paramEmail, email)
}
for _, accessRole := range r.AccessRole {
query.Add(paramAccessRole, accessRole)
}
if r.IncludeDeactivated {
query.Add(paramIncludeDeactivated, "true")
}
for _, externalDirectoryId := range r.ExternalDirectoryID {
query.Add(paramExternalDirectoryId, externalDirectoryId)
}
}
// Response for listing users.
type ListUsersResponse struct {
BaseListResponse
// The user records.
Users []model.User `json:"data"`
}
// Parameters for creating a user.
type CreateUserRequest struct {
BaseRequest
// User's preferred name
Name string `json:"name"`
// User's email address
Email string `json:"email"`
// User's access role. One of: 'super admin', 'admin', 'team member', 'limited team member',
// 'interviewer'
AccessRole string `json:"accessRole,omitempty"`
// Unique id for user in external HR directory
ExternalDirectoryID string `json:"externalDirectoryId,omitempty"`
// User's job title
JobTitle string `json:"jobTitle,omitempty"`
// User's manager ID
ManagerID string `json:"manager,omitempty"`
}
// Create a new CreateUserRequest with the required fields.
func NewCreateUserRequest(name, email string) *CreateUserRequest {
return &CreateUserRequest{
Name: name,
Email: email,
}
}
func (r *CreateUserRequest) GetPath() string {
return "users"
}
func (r *CreateUserRequest) GetHTTPMethod() string {
return http.MethodPost
}
func (r *CreateUserRequest) GetBody() (io.Reader, error) {
result := bytes.Buffer{}
encoder := json.NewEncoder(&result)
encoder.SetEscapeHTML(false)
encoder.SetIndent("", "")
if err := encoder.Encode(r); err != nil {
return nil, err
}
return &result, nil
}
// Response for creating a user.
type CreateUserResponse struct {
BaseResponse
// The user record.
User *model.User `json:"data"`
}
// Parameters for updating a user.
type UpdateUserRequest struct {
BaseRequest
// User UID
ID string `json:"id,omitempty"`
// User's preferred name
Name string `json:"name,omitempty"`
// User's email address
Email string `json:"email,omitempty"`
// User's access role. One of: 'super admin', 'admin', 'team member', 'limited team member',
// 'interviewer'
AccessRole string `json:"accessRole,omitempty"`
// URL for user's gravatar, if enabled
Photo string `json:"photo,omitempty"`
// Unique id for user in external HR directory
ExternalDirectoryID string `json:"externalDirectoryId,omitempty"`
// An array of contact IDs which helps identify all contacts associated with a User. This can
// be used to control User access to any Opportunities linked to a User.
LinkedContactIds []string `json:"linkedContactIds,omitempty"`
// User's job title
JobTitle string `json:"jobTitle,omitempty"`
// User's manager ID
ManagerID string `json:"manager,omitempty"`
}
// Create a new UpdateUserRequest with the required fields.
func NewUpdateUserRequest(id, name, email, accessRole string) *UpdateUserRequest {
return &UpdateUserRequest{
ID: id,
Name: name,
Email: email,
AccessRole: accessRole,
}
}
// Create a new UpdateUserRequest based on an existing User struct.
func NewUpdateUserRequestFromUser(user *model.User) *UpdateUserRequest {
return &UpdateUserRequest{
ID: user.ID,
Name: user.Name,
Email: user.Email,
AccessRole: user.AccessRole,
Photo: user.Photo,
ExternalDirectoryID: user.ExternalDirectoryID,
LinkedContactIds: user.LinkedContactIds,
JobTitle: user.JobTitle,
ManagerID: user.ManagerID,
}
}
func (r *UpdateUserRequest) GetPath() string {
return fmt.Sprintf("users/%s", url.PathEscape(r.ID))
}
func (r *UpdateUserRequest) GetHTTPMethod() string {
return http.MethodPut
}
func (r *UpdateUserRequest) GetBody() (io.Reader, error) {
result := bytes.Buffer{}
encoder := json.NewEncoder(&result)
encoder.SetEscapeHTML(false)
encoder.SetIndent("", "")
if err := encoder.Encode(r); err != nil {
return nil, err
}
return &result, nil
}
// Response for updating a user.
type UpdateUserResponse struct {
BaseResponse
// The user record.
User *model.User `json:"data"`
}
// Parameters for deactivating a user.
type DeactivateUserRequest struct {
BaseRequest
// The user id. This is required.
UserId string
}
// Create a new DeactivateUserRequest with the required fields.
func NewDeactivateUserRequest(userId string) *DeactivateUserRequest {
return &DeactivateUserRequest{
UserId: userId,
}
}
func (r *DeactivateUserRequest) GetPath() string {
return fmt.Sprintf("users/%s/deactivate", url.PathEscape(r.UserId))
}
func (r *DeactivateUserRequest) GetHTTPMethod() string {
return http.MethodPost
}
// Response for deactivating a user.
type DeactivateUserResponse struct {
BaseResponse
// The user record.
User *model.User `json:"data"`
}
// Parameters for reactivating a user.
type ReactivateUserRequest struct {
BaseRequest
// The user id. This is required.
UserId string
}
// Create a new ReactivateUserRequest with the required fields.
func NewReactivateUserRequest(userId string) *ReactivateUserRequest {
return &ReactivateUserRequest{
UserId: userId,
}
}
func (r *ReactivateUserRequest) GetPath() string {
return fmt.Sprintf("users/%s/reactivate", url.PathEscape(r.UserId))
}
func (r *ReactivateUserRequest) GetHTTPMethod() string {
return http.MethodPost
}
// Response for reactivating a user.
type ReactivateUserResponse struct {
BaseResponse
// The user record.
User *model.User `json:"data"`
}
// Retrieve a single user.
//
// This method returns the full user record for a single user.
func (c *Client) GetUser(ctx context.Context, req *GetUserRequest) (*GetUserResponse, error) {
var resp GetUserResponse
if err := c.exec(ctx, req, &resp); err != nil {
return nil, err
}
return &resp, nil
}
// List users
//
// Lists the users in your Lever account. Only active users are returned by default.
func (c *Client) ListUsers(ctx context.Context, req *ListUsersRequest) (*ListUsersResponse, error) {
var resp ListUsersResponse
if err := c.exec(ctx, req, &resp); err != nil {
return nil, err
}
return &resp, nil
}
// Create a user
//
// This endpoint enables integrations to create users in your Lever account.
//
// Users will be created with the Interviewer access role by default. Users may be created with
// Interviewer, Limited Team Member, Team Member, Admin, or Super Admin access.
//
// Note: This will not send an invite to the user, so direct auth users will need to go through
// the direct auth password flow.
func (c *Client) CreateUser(ctx context.Context, req *CreateUserRequest) (*CreateUserResponse, error) {
var resp CreateUserResponse
if err := c.exec(ctx, req, &resp); err != nil {
return nil, err
}
return &resp, nil
}
// Update a user
//
// When you update a user, Lever expects you to send the entire resource. Every field will be
// overwritten by the body of the request. If you don't include a field, it will be deleted or
// reset to its default. Be sure to include all fields you still want to be populated. name,
// email, and accessRole are required fields. Note that resetting accessRole to interviewer
// will result in a user losing all of their followed profiles.
func (c *Client) UpdateUser(ctx context.Context, req *UpdateUserRequest) (*UpdateUserResponse, error) {
var resp UpdateUserResponse
if err := c.exec(ctx, req, &resp); err != nil {
return nil, err
}
return &resp, nil
}
// Deactivate a user
//
// Deactivated users remain in the system for historical record keeping, but can no longer log
// in and use Lever.
func (c *Client) DeactivateUser(ctx context.Context, req *DeactivateUserRequest) (*DeactivateUserResponse, error) {
var resp DeactivateUserResponse
if err := c.exec(ctx, req, &resp); err != nil {
return nil, err
}
return &resp, nil
}
// Reactivate a user
//
// Reactivate a user that has been previously deactivated
func (c *Client) ReactivateUser(ctx context.Context, req *ReactivateUserRequest) (*ReactivateUserResponse, error) {
var resp ReactivateUserResponse
if err := c.exec(ctx, req, &resp); err != nil {
return nil, err
}
return &resp, nil
}