Browse Source

chore(hybrid-cloud): Create outbox when updating org member details (#48846)

Alberto Leal 1 year ago
parent
commit
071f9904fc

+ 13 - 3
src/sentry/api/endpoints/organization_member/details.py

@@ -181,8 +181,14 @@ class OrganizationMemberDetailsEndpoint(OrganizationMemberEndpoint):
 
                 if result.get("regenerate"):
                     if request.access.has_scope("member:admin"):
-                        member.regenerate_token()
-                        member.save()
+                        region_outbox = None
+                        with transaction.atomic():
+                            member.regenerate_token()
+                            member.save()
+                            region_outbox = member.outbox_for_update()
+                            region_outbox.save()
+                        if region_outbox:
+                            region_outbox.drain_shard(max_updates_to_drain=10)
                     else:
                         return Response({"detail": ERR_INSUFFICIENT_SCOPE}, status=400)
                 if member.token_expired:
@@ -279,6 +285,7 @@ class OrganizationMemberDetailsEndpoint(OrganizationMemberEndpoint):
             r.id for r in team_roles.get_all() if r.priority <= new_minimum_team_role.priority
         ]
 
+        region_outbox = None
         with transaction.atomic():
             # If the member has any existing team roles that are less than or equal
             # to their new minimum role, overwrite the redundant team roles with
@@ -290,7 +297,10 @@ class OrganizationMemberDetailsEndpoint(OrganizationMemberEndpoint):
             ).update(role=None)
 
             member.update(role=role)
-
+            region_outbox = member.outbox_for_update()
+            region_outbox.save()
+        if region_outbox:
+            region_outbox.drain_shard(max_updates_to_drain=10)
         if omt_update_count > 0:
             metrics.incr(
                 "team_roles.update_to_minimum",

+ 9 - 1
tests/sentry/api/endpoints/test_organization_member_details.py

@@ -17,6 +17,7 @@ from sentry.models import (
 )
 from sentry.testutils import APITestCase
 from sentry.testutils.helpers import with_feature
+from sentry.testutils.hybrid_cloud import HybridCloudTestMixin
 from sentry.testutils.silo import region_silo_test
 
 
@@ -136,7 +137,7 @@ class GetOrganizationMemberTest(OrganizationMemberTestBase):
 
 
 @region_silo_test
-class UpdateOrganizationMemberTest(OrganizationMemberTestBase):
+class UpdateOrganizationMemberTest(OrganizationMemberTestBase, HybridCloudTestMixin):
     method = "put"
 
     def test_invalid_id(self):
@@ -196,6 +197,7 @@ class UpdateOrganizationMemberTest(OrganizationMemberTestBase):
         assert old_invite != member_om.get_invite_link()
         mock_send_invite_email.assert_called_once_with()
         assert response.data["invite_link"] == member_om.get_invite_link()
+        self.assert_org_member_mapping(org_member=member_om)
 
     @patch("sentry.models.OrganizationMember.send_invite_email")
     def test_reinvite_invite_expired_member(self, mock_send_invite_email):
@@ -227,6 +229,7 @@ class UpdateOrganizationMemberTest(OrganizationMemberTestBase):
 
         member = OrganizationMember.objects.get(pk=member.id)
         assert member.token_expired is False
+        self.assert_org_member_mapping(org_member=member)
 
     @patch("sentry.models.OrganizationMember.send_invite_email")
     def test_cannot_reinvite_unapproved_invite(self, mock_send_invite_email):
@@ -271,6 +274,7 @@ class UpdateOrganizationMemberTest(OrganizationMemberTestBase):
         self.get_success_response(self.organization.slug, member_om.id, role="manager")
         member_om = OrganizationMember.objects.get(id=member_om.id)
         assert member_om.role == "manager"
+        self.assert_org_member_mapping(org_member=member_om)
 
     def test_cannot_update_own_membership(self):
         member_om = OrganizationMember.objects.get(
@@ -362,6 +366,7 @@ class UpdateOrganizationMemberTest(OrganizationMemberTestBase):
 
         member_om = OrganizationMember.objects.get(organization=self.organization, user=member)
         assert member_om.role == "manager"
+        self.assert_org_member_mapping(org_member=member_om)
 
     @with_feature("organizations:team-roles")
     def test_can_update_team_role(self):
@@ -444,6 +449,7 @@ class UpdateOrganizationMemberTest(OrganizationMemberTestBase):
 
         member_om = OrganizationMember.objects.get(organization=self.organization, user=member)
         assert member_om.role == "member"
+        self.assert_org_member_mapping(org_member=member_om)
 
     @with_feature("organizations:team-roles")
     def test_can_update_from_retired_role_with_flag(self):
@@ -456,6 +462,7 @@ class UpdateOrganizationMemberTest(OrganizationMemberTestBase):
 
         member_om = OrganizationMember.objects.get(organization=self.organization, user=member)
         assert member_om.role == "member"
+        self.assert_org_member_mapping(org_member=member_om)
 
     @with_feature({"organizations:team-roles": False})
     def test_can_update_to_retired_role_without_flag(self):
@@ -468,6 +475,7 @@ class UpdateOrganizationMemberTest(OrganizationMemberTestBase):
 
         member_om = OrganizationMember.objects.get(organization=self.organization, user=member)
         assert member_om.role == "admin"
+        self.assert_org_member_mapping(org_member=member_om)
 
     @with_feature("organizations:team-roles")
     def test_cannot_update_to_retired_role_with_flag(self):