Fix re-activitating membership does not reset the role

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
This commit is contained in:
Bryan Frimin
2026-01-05 21:34:26 +01:00
parent 2092e4e9bb
commit c4285cdc42

View File

@@ -176,8 +176,12 @@ func (s *Service) CreateUser(
return fmt.Errorf("cannot load membership: %w", err) return fmt.Errorf("cannot load membership: %w", err)
} else { } else {
// Update existing membership - reactivate if inactive, update source to SCIM // Update existing membership - reactivate if inactive, update source to SCIM
wasInactive := membership.State == coredata.MembershipStateInactive
membership.Source = coredata.MembershipSourceSCIM membership.Source = coredata.MembershipSourceSCIM
membership.State = coredata.MembershipStateActive membership.State = coredata.MembershipStateActive
if wasInactive {
membership.Role = coredata.MembershipRoleViewer
}
membership.UpdatedAt = now membership.UpdatedAt = now
err = membership.Update(ctx, tx, scope) err = membership.Update(ctx, tx, scope)
@@ -232,7 +236,6 @@ func (s *Service) GetUser(
return membershipToResource(membership), nil return membershipToResource(membership), nil
} }
// ListUsers lists all users in an organization, with optional filter support
func (s *Service) ListUsers( func (s *Service) ListUsers(
ctx context.Context, ctx context.Context,
config *coredata.SCIMConfiguration, config *coredata.SCIMConfiguration,
@@ -297,6 +300,7 @@ func (s *Service) ReplaceUser(
if err != nil { if err != nil {
return scim.Resource{}, err return scim.Resource{}, err
} }
return membershipToResource(membership), nil return membershipToResource(membership), nil
} }
@@ -311,6 +315,7 @@ func (s *Service) PatchUser(
if err != nil { if err != nil {
return scim.Resource{}, err return scim.Resource{}, err
} }
return membershipToResource(membership), nil return membershipToResource(membership), nil
} }
@@ -326,61 +331,65 @@ func (s *Service) updateUser(
var membership *coredata.Membership var membership *coredata.Membership
err := s.pg.WithTx(ctx, func(tx pg.Conn) error { err := s.pg.WithTx(
membership = &coredata.Membership{} ctx,
err := membership.LoadByID(ctx, tx, scope, membershipID) func(tx pg.Conn) error {
if err != nil { membership = &coredata.Membership{}
if err == coredata.ErrResourceNotFound { err := membership.LoadByID(ctx, tx, scope, membershipID)
if err != nil {
if err == coredata.ErrResourceNotFound {
return scimerrors.ScimErrorResourceNotFound(membershipID.String())
}
return fmt.Errorf("cannot load membership: %w", err)
}
if membership.OrganizationID != config.OrganizationID {
return scimerrors.ScimErrorResourceNotFound(membershipID.String()) return scimerrors.ScimErrorResourceNotFound(membershipID.String())
} }
return fmt.Errorf("cannot load membership: %w", err)
}
if membership.OrganizationID != config.OrganizationID { needsUpdate := false
return scimerrors.ScimErrorResourceNotFound(membershipID.String())
}
needsUpdate := false if active != nil {
if *active && membership.State == coredata.MembershipStateInactive {
if active != nil { membership.State = coredata.MembershipStateActive
if *active && membership.State == coredata.MembershipStateInactive { membership.Role = coredata.MembershipRoleViewer
membership.State = coredata.MembershipStateActive needsUpdate = true
needsUpdate = true } else if !*active && membership.State == coredata.MembershipStateActive {
} else if !*active && membership.State == coredata.MembershipStateActive { membership.State = coredata.MembershipStateInactive
membership.State = coredata.MembershipStateInactive needsUpdate = true
needsUpdate = true
}
}
if membership.Source != coredata.MembershipSourceSCIM {
membership.Source = coredata.MembershipSourceSCIM
needsUpdate = true
}
if needsUpdate {
membership.UpdatedAt = now
err = membership.Update(ctx, tx, scope)
if err != nil {
return fmt.Errorf("cannot update membership: %w", err)
}
}
profile := &coredata.MembershipProfile{}
err = profile.LoadByMembershipID(ctx, tx, scope, membershipID)
if err == nil {
if fullName != "" {
profile.FullName = fullName
profile.UpdatedAt = now
err = profile.Update(ctx, tx, scope)
if err != nil {
return fmt.Errorf("cannot update membership profile: %w", err)
} }
} }
}
return nil if membership.Source != coredata.MembershipSourceSCIM {
}) membership.Source = coredata.MembershipSourceSCIM
needsUpdate = true
}
if needsUpdate {
membership.UpdatedAt = now
err = membership.Update(ctx, tx, scope)
if err != nil {
return fmt.Errorf("cannot update membership: %w", err)
}
}
profile := &coredata.MembershipProfile{}
err = profile.LoadByMembershipID(ctx, tx, scope, membershipID)
if err == nil {
if fullName != "" {
profile.FullName = fullName
profile.UpdatedAt = now
err = profile.Update(ctx, tx, scope)
if err != nil {
return fmt.Errorf("cannot update membership profile: %w", err)
}
}
}
return nil
},
)
if err != nil { if err != nil {
return nil, err return nil, err