@@ -2,6 +2,7 @@ package connector
22
33import (
44 "context"
5+ "errors"
56 "fmt"
67
78 corev1 "buf.build/gen/go/formal/core/protocolbuffers/go/core/v1"
@@ -12,6 +13,8 @@ import (
1213 ent "github.com/conductorone/baton-sdk/pkg/types/entitlement"
1314 "github.com/conductorone/baton-sdk/pkg/types/grant"
1415 "github.com/formalco/go-sdk/sdk/v2"
16+ "github.com/grpc-ecosystem/go-grpc-middleware/logging/zap/ctxzap"
17+ "go.uber.org/zap"
1518)
1619
1720type groupBuilder struct {
@@ -118,6 +121,7 @@ func (o *groupBuilder) Grants(ctx context.Context, resource *v2.Resource, pToken
118121}
119122
120123func (o * groupBuilder ) Grant (ctx context.Context , principal * v2.Resource , entitlement * v2.Entitlement ) (annotations.Annotations , error ) {
124+ l := ctxzap .Extract (ctx )
121125 if principal .Id .ResourceType != userResourceType .Id {
122126 return nil , fmt .Errorf ("only users can have group link granted" )
123127 }
@@ -129,6 +133,18 @@ func (o *groupBuilder) Grant(ctx context.Context, principal *v2.Resource, entitl
129133
130134 response , err := o .client .GroupServiceClient .CreateUserGroupLink (ctx , request )
131135 if err != nil {
136+ var connectErr * connect.Error
137+ if errors .As (err , & connectErr ) {
138+ if connectErr .Code () == connect .CodeAlreadyExists {
139+ l .Debug (
140+ "group link already exists, returning successfully" ,
141+ zap .String ("principal" , principal .Id .Resource ),
142+ zap .String ("entitlement" , entitlement .Resource .Id .Resource ),
143+ )
144+ return nil , nil
145+ }
146+ }
147+
132148 return nil , fmt .Errorf ("GroupServiceClient.CreateUserGroupLink error: %w" , err )
133149 }
134150
@@ -140,6 +156,7 @@ func (o *groupBuilder) Grant(ctx context.Context, principal *v2.Resource, entitl
140156}
141157
142158func (o * groupBuilder ) Revoke (ctx context.Context , grant * v2.Grant ) (annotations.Annotations , error ) {
159+ l := ctxzap .Extract (ctx )
143160 if grant .Principal .Id .ResourceType != userResourceType .Id {
144161 return nil , fmt .Errorf ("only users can have group link revoked" )
145162 }
@@ -189,7 +206,13 @@ func (o *groupBuilder) Revoke(ctx context.Context, grant *v2.Grant) (annotations
189206 if err != nil {
190207 return nil , fmt .Errorf ("rateLimitAnnotations error: %w" , err )
191208 }
192- return rateLimit , fmt .Errorf ("user is not linked to group" )
209+
210+ l .Debug (
211+ "group link not found, returning successfully" ,
212+ zap .String ("principal" , grant .Principal .Id .Resource ),
213+ zap .String ("entitlement" , grant .Entitlement .Resource .Id .Resource ),
214+ )
215+ return rateLimit , nil
193216}
194217
195218func newGroupBuilder (client * sdk.FormalSDK ) * groupBuilder {
0 commit comments