@@ -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
1517type userResourceType struct {
1618 resourceType * v2.ResourceType
1719 client1 jc1Func
1820 client2 jc2Func
21+ managers map [string ]* jcapi1.Systemuserreturn
1922}
2023
2124func (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