feat: move SetOrganizationMemberRole to membership package#1541
feat: move SetOrganizationMemberRole to membership package#1541whoAbhishekSah wants to merge 2 commits intomainfrom
Conversation
Moves SetMemberRole logic from organization service into the membership package as SetOrganizationMemberRole, with relation cleanup added (fixes the known leak where demoting owner to viewer left the org#owner relation in place). - New: membership.SetOrganizationMemberRole with validateMinOwnerConstraint, replacePolicy, replaceRelation - Removed from organization service: SetMemberRole, validateSetMemberRoleRequest, getUserOrgPolicies, validateMinOwnerConstraint, replaceUserOrgPolicies - Handler rewired from orgService.SetMemberRole to membershipService.SetOrganizationMemberRole - Added 6 unit tests covering skip-unchanged, last-owner constraint, owner->viewer demotion (with relation swap), viewer->owner promotion Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
|
Note Currently processing new changes in this PR. This may take a few minutes, please wait... ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (2)
📝 WalkthroughWalkthroughThis PR migrates the organization member role-update functionality from Changes
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Possibly related issues
Possibly related PRs
Suggested reviewers
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment Tip CodeRabbit can scan for known vulnerabilities in your dependencies using OSV Scanner.OSV Scanner will automatically detect and report security vulnerabilities in your project's dependencies. No additional configuration is required. |
Coverage Report for CI Build 24444825715Coverage decreased (-0.05%) to 41.679%Details
Uncovered Changes
Coverage Regressions4 previously-covered lines in 1 file lost coverage.
Coverage Stats
💛 - Coveralls |
There was a problem hiding this comment.
Actionable comments posted: 3
🧹 Nitpick comments (1)
core/membership/service_test.go (1)
276-428: Add a regression for relation-replacement failures.This suite only covers the success path for deleting old relations and creating the new one. A case where
RelationService.DeleteorCreatefails duringSetOrganizationMemberRolewould lock in the owner-demotion fix and catch the partial-update paths in this new flow.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 7017a580-65f7-4314-aa5d-0fccb1f9afc1
📒 Files selected for processing (9)
core/membership/service.gocore/membership/service_test.gocore/organization/service.gocore/organization/service_test.gointernal/api/v1beta1connect/interfaces.gointernal/api/v1beta1connect/mocks/membership_service.gointernal/api/v1beta1connect/mocks/organization_service.gointernal/api/v1beta1connect/organization.gointernal/api/v1beta1connect/organization_test.go
💤 Files with no reviewable changes (3)
- core/organization/service_test.go
- core/organization/service.go
- internal/api/v1beta1connect/mocks/organization_service.go
Silently ignoring all relation delete errors would mask a failed owner relation delete during demotion, leaving both owner and member relations in place. Now only relation.ErrNotExist is ignored. Added 2 tests: real error fails the operation, not-found is ignored. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Summary
Moves the existing
SetOrganizationMemberRoleRPC implementation fromcore/organizationintocore/membership. Also fixes the known leak where demoting an org owner to viewer left theorg#ownerdirect relation in place.What changes
New in
core/membership/SetOrganizationMemberRole(ctx, orgID, principalID, principalType, roleID)— handles the full role-change flowvalidateMinOwnerConstraint,replacePolicy,replaceRelationRemoved from
core/organization/SetMemberRolevalidateSetMemberRoleRequestgetUserOrgPoliciesvalidateMinOwnerConstraintreplaceUserOrgPoliciesHandler
SetOrganizationMemberRoleRPC handler now callsmembershipService.SetOrganizationMemberRolewithschema.UserPrincipalmembership.ErrNotMember,membership.ErrInvalidOrgRole,membership.ErrLastOwnerRole)Bug fix — relation cleanup
Previously,
org.SetMemberRolereplaced policies but never touched the explicitorg#ownerororg#memberrelations. So demoting an owner to viewer left theownerrelation in place, continuing to grant owner permissions via SpiceDB.Now
replaceRelationdeletes bothownerandmemberrelations for the principal before creating the new one matching the target role. Verified by theshould succeed demoting owner to viewer with multiple ownerstest.Edge cases handled
app/user(serviceusers bound at creation, not changed via this RPC)ErrNotMemberTest plan
core/membership/covering all edge cases aboveRelated
🤖 Generated with Claude Code