forked from lessonly/scim_rails
-
Notifications
You must be signed in to change notification settings - Fork 7
/
scim_users_controller.rb
104 lines (87 loc) · 3.23 KB
/
scim_users_controller.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# frozen_string_literal: true
module ScimRails
class ScimUsersController < ScimRails::ApplicationController
def index
if params[:filter].present?
query = ScimRails::ScimQueryParser.new(
params[:filter], ScimRails.config.queryable_user_attributes
)
users = @company
.public_send(ScimRails.config.scim_users_scope)
.where(
"#{ScimRails.config.scim_users_model
.connection.quote_column_name(query.attribute)} #{query.operator} ?",
query.parameter
)
.order(ScimRails.config.scim_users_list_order)
else
users = @company
.public_send(ScimRails.config.scim_users_scope)
.order(ScimRails.config.scim_users_list_order)
end
counts = ScimCount.new(
start_index: params[:startIndex],
limit: params[:count],
total: users.count
)
json_scim_response(object: users, counts: counts)
end
def create
if ScimRails.config.scim_user_prevent_update_on_create
user = @company
.public_send(ScimRails.config.scim_users_scope)
.create!(permitted_user_params)
else
username_key = ScimRails.config.queryable_user_attributes[:userName]
find_by_username = {}
find_by_username[username_key] = permitted_user_params[username_key]
user = @company
.public_send(ScimRails.config.scim_users_scope)
.find_or_create_by(find_by_username)
user.update!(permitted_user_params)
end
json_scim_response(object: user, status: :created)
end
def show
user = @company.public_send(ScimRails.config.scim_users_scope).find(params[:id])
json_scim_response(object: user)
end
def put_update
user = @company.public_send(ScimRails.config.scim_users_scope).find(params[:id])
user.update!(permitted_user_params)
json_scim_response(object: user)
end
def patch_update
user = @company.public_send(ScimRails.config.scim_users_scope).find(params[:id])
patch = ScimPatch.new(params, :user)
patch.save(user)
json_scim_response(object: user)
end
def destroy
unless ScimRails.config.user_destroy_method
raise ScimRails::ExceptionHandler::InvalidConfiguration
end
user = @company.public_send(ScimRails.config.scim_users_scope).find(params[:id])
raise ActiveRecord::RecordNotFound unless user
begin
user.public_send(ScimRails.config.user_destroy_method)
rescue NoMethodError => e
raise ScimRails::ExceptionHandler::InvalidConfiguration, e.message
rescue ActiveRecord::RecordNotDestroyed => e
raise ScimRails::ExceptionHandler::InvalidRequest, e.message
rescue StandardError => e
raise ScimRails::ExceptionHandler::UnexpectedError, e.message
end
head :no_content
end
private
def permitted_user_params
ScimRails.config.mutable_user_attributes.each.with_object({}) do |attribute, hash|
hash[attribute] = find_value_for(attribute)
end
end
def controller_schema
ScimRails.config.mutable_user_attributes_schema
end
end
end