Skip to content

fix(member merge): API updates for frontend #96709

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jul 31, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/sentry/auth_v2/endpoints/auth_merge_user_accounts.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@
from sentry.api.base import control_silo_endpoint
from sentry.api.paginator import OffsetPaginator
from sentry.api.serializers import serialize
from sentry.api.serializers.rest_framework.base import CamelSnakeSerializer
from sentry.auth_v2.endpoints.base import AuthV2Endpoint
from sentry.users.api.serializers.user import UserSerializerWithOrgMemberships
from sentry.users.models.user import User
from sentry.users.models.user_merge_verification_code import UserMergeVerificationCode


class AuthMergeUserAccountsValidator(serializers.Serializer):
class AuthMergeUserAccountsValidator(CamelSnakeSerializer):
verification_code = serializers.CharField(required=True)
ids_to_merge = serializers.ListField(child=serializers.IntegerField(), required=True)
ids_to_delete = serializers.ListField(child=serializers.IntegerField(), required=True)
Expand Down Expand Up @@ -104,4 +105,4 @@ def post(self, request: Request) -> Response:
user.merge_to(primary_user)
user.delete()

return Response("Successfully merged user accounts.")
return Response(serialize([primary_user], request.user, UserSerializerWithOrgMemberships()))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Single User Serialization Returns Array

The AuthMergeUserAccountsEndpoint's POST request returns a list containing a single serialized user object (e.g., [{user_data}]) instead of the single user object (e.g., {user_data}). This is because the serialize function is called with [primary_user] (a list), causing it to return an array, which is inconsistent with typical REST API patterns for single resource operations.

Locations (1)
Fix in Cursor Fix in Web

12 changes: 6 additions & 6 deletions src/sentry/users/api/serializers/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -430,19 +430,19 @@ def get_attrs(
memberships = OrganizationMemberMapping.objects.filter(
user_id__in={u.id for u in item_list}
).values_list("user_id", "organization_id", named=True)
active_org_id_to_name = dict(
active_org_id_to_slug = dict(
OrganizationMapping.objects.filter(
organization_id__in={m.organization_id for m in memberships},
status=OrganizationStatus.ACTIVE,
).values_list("organization_id", "name")
).values_list("organization_id", "slug")
)
active_organization_ids = active_org_id_to_name.keys()
active_organization_ids = active_org_id_to_slug.keys()

user_org_memberships: DefaultDict[int, list[str]] = defaultdict(list)
user_org_memberships: DefaultDict[int, set[str]] = defaultdict(set)
for membership in memberships:
if membership.organization_id in active_organization_ids:
user_org_memberships[membership.user_id].append(
active_org_id_to_name[membership.organization_id]
user_org_memberships[membership.user_id].add(
active_org_id_to_slug[membership.organization_id]
)
for item in item_list:
attrs[item]["organizations"] = user_org_memberships[item.id]
Expand Down
Loading