Skip to content

Commit 2887fbc

Browse files
committed
First check whether user exists in UAA before trying to create in /v3/roles
1 parent fed7484 commit 2887fbc

File tree

2 files changed

+43
-9
lines changed

2 files changed

+43
-9
lines changed

app/controllers/v3/roles_controller.rb

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -114,12 +114,11 @@ def create_org_role(message)
114114
unauthorized! unless permission_queryer.can_write_to_active_org?(org.id)
115115
suspended! unless permission_queryer.is_org_active?(org.id)
116116

117-
if message.username && message.user_origin && message.user_origin != 'uaa' && org_managers_can_create_users?
118-
user = create_uaa_shadow_user(message.username, message.user_origin)
119-
user_guid = user['id']
120-
else
121-
user_guid = message.user_guid || lookup_user_guid_in_uaa(message.username, message.user_origin)
122-
end
117+
user_guid = if message.username && message.user_origin && message.user_origin != 'uaa' && org_managers_can_create_users?
118+
create_or_get_uaa_user(message)
119+
else
120+
message.user_guid || lookup_user_guid_in_uaa(message.username, message.user_origin)
121+
end
123122

124123
user = User.first(guid: user_guid) || create_cc_user(user_guid)
125124

@@ -145,9 +144,20 @@ def create_cc_user(user_guid)
145144
UserCreate.new.create(message:)
146145
end
147146

148-
def create_uaa_shadow_user(username, origin)
149-
message = UserCreateMessage.new(username:, origin:)
150-
unprocessable!(message.errors.full_messages) unless message.valid?
147+
def create_or_get_uaa_user(message)
148+
user_create_message = UserCreateMessage.new(username: message.username, origin: message.user_origin)
149+
unprocessable!(user_create_message.errors.full_messages) unless user_create_message.valid?
150+
151+
existing_user_id = get_uaa_user_id(user_create_message)
152+
user = create_uaa_shadow_user(user_create_message) unless existing_user_id
153+
existing_user_id || user['id']
154+
end
155+
156+
def get_uaa_user_id(message)
157+
User.get_user_id_by_username_and_origin(message.username, message.origin)
158+
end
159+
160+
def create_uaa_shadow_user(message)
151161
User.create_uaa_shadow_user(message.username, message.origin)
152162
end
153163

spec/request/roles_spec.rb

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -814,6 +814,7 @@
814814
before do
815815
TestConfig.override(allow_user_creation_by_org_manager: true)
816816
allow(uaa_client).to receive(:create_shadow_user).with('bob_unaffiliated', origin).and_return({ 'id' => user_unaffiliated.guid })
817+
allow(uaa_client).to receive(:ids_for_usernames_and_origins).and_return([])
817818
end
818819

819820
it 'does not call create_shadow_user' do
@@ -830,10 +831,29 @@
830831

831832
it 'calls create_shadow_user and retrieves the guid of the user from uaa' do
832833
post '/v3/roles', params.to_json, admin_header
834+
833835
expect(last_response).to have_status_code(201)
834836
expect(parsed_response).to match_json_response(expected_response)
837+
838+
expect(uaa_client).to have_received(:ids_for_usernames_and_origins)
835839
expect(uaa_client).to have_received(:create_shadow_user)
836840
end
841+
842+
context 'user already exists in UAA' do
843+
before do
844+
allow(uaa_client).to receive(:ids_for_usernames_and_origins).and_return([user_unaffiliated.guid])
845+
end
846+
847+
it 'retrieves the id from UAA and does not create a shadow user' do
848+
post '/v3/roles', params.to_json, admin_header
849+
850+
expect(last_response).to have_status_code(201)
851+
expect(parsed_response).to match_json_response(expected_response)
852+
853+
expect(uaa_client).to have_received(:ids_for_usernames_and_origins)
854+
expect(uaa_client).not_to have_received(:create_shadow_user)
855+
end
856+
end
837857
end
838858
end
839859
end
@@ -971,6 +991,10 @@
971991
end
972992

973993
context 'by user name and origin' do
994+
before do
995+
allow(uaa_client).to receive(:ids_for_usernames_and_origins).and_return([])
996+
end
997+
974998
let(:params) do
975999
{
9761000
type: 'organization_auditor',

0 commit comments

Comments
 (0)