Browse Source

fix(hybrid-cloud): Create org member mapping rows on update if it does not exist (#48534)

Alberto Leal 1 year ago
parent
commit
776107b14d

+ 13 - 6
src/sentry/services/hybrid_cloud/organizationmember_mapping/impl.py

@@ -81,12 +81,19 @@ class DatabaseBackedOrganizationMemberMappingService(OrganizationMemberMappingSe
         organization_id: int,
         rpc_update_org_member: RpcOrganizationMemberMappingUpdate,
     ) -> RpcOrganizationMemberMapping:
-        org_member_map = OrganizationMemberMapping.objects.get(
-            organization_id=organization_id,
-            organizationmember_id=organizationmember_id,
-        )
-        org_member_map.update(**rpc_update_org_member.dict())
-        return self._serialize_rpc(org_member_map)
+        try:
+            org_member_map = OrganizationMemberMapping.objects.get(
+                organization_id=organization_id,
+                organizationmember_id=organizationmember_id,
+            )
+            org_member_map.update(**rpc_update_org_member.dict())
+            return self._serialize_rpc(org_member_map)
+        except OrganizationMemberMapping.DoesNotExist:
+            return self.create_mapping(
+                organizationmember_id=organizationmember_id,
+                organization_id=organization_id,
+                **rpc_update_org_member.dict(),
+            )
 
     def delete_with_organization_member(
         self,

+ 20 - 0
tests/sentry/hybrid_cloud/test_organizationmembermapping.py

@@ -1,6 +1,7 @@
 from sentry.models.organizationmember import InviteStatus, OrganizationMember
 from sentry.models.organizationmembermapping import OrganizationMemberMapping
 from sentry.services.hybrid_cloud.organizationmember_mapping import (
+    RpcOrganizationMemberMappingUpdate,
     organizationmember_mapping_service,
 )
 from sentry.testutils import TransactionTestCase
@@ -196,6 +197,25 @@ class OrganizationMappingTest(TransactionTestCase, HybridCloudTestMixin):
         )
         self.assert_org_member_mapping(org_member=org_member)
 
+    def test_create_mapping_on_update(self):
+        with exempt_from_silo_limits():
+            inviter = self.create_user("bob@example.com")
+            org_member = OrganizationMember.objects.create(
+                organization_id=self.organization.id,
+                role="member",
+                email="foo@example.com",
+                user_id=None,
+                invite_status=InviteStatus.REQUESTED_TO_BE_INVITED.value,
+                inviter_id=inviter.id,
+            )
+
+        organizationmember_mapping_service.update_with_organization_member(
+            organizationmember_id=org_member.id,
+            organization_id=self.organization.id,
+            rpc_update_org_member=RpcOrganizationMemberMappingUpdate.from_orm(org_member),
+        )
+        self.assert_org_member_mapping(org_member=org_member)
+
 
 @region_silo_test(stable=True)
 class ReceiverTest(TransactionTestCase, HybridCloudTestMixin):