Commit 9e366b4

mo <mo.khan@gmail.com>
2018-01-13 22:29:10
add scim user creation endpoint.
1 parent a4ae1d0
app/controllers/scim/v2/users_controller.rb
@@ -0,0 +1,24 @@
+module Scim
+  module V2
+    class UsersController < ApplicationController
+      def create
+        @user = User.create!(
+          email: user_params[:userName],
+          password: SecureRandom.hex(32),
+        )
+        response.headers['Content-Type'] = 'application/scim+json'
+        response.headers['Location'] = scim_v2_users_url(@user)
+        render status: :created
+      end
+
+      private
+
+      def authenticate!
+      end
+
+      def user_params
+        params.permit(:schemas, :userName)
+      end
+    end
+  end
+end
app/views/scim/v2/users/create.jbuilder
@@ -0,0 +1,10 @@
+json.schemas [Scim::Shady::Schemas::USER]
+json.id @user.id
+json.userName @user.email
+json.meta do
+  json.resourceType "User"
+  json.created @user.created_at.iso8601
+  json.lastModified @user.updated_at.iso8601
+  json.location scim_v2_users_url(@user)
+  json.version @user.lock_version
+end
config/routes.rb
@@ -6,5 +6,11 @@ Rails.application.routes.draw do
   resource :metadata, only: [:show]
   resource :dashboard, only: [:show]
   resources :registrations, only: [:new, :create]
+
+  namespace :scim do
+    namespace :v2, defaults: { format: 'json' } do
+      resources :users, only: [:create]
+    end
+  end
   root to: "sessions#new"
 end
db/migrate/20180113222024_add_lock_version_to_users.rb
@@ -0,0 +1,5 @@
+class AddLockVersionToUsers < ActiveRecord::Migration[5.1]
+  def change
+    add_column :users, :lock_version, :bigint, default: 0, null: false
+  end
+end
db/schema.rb
@@ -10,7 +10,7 @@
 #
 # It's strongly recommended that you check this file into your version control system.
 
-ActiveRecord::Schema.define(version: 20171111230910) do
+ActiveRecord::Schema.define(version: 20180113222024) do
 
   create_table "sessions", force: :cascade do |t|
     t.string "session_id", null: false
@@ -27,6 +27,7 @@ ActiveRecord::Schema.define(version: 20171111230910) do
     t.string "password_digest"
     t.datetime "created_at", null: false
     t.datetime "updated_at", null: false
+    t.bigint "lock_version", default: 0, null: false
     t.index ["uuid"], name: "index_users_on_uuid"
   end
 
spec/requests/scim/v2/users_spec.rb
@@ -0,0 +1,36 @@
+require 'rails_helper'
+
+describe '/scim/v2/users' do
+  describe "POST /scim/v2/users" do
+    let(:token) { SecureRandom.uuid  }
+    let(:email) { FFaker::Internet.email }
+    let(:headers) do
+      {
+        'Authorization' => "Bearer #{token}",
+        'Accept' => 'application/json',
+        'Content-Type' => 'application/json',
+      }
+    end
+
+    it 'creates a new user' do
+      body = { schemas: [Scim::Shady::Schemas::USER], userName: email }
+
+      post '/scim/v2/users', params: body.to_json, headers: headers
+
+      expect(response).to have_http_status(:created)
+      expect(response.headers['Content-Type']).to eql('application/scim+json')
+      expect(response.headers['Location']).to be_present
+      expect(response.body).to be_present
+
+      json = JSON.parse(response.body, symbolize_names: true)
+      expect(json[:schemas]).to match_array([Scim::Shady::Schemas::USER])
+      expect(json[:id]).to be_present
+      expect(json[:userName]).to eql(email)
+      expect(json[:meta][:resourceType]).to eql('User')
+      expect(json[:meta][:created]).to be_present
+      expect(json[:meta][:lastModified]).to be_present
+      expect(json[:meta][:location]).to be_present
+      expect(json[:meta][:version]).to be_present
+    end
+  end
+end
Gemfile
@@ -67,3 +67,4 @@ gem 'rails-assets-bootstrap', source: 'https://rails-assets.org'
 gem 'jwt'
 gem 'activerecord-session_store'
 gem "email_validator"
+gem 'scim-shady', path: '../scim-shady'
Gemfile.lock
@@ -1,3 +1,8 @@
+PATH
+  remote: ../scim-shady
+  specs:
+    scim-shady (0.1.0)
+
 GEM
   remote: https://rubygems.org/
   remote: https://rails-assets.org/
@@ -271,6 +276,7 @@ DEPENDENCIES
   rspec-rails (~> 3.6)
   saml-kit (= 0.3.2)
   sass-rails (~> 5.0)
+  scim-shady!
   selenium-webdriver
   spring
   spring-watcher-listen (~> 2.0.0)
@@ -283,4 +289,4 @@ DEPENDENCIES
   webmock
 
 BUNDLED WITH
-   1.16.0
+   1.16.1