@@ -11,6 +11,7 @@ import (
1111 resources "github.com/conductorone/baton-sdk/pkg/types/resource"
1212 "github.com/conductorone/baton-slack/pkg"
1313 "github.com/conductorone/baton-slack/pkg/connector/client"
14+ "github.com/grpc-ecosystem/go-grpc-middleware/logging/zap/ctxzap"
1415 "github.com/slack-go/slack"
1516)
1617
@@ -59,6 +60,7 @@ func workspaceResource(
5960 resources .WithAnnotation (
6061 & v2.ChildResourceType {ResourceTypeId : resourceTypeUser .Id },
6162 & v2.ChildResourceType {ResourceTypeId : resourceTypeUserGroup .Id },
63+ & v2.ChildResourceType {ResourceTypeId : resourceTypeWorkspaceRole .Id },
6264 ),
6365 )
6466}
@@ -83,6 +85,11 @@ func (o *workspaceResourceType) List(
8385 return nil , nil , client .WrapError (err , "error listing teams" )
8486 }
8587
88+ err = client .SetWorkspaceNames (ctx , attrs .Session , workspaces )
89+ if err != nil {
90+ return nil , nil , fmt .Errorf ("storing workspace names in session: %w" , err )
91+ }
92+
8693 rv := make ([]* v2.Resource , 0 , len (workspaces ))
8794 for _ , ws := range workspaces {
8895 resource , err := workspaceResource (ctx , ws , parentID )
@@ -92,11 +99,6 @@ func (o *workspaceResourceType) List(
9299 rv = append (rv , resource )
93100 }
94101
95- err = client .SetWorkspaceNames (ctx , attrs .Session , workspaces )
96- if err != nil {
97- return nil , nil , fmt .Errorf ("storing workspace names in session: %w" , err )
98- }
99-
100102 pageToken , err := bag .NextToken (nextCursor )
101103 if err != nil {
102104 return nil , nil , fmt .Errorf ("creating next page token: %w" , err )
@@ -132,12 +134,15 @@ func (o *workspaceResourceType) Entitlements(
132134 }, & resources.SyncOpResults {}, nil
133135}
134136
137+ // sets workspace memberships and workspace roles.
135138func (o * workspaceResourceType ) Grants (
136139 ctx context.Context ,
137140 resource * v2.Resource ,
138141 attrs resources.SyncOpAttrs ,
139142) ([]* v2.Grant , * resources.SyncOpResults , error ) {
143+ l := ctxzap .Extract (ctx )
140144 if o .businessPlusClient == nil {
145+ l .Debug ("Business+ client not available, skipping workspace grants" )
141146 return nil , & resources.SyncOpResults {}, nil
142147 }
143148
@@ -167,12 +172,78 @@ func (o *workspaceResourceType) Grants(
167172 if user .IsStranger {
168173 continue
169174 }
175+ if user .Deleted {
176+ continue
177+ }
170178 userID , err := resources .NewResourceID (resourceTypeUser , user .ID )
171179 if err != nil {
172180 return nil , nil , fmt .Errorf ("creating user resource ID: %w" , err )
173181 }
174182
175- // Only create workspace membership grants (no role-based grants)
183+ if user .IsPrimaryOwner {
184+ rr , err := roleResource (ctx , PrimaryOwnerRoleID , resource .Id )
185+ if err != nil {
186+ return nil , nil , fmt .Errorf ("creating primary owner role resource: %w" , err )
187+ }
188+ rv = append (rv , grant .NewGrant (rr , RoleAssignmentEntitlement , userID ))
189+ }
190+
191+ if user .IsOwner {
192+ rr , err := roleResource (ctx , OwnerRoleID , resource .Id )
193+ if err != nil {
194+ return nil , nil , fmt .Errorf ("creating owner role resource: %w" , err )
195+ }
196+ rv = append (rv , grant .NewGrant (rr , RoleAssignmentEntitlement , userID ))
197+ }
198+
199+ if user .IsAdmin {
200+ rr , err := roleResource (ctx , AdminRoleID , resource .Id )
201+ if err != nil {
202+ return nil , nil , fmt .Errorf ("creating admin role resource: %w" , err )
203+ }
204+ rv = append (rv , grant .NewGrant (rr , RoleAssignmentEntitlement , userID ))
205+ }
206+
207+ if user .IsRestricted {
208+ if user .IsUltraRestricted {
209+ rr , err := roleResource (ctx , SingleChannelGuestRoleID , resource .Id )
210+ if err != nil {
211+ return nil , nil , fmt .Errorf ("creating single channel guest role resource: %w" , err )
212+ }
213+ rv = append (rv , grant .NewGrant (rr , RoleAssignmentEntitlement , userID ))
214+ } else {
215+ rr , err := roleResource (ctx , MultiChannelGuestRoleID , resource .Id )
216+ if err != nil {
217+ return nil , nil , fmt .Errorf ("creating multi channel guest role resource: %w" , err )
218+ }
219+ rv = append (rv , grant .NewGrant (rr , RoleAssignmentEntitlement , userID ))
220+ }
221+ }
222+
223+ if user .IsInvitedUser {
224+ rr , err := roleResource (ctx , InvitedMemberRoleID , resource .Id )
225+ if err != nil {
226+ return nil , nil , fmt .Errorf ("creating invited member role resource: %w" , err )
227+ }
228+ rv = append (rv , grant .NewGrant (rr , RoleAssignmentEntitlement , userID ))
229+ }
230+
231+ if ! user .IsRestricted && ! user .IsUltraRestricted && ! user .IsInvitedUser && ! user .IsBot && ! user .Deleted {
232+ rr , err := roleResource (ctx , MemberRoleID , resource .Id )
233+ if err != nil {
234+ return nil , nil , fmt .Errorf ("creating member role resource: %w" , err )
235+ }
236+ rv = append (rv , grant .NewGrant (rr , RoleAssignmentEntitlement , userID ))
237+ }
238+
239+ if user .IsBot {
240+ rr , err := roleResource (ctx , BotRoleID , resource .Id )
241+ if err != nil {
242+ return nil , nil , fmt .Errorf ("creating bot role resource: %w" , err )
243+ }
244+ rv = append (rv , grant .NewGrant (rr , RoleAssignmentEntitlement , userID ))
245+ }
246+
176247 rv = append (rv , grant .NewGrant (resource , memberEntitlement , userID ))
177248 }
178249
0 commit comments