Skip to content

Commit 4959f0e

Browse files
authored
Merge pull request #9 from ConductorOne/jirwin/manager-email
If a user has a manager set, also set the manager field to their email address
2 parents 1ff7398 + 4b37aaf commit 4959f0e

File tree

1 file changed

+40
-7
lines changed

1 file changed

+40
-7
lines changed

pkg/connector/users.go

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,16 @@ import (
99
v2 "github.com/conductorone/baton-sdk/pb/c1/connector/v2"
1010
"github.com/conductorone/baton-sdk/pkg/annotations"
1111
"github.com/conductorone/baton-sdk/pkg/pagination"
12+
"github.com/grpc-ecosystem/go-grpc-middleware/logging/zap/ctxzap"
13+
"go.uber.org/zap"
1214
"google.golang.org/protobuf/types/known/structpb"
1315
)
1416

1517
type userResourceType struct {
1618
resourceType *v2.ResourceType
1719
client1 jc1Func
1820
client2 jc2Func
21+
managers map[string]*jcapi1.Systemuserreturn
1922
}
2023

2124
func (o *userResourceType) ResourceType(_ context.Context) *v2.ResourceType {
@@ -27,6 +30,7 @@ func newUserBuilder(jc1 jc1Func, jc2 jc2Func) *userResourceType {
2730
resourceType: resourceTypeUser,
2831
client1: jc1,
2932
client2: jc2,
33+
managers: make(map[string]*jcapi1.Systemuserreturn),
3034
}
3135
}
3236

@@ -54,7 +58,7 @@ func (o *userResourceType) List(ctx context.Context, parentResourceID *v2.Resour
5458

5559
var rv []*v2.Resource
5660
for i := range list.Results {
57-
ur, err := userResource(ctx, &list.Results[i])
61+
ur, err := o.userResource(ctx, &list.Results[i])
5862
if err != nil {
5963
return nil, "", nil, err
6064
}
@@ -69,8 +73,8 @@ func (o *userResourceType) List(ctx context.Context, parentResourceID *v2.Resour
6973
return rv, pageToken, nil, nil
7074
}
7175

72-
func userResource(ctx context.Context, user *jcapi1.Systemuserreturn) (*v2.Resource, error) {
73-
trait, err := userTrait(ctx, user)
76+
func (o *userResourceType) userResource(ctx context.Context, user *jcapi1.Systemuserreturn) (*v2.Resource, error) {
77+
trait, err := o.userTrait(ctx, user)
7478
if err != nil {
7579
return nil, err
7680
}
@@ -79,19 +83,43 @@ func userResource(ctx context.Context, user *jcapi1.Systemuserreturn) (*v2.Resou
7983

8084
return &v2.Resource{
8185
Id: fmtResourceId(resourceTypeUser.Id, user.GetId()),
82-
DisplayName: userDisplayName(user),
86+
DisplayName: o.userDisplayName(user),
8387
Annotations: annos,
8488
}, nil
8589
}
8690

87-
func userDisplayName(user *jcapi1.Systemuserreturn) string {
91+
func (o *userResourceType) userDisplayName(user *jcapi1.Systemuserreturn) string {
8892
if dn := user.GetDisplayname(); dn != "" {
8993
return dn
9094
}
9195
return fmt.Sprintf("%s %s", user.GetFirstname(), user.GetLastname())
9296
}
9397

94-
func userTrait(ctx context.Context, user *jcapi1.Systemuserreturn) (*v2.UserTrait, error) {
98+
func (o *userResourceType) fetchManager(ctx context.Context, managerID string) (*jcapi1.Systemuserreturn, error) {
99+
ctx, client := o.client1(ctx)
100+
l := ctxzap.Extract(ctx)
101+
102+
manager, ok := o.managers[managerID]
103+
if ok {
104+
return manager, nil
105+
}
106+
107+
m, resp, err := client.SystemusersApi.SystemusersGet(ctx, managerID).Execute()
108+
if err != nil {
109+
l.Error(
110+
"baton-jumpcloud: failed to fetch manager details",
111+
zap.Error(err),
112+
zap.String("manager_id", managerID),
113+
)
114+
return nil, err
115+
}
116+
defer resp.Body.Close()
117+
118+
o.managers[managerID] = m
119+
return m, nil
120+
}
121+
122+
func (o *userResourceType) userTrait(ctx context.Context, user *jcapi1.Systemuserreturn) (*v2.UserTrait, error) {
95123
profile, err := structpb.NewStruct(map[string]interface{}{
96124
"id": user.GetId(),
97125
})
@@ -116,7 +144,12 @@ func userTrait(ctx context.Context, user *jcapi1.Systemuserreturn) (*v2.UserTrai
116144
}
117145

118146
if user.HasManager() {
119-
profile.Fields["manager_id"] = structpb.NewStringValue(user.GetManager())
147+
managerID := user.GetManager()
148+
profile.Fields["manager_id"] = structpb.NewStringValue(managerID)
149+
manager, err := o.fetchManager(ctx, managerID)
150+
if err == nil && manager != nil {
151+
profile.Fields["manager"] = structpb.NewStringValue(manager.GetEmail())
152+
}
120153
}
121154

122155
if user.HasEmployeeIdentifier() {

0 commit comments

Comments
 (0)