55 "errors"
66 "fmt"
77 "net/http"
8- "strconv"
98
109 v2 "github.com/conductorone/baton-sdk/pb/c1/connector/v2"
1110 "github.com/conductorone/baton-sdk/pkg/annotations"
@@ -16,6 +15,7 @@ import (
1615 "github.com/grpc-ecosystem/go-grpc-middleware/logging/zap/ctxzap"
1716 "go.uber.org/zap"
1817 "golang.org/x/exp/slices"
18+ "google.golang.org/protobuf/types/known/structpb"
1919
2020 "github.com/conductorone/baton-jira-datacenter/pkg/client"
2121)
@@ -26,23 +26,60 @@ type roleBuilder struct {
2626
2727const NF = - 1
2828
29+ func extractActorsFromRoleProfile (profile * structpb.Struct ) []client.Actors {
30+ if profile == nil {
31+ return nil
32+ }
33+ field , ok := profile .Fields ["actors" ]
34+ if ! ok || field .GetListValue () == nil {
35+ return nil
36+ }
37+ var actors []client.Actors
38+ for _ , val := range field .GetListValue ().Values {
39+ m := val .GetStructValue ()
40+ if m == nil {
41+ continue
42+ }
43+
44+ a := client.Actors {
45+ ID : int (m .Fields ["id" ].GetNumberValue ()),
46+ DisplayName : m .Fields ["displayName" ].GetStringValue (),
47+ Type : m .Fields ["type" ].GetStringValue (),
48+ Name : m .Fields ["name" ].GetStringValue (),
49+ }
50+ actors = append (actors , a )
51+ }
52+ return actors
53+ }
54+
2955// Create a new connector resource for a jira role.
3056func roleResource (ctx context.Context , role client.RolesAPIData , parentResourceID * v2.ResourceId ) (* v2.Resource , error ) {
31- profile := map [string ]interface {} {
57+ profile := map [string ]any {
3258 "role_id" : role .ID ,
3359 "role_name" : role .Name ,
3460 "role_Description" : role .Description ,
3561 }
3662
37- groupTraitOptions := []sdkResource.GroupTraitOption {
63+ var actorsList []any
64+ for _ , a := range role .Actors {
65+ actorsList = append (actorsList , map [string ]any {
66+ "id" : a .ID ,
67+ "displayName" : a .DisplayName ,
68+ "type" : a .Type ,
69+ "name" : a .Name ,
70+ })
71+ }
72+ profile ["actors" ] = actorsList
73+
74+ roleTraitOptions := []sdkResource.GroupTraitOption {
3875 sdkResource .WithGroupProfile (profile ),
3976 }
4077
4178 ret , err := sdkResource .NewGroupResource (
4279 role .Name ,
4380 roleResourceType ,
4481 role .ID ,
45- groupTraitOptions ,
82+ roleTraitOptions ,
4683 sdkResource .WithParentResourceID (parentResourceID ),
4784 )
4885 if err != nil {
@@ -61,6 +98,7 @@ func (r *roleBuilder) ResourceType(ctx context.Context) *v2.ResourceType {
6198func (r * roleBuilder ) List (ctx context.Context , parentResourceID * v2.ResourceId , pToken * pagination.Token ) ([]* v2.Resource , string , annotations.Annotations , error ) {
6299 var ret []* v2.Resource
63100 roles , err := r .client .ListAllRoles (ctx )
101+
64102 if err != nil {
65103 return nil , "" , nil , err
66104 }
@@ -105,57 +143,57 @@ func (r *roleBuilder) Entitlements(ctx context.Context, resource *v2.Resource, _
105143
106144func (r * roleBuilder ) Grants (ctx context.Context , resource * v2.Resource , pToken * pagination.Token ) ([]* v2.Grant , string , annotations.Annotations , error ) {
107145 var rv []* v2.Grant
108- // List roles in general
109- roles , err := r .client .ListAllRoles (ctx )
110- if err != nil {
111- return nil , "" , nil , err
112- }
113146
114- roleId , err := strconv .Atoi (resource .Id .Resource )
147+ l := ctxzap .Extract (ctx )
148+
149+ roleTrait , err := sdkResource .GetGroupTrait (resource )
115150 if err != nil {
116- return nil , "" , nil , err
151+ return nil , "" , nil , fmt . Errorf ( "list-grants: failed to get group trait from role: %w" , err )
117152 }
153+ roleProfile := roleTrait .GetProfile ()
118154
119- l := ctxzap . Extract ( ctx )
155+ roleActors := extractActorsFromRoleProfile ( roleProfile )
120156
121- for _ , role := range roles {
122- if roleId != role .ID {
123- continue
157+ if roleActors == nil {
158+ role , err := r .client .GetRole (ctx , resource .Id .Resource )
159+ if err != nil {
160+ return nil , "" , nil , err
124161 }
125- // An actor can be (users or groups)
126- for _ , actor := range role .Actors {
127- switch actor .Type {
128- case userRole :
129- user , err := r .client .GetUser (ctx , actor .Name )
130- if err != nil {
131- if errors .Is (err , client .ErrUserNotFound ) {
132- l .Warn ("User not found" , zap .String ("userId" , actor .Name ))
133- continue
134- }
135- return nil , "" , nil , err
136- }
162+ roleActors = role .Actors
163+ }
137164
138- ur , err := userResource (user )
139- if err != nil {
140- return nil , "" , nil , err
165+ for _ , actor := range roleActors {
166+ switch actor .Type {
167+ case userRole :
168+ user , err := r .client .GetUser (ctx , actor .Name )
169+ if err != nil {
170+ if errors .Is (err , client .ErrUserNotFound ) {
171+ l .Warn ("User not found" , zap .String ("userId" , actor .Name ))
172+ continue
141173 }
174+ return nil , "" , nil , err
175+ }
142176
143- membershipGrant := grant .NewGrant (resource , role .Name , ur .Id )
144- rv = append (rv , membershipGrant )
145- case groupRole :
146- group := client.Group {
147- Name : actor .Name ,
148- }
149- gr , err := groupResource (ctx , group , nil )
150- if err != nil {
151- return nil , "" , nil , err
152- }
177+ ur , err := userResource (user )
178+ if err != nil {
179+ return nil , "" , nil , err
180+ }
153181
154- membershipGrant := grant .NewGrant (resource , role .Name , gr .Id )
155- rv = append (rv , membershipGrant )
156- default :
157- return nil , "" , nil , fmt .Errorf ("jira(dc)-connector: invalid member resource type: %s" , actor .Type )
182+ membershipGrant := grant .NewGrant (resource , resource .DisplayName , ur .Id )
183+ rv = append (rv , membershipGrant )
184+ case groupRole :
185+ group := client.Group {
186+ Name : actor .Name ,
158187 }
188+ gr , err := groupResource (ctx , group , nil )
189+ if err != nil {
190+ return nil , "" , nil , err
191+ }
192+
193+ membershipGrant := grant .NewGrant (resource , resource .DisplayName , gr .Id )
194+ rv = append (rv , membershipGrant )
195+ default :
196+ return nil , "" , nil , fmt .Errorf ("jira(dc)-connector: invalid member resource type: %s" , actor .Type )
159197 }
160198 }
161199
0 commit comments