@@ -9,9 +9,12 @@ 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- resource "github.com/conductorone/baton-sdk/pkg/types/resource"
12+ "github.com/conductorone/baton-sdk/pkg/types/grant"
13+ sdkResource "github.com/conductorone/baton-sdk/pkg/types/resource"
1314)
1415
16+ const userRoleProfileKey = "user_role"
17+
1518type userResourceType struct {
1619 resourceType * v2.ResourceType
1720 client * linear.Client
@@ -33,25 +36,36 @@ func userResource(ctx context.Context, user *linear.User, parentResourceID *v2.R
3336 lastName = names [1 ]
3437 }
3538
39+ var userRole string
40+ switch {
41+ case user .Admin :
42+ userRole = roleAdmin
43+ case user .Guest :
44+ userRole = roleGuest
45+ default :
46+ userRole = roleUser
47+ }
48+
3649 profile := map [string ]interface {}{
37- "first_name" : firstName ,
38- "last_name" : lastName ,
39- "login" : user .Email ,
40- "user_id" : user .ID ,
50+ "first_name" : firstName ,
51+ "last_name" : lastName ,
52+ "login" : user .Email ,
53+ "user_id" : user .ID ,
54+ userRoleProfileKey : userRole ,
4155 }
4256
43- userTraitOptions := []resource .UserTraitOption {
44- resource .WithUserProfile (profile ),
45- resource .WithEmail (user .Email , true ),
46- resource .WithStatus (v2 .UserTrait_Status_STATUS_ENABLED ),
57+ userTraitOptions := []sdkResource .UserTraitOption {
58+ sdkResource .WithUserProfile (profile ),
59+ sdkResource .WithEmail (user .Email , true ),
60+ sdkResource .WithStatus (v2 .UserTrait_Status_STATUS_ENABLED ),
4761 }
4862
49- ret , err := resource .NewUserResource (
63+ ret , err := sdkResource .NewUserResource (
5064 user .Name ,
5165 resourceTypeUser ,
5266 user .ID ,
5367 userTraitOptions ,
54- resource .WithParentResourceID (parentResourceID ),
68+ sdkResource .WithParentResourceID (parentResourceID ),
5569 )
5670 if err != nil {
5771 return nil , err
@@ -99,8 +113,25 @@ func (o *userResourceType) Entitlements(_ context.Context, _ *v2.Resource, _ *pa
99113 return nil , "" , nil , nil
100114}
101115
102- func (o * userResourceType ) Grants (_ context.Context , _ * v2.Resource , _ * pagination.Token ) ([]* v2.Grant , string , annotations.Annotations , error ) {
103- return nil , "" , nil , nil
116+ func (o * userResourceType ) Grants (ctx context.Context , resource * v2.Resource , pt * pagination.Token ) ([]* v2.Grant , string , annotations.Annotations , error ) {
117+ var rv []* v2.Grant
118+ userTrait , err := sdkResource .GetUserTrait (resource )
119+ if err != nil {
120+ return nil , "" , nil , fmt .Errorf ("list-grants: Failed to get user trait from user: %w" , err )
121+ }
122+ userProfile := userTrait .GetProfile ()
123+ userRole , present := sdkResource .GetProfileStringValue (userProfile , userRoleProfileKey )
124+ if ! present {
125+ return nil , "" , nil , fmt .Errorf ("list-grants: user role was not present on profile" )
126+ }
127+ rr , err := roleResource (ctx , userRole , resource .ParentResourceId )
128+ if err != nil {
129+ return nil , "" , nil , err
130+ }
131+ gr := grant .NewGrant (rr , membership , resource .Id )
132+
133+ rv = append (rv , gr )
134+ return rv , "" , nil , nil
104135}
105136
106137func userBuilder (client * linear.Client ) * userResourceType {
0 commit comments