Skip to content

Commit b8c8d9d

Browse files
authored
Merge pull request #41 from ConductorOne/lauren/generate-role-grants-in-user-grants-method
store user role on user profile/move role grants to user grants method
2 parents 995344a + ee29e69 commit b8c8d9d

File tree

4 files changed

+45
-65
lines changed

4 files changed

+45
-65
lines changed

pkg/connector/connector.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ var (
1717
Traits: []v2.ResourceType_Trait{
1818
v2.ResourceType_TRAIT_USER,
1919
},
20-
Annotations: annotationsForUserResourceType(),
2120
}
2221
resourceTypeTeam = &v2.ResourceType{
2322
Id: "team",

pkg/connector/helpers.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import (
55

66
"github.com/conductorone/baton-linear/pkg/linear"
77
v2 "github.com/conductorone/baton-sdk/pb/c1/connector/v2"
8-
"github.com/conductorone/baton-sdk/pkg/annotations"
98
"github.com/conductorone/baton-sdk/pkg/pagination"
109
"golang.org/x/text/cases"
1110
"golang.org/x/text/language"
@@ -71,9 +70,3 @@ func parseMultipleTokens(token *pagination.Token) (linear.PaginationVars, error)
7170

7271
return paginationOptions, nil
7372
}
74-
75-
func annotationsForUserResourceType() annotations.Annotations {
76-
annos := annotations.Annotations{}
77-
annos.Update(&v2.SkipEntitlementsAndGrants{})
78-
return annos
79-
}

pkg/connector/role.go

Lines changed: 1 addition & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"github.com/conductorone/baton-sdk/pkg/annotations"
1010
"github.com/conductorone/baton-sdk/pkg/pagination"
1111
ent "github.com/conductorone/baton-sdk/pkg/types/entitlement"
12-
grant "github.com/conductorone/baton-sdk/pkg/types/grant"
1312
resource "github.com/conductorone/baton-sdk/pkg/types/resource"
1413
)
1514

@@ -92,49 +91,7 @@ func (o *roleResourceType) Entitlements(_ context.Context, resource *v2.Resource
9291
}
9392

9493
func (o *roleResourceType) Grants(ctx context.Context, resource *v2.Resource, token *pagination.Token) ([]*v2.Grant, string, annotations.Annotations, error) {
95-
var annotations annotations.Annotations
96-
bag, err := parsePageToken(token.Token, &v2.ResourceId{ResourceType: resourceTypeUser.Id})
97-
if err != nil {
98-
return nil, "", nil, err
99-
}
100-
101-
allUsers, nextToken, _, rlData, err := o.client.GetUsers(ctx, linear.GetResourcesVars{First: resourcePageSize, After: bag.PageToken()})
102-
annotations.WithRateLimiting(rlData)
103-
if err != nil {
104-
return nil, "", annotations, fmt.Errorf("linear-connector: failed to list users: %w", err)
105-
}
106-
107-
pageToken, err := bag.NextToken(nextToken)
108-
if err != nil {
109-
return nil, "", annotations, err
110-
}
111-
112-
var userRole string
113-
var rv []*v2.Grant
114-
115-
for _, user := range allUsers {
116-
switch {
117-
case user.Admin:
118-
userRole = roleAdmin
119-
case user.Guest:
120-
userRole = roleGuest
121-
default:
122-
userRole = roleUser
123-
}
124-
125-
if resource.Id.Resource == userRole {
126-
userCopy := user
127-
ur, err := userResource(ctx, &userCopy, resource.Id)
128-
if err != nil {
129-
return nil, "", annotations, err
130-
}
131-
132-
gr := grant.NewGrant(resource, membership, ur.Id)
133-
rv = append(rv, gr)
134-
}
135-
}
136-
137-
return rv, pageToken, annotations, nil
94+
return nil, "", nil, nil
13895
}
13996

14097
func roleBuilder(client *linear.Client) *roleResourceType {

pkg/connector/user.go

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
1518
type 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

106137
func userBuilder(client *linear.Client) *userResourceType {

0 commit comments

Comments
 (0)