Commit 1762c0dadf3a6197641624be7a1709009a9ef88e
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
Showing
2 changed files
with
18 additions
and
12 deletions
Show diff stats
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 |