Admin Users: show each user's org and move a user into yours

A viewer whose first login ran self-serve signup got an empty org of
their own (org_role owner), so they saw no incidents or calls, and the
earlier fix deliberately never moved a user who already had an org.
PATCH /admin/users/{uid} now moves a user when org_id is passed
explicitly (claims + org_members, audited with left_org_id; the old org
is not deleted). The user list returns org_id/org_role, and the admin
user panel shows the org and a 'Move to my organization' button when it
isn't yours.

Verified: c2-core pytest 496 passed; frontend tsc --noEmit clean.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Logan Cusano
2026-09-27 18:52:55 -04:00
co-authored by Claude Opus 5.5
parent fa41b9a30c
commit 2b42e5ee9a
5 changed files with 70 additions and 5 deletions
+10 -1
View File
@@ -82,4 +82,13 @@ def test_editing_never_silently_moves_an_existing_org():
assert resp.status_code == 200
assert set_claims.call_args.args[1]["org_id"] == "org-B"
assert not members
assert _run("patch", "/admin/users/u1", {"org_id": "org-A"}, fb)[0].status_code == 400
def test_explicit_org_id_moves_a_self_provisioned_owner_into_the_network():
_as(ADMIN)
fb = _fb(custom_claims={"role": "viewer", "org_id": "own-empty-org", "org_role": "owner"})
resp, set_claims, members = _run("patch", "/admin/users/u1", {"org_id": "org-A"}, fb)
assert resp.status_code == 200, resp.text
claims = set_claims.call_args.args[1]
assert (claims["org_id"], claims["org_role"]) == ("org-A", "member")
assert members and members[0].args[2]["org_id"] == "org-A"