Commit 1762c0dadf3a6197641624be7a1709009a9ef88e

Authored by Kyle Werner
1 parent da794a41
Exists in master

Allow the create endpoint to find and update users if they are already in the sy…

…stem instead of throwing an error
app/controllers/scim_rails/scim_users_controller.rb
... ... @@ -27,7 +27,13 @@ module ScimRails
27 27 end
28 28  
29 29 def create
30   - user = @company.public_send(ScimRails.config.scim_users_scope).create!(permitted_user_params)
  30 + username_key = ScimRails.config.queryable_user_attributes[:userName]
  31 + username_create_hash = Hash.new
  32 + username_create_hash[username_key] = permitted_user_params[username_key]
  33 + user = @company
  34 + .public_send(ScimRails.config.scim_users_scope)
  35 + .find_or_create_by(username_create_hash)
  36 + user.update!(permitted_user_params)
31 37 update_status(user) unless put_active_param.nil?
32 38 json_scim_response(object: user, status: :created)
33 39 end
... ...
spec/controllers/scim_rails/scim_users_controller_spec.rb
... ... @@ -11,7 +11,7 @@ RSpec.describe ScimRails::ScimUsersController, type: :controller do
11 11 context "when unauthorized" do
12 12 it "returns scim+json content type" do
13 13 get :index
14   -
  14 +
15 15 expect(response.content_type).to eq "application/scim+json, application/json"
16 16 end
17 17  
... ... @@ -37,7 +37,7 @@ RSpec.describe ScimRails::ScimUsersController, type: :controller do
37 37  
38 38 it "returns scim+json content type" do
39 39 get :index
40   -
  40 +
41 41 expect(response.content_type).to eq "application/scim+json, application/json"
42 42 end
43 43  
... ... @@ -146,7 +146,7 @@ RSpec.describe ScimRails::ScimUsersController, type: :controller do
146 146 context "when unauthorized" do
147 147 it "returns scim+json content type" do
148 148 get :show, params: { id: 1 }
149   -
  149 +
150 150 expect(response.content_type).to eq "application/scim+json, application/json"
151 151 end
152 152  
... ... @@ -172,7 +172,7 @@ RSpec.describe ScimRails::ScimUsersController, type: :controller do
172 172  
173 173 it "returns scim+json content type" do
174 174 get :show, params: { id: 1 }
175   -
  175 +
176 176 expect(response.content_type).to eq "application/scim+json, application/json"
177 177 end
178 178  
... ... @@ -207,7 +207,7 @@ RSpec.describe ScimRails::ScimUsersController, type: :controller do
207 207 context "when unauthorized" do
208 208 it "returns scim+json content type" do
209 209 post :create
210   -
  210 +
211 211 expect(response.content_type).to eq "application/scim+json, application/json"
212 212 end
213 213  
... ... @@ -305,7 +305,7 @@ RSpec.describe ScimRails::ScimUsersController, type: :controller do
305 305 expect(company.users.count).to eq 0
306 306 end
307 307  
308   - it "returns 409 if user already exists" do
  308 + it "returns 201 if user already exists" do
309 309 create(:user, email: "new@example.com", company: company)
310 310  
311 311 post :create, params: {
... ... @@ -320,7 +320,7 @@ RSpec.describe ScimRails::ScimUsersController, type: :controller do
320 320 ]
321 321 }
322 322  
323   - expect(response.status).to eq 409
  323 + expect(response.status).to eq 201
324 324 expect(company.users.count).to eq 1
325 325 end
326 326  
... ... @@ -355,7 +355,7 @@ RSpec.describe ScimRails::ScimUsersController, type: :controller do
355 355 context "when unauthorized" do
356 356 it "returns scim+json content type" do
357 357 put :put_update, params: { id: 1 }
358   -
  358 +
359 359 expect(response.content_type).to eq "application/scim+json, application/json"
360 360 end
361 361  
... ... @@ -383,7 +383,7 @@ RSpec.describe ScimRails::ScimUsersController, type: :controller do
383 383  
384 384 it "returns scim+json content type" do
385 385 put :put_update, params: put_params
386   -
  386 +
387 387 expect(response.content_type).to eq "application/scim+json, application/json"
388 388 end
389 389  
... ... @@ -450,7 +450,7 @@ RSpec.describe ScimRails::ScimUsersController, type: :controller do
450 450 context "when unauthorized" do
451 451 it "returns scim+json content type" do
452 452 patch :patch_update, params: patch_params(id: 1)
453   -
  453 +
454 454 expect(response.content_type).to eq "application/scim+json, application/json"
455 455 end
456 456  
... ... @@ -478,7 +478,7 @@ RSpec.describe ScimRails::ScimUsersController, type: :controller do
478 478  
479 479 it "returns scim+json content type" do
480 480 patch :patch_update, params: patch_params(id: 1)
481   -
  481 +
482 482 expect(response.content_type).to eq "application/scim+json, application/json"
483 483 end
484 484  
... ...