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