Commit 1b737064412c4426029c2fd3a40b94e23a418321

Authored by Spencer Alan
1 parent 25af95e0
Exists in master

• add users controller

app/controllers/scim_rails/scim_users_controller.rb 0 → 100644
@@ -0,0 +1,104 @@ @@ -0,0 +1,104 @@
  1 +module ScimRails
  2 + class ScimUsersController < ScimRails::ApplicationController
  3 + def index
  4 + if params[:filter].present?
  5 + query = ScimRails::ScimQueryParser.new(params[:filter])
  6 +
  7 + users = @company.public_send(ScimRails.config.scim_users_scope).where(
  8 + "#{ScimRails.config.scim_users_model.connection.quote_column_name(query.attribute)} #{query.operator} ?",
  9 + query.parameter
  10 + )
  11 +
  12 + counts = ScimCount.new(
  13 + start_index: params[:startIndex],
  14 + limit: params[:count],
  15 + total: users.count
  16 + )
  17 + json_scim_response(object: users, counts: counts)
  18 + else
  19 + users = @company.public_send(ScimRails.config.scim_users_scope)
  20 +
  21 + counts = ScimCount.new(
  22 + start_index: params[:startIndex],
  23 + limit: params[:count],
  24 + total: users.count
  25 + )
  26 +
  27 + json_scim_response(object: users, counts: counts)
  28 + end
  29 + end
  30 +
  31 + def create
  32 + user = @company.public_send(ScimRails.config.scim_users_scope).new
  33 + user.create!(permitted_user_params)
  34 +
  35 + json_scim_response(object: user, status: :created)
  36 + end
  37 +
  38 + def show
  39 + user = @company.public_send(ScimRails.config.scim_users_scope).find(params[:id])
  40 + json_scim_response(object: user)
  41 + end
  42 +
  43 + def update
  44 + user = @company.public_send(ScimRails.config.scim_users_scope).find(params[:id])
  45 + update_status(user) unless params[:active].nil?
  46 + user.update!(permitted_user_params)
  47 + json_scim_response(object: user)
  48 + end
  49 +
  50 + def deprovision
  51 + user = @company.public_send(ScimRails.config.scim_users_scope).find(params[:id])
  52 + update_status(user) unless params[:active].nil?
  53 + json_scim_response(object: user)
  54 + end
  55 +
  56 + private
  57 +
  58 + def permitted_user_params
  59 + ScimRails.config.mutable_user_attributes.each.with_object({}) do |attribute, hash|
  60 + hash[attribute] = find_value_for(attribute)
  61 + end
  62 + end
  63 +
  64 + def find_value_for(attribute)
  65 + params.dig(*path_for(attribute))
  66 + end
  67 +
  68 + def path_for(attribute, object = ScimRails.config.mutable_user_attributes_schema, path = [])
  69 + at_path = path.empty? ? object : object.dig(*path)
  70 + return path if at_path == attribute
  71 +
  72 + case at_path
  73 + when Hash
  74 + at_path.each do |key, value|
  75 + found_path = path_for(attribute, object, [*path, key])
  76 + return found_path if found_path
  77 + end
  78 + nil
  79 + when Array
  80 + at_path.each_with_index do |value, index|
  81 + found_path = path_for(attribute, object, [*path, index])
  82 + return found_path if found_path
  83 + end
  84 + nil
  85 + end
  86 + end
  87 +
  88 + def update_status(user)
  89 + user.public_send(ScimRails.config.user_reprovision_method) if active?
  90 + user.public_send(ScimRails.config.user_deprovision_method) unless active?
  91 + end
  92 +
  93 + def active?
  94 + case params[:active]
  95 + when true, "true", 1
  96 + true
  97 + when false, "false", 0
  98 + false
  99 + else
  100 + raise ActiveRecord::RecordInvalid
  101 + end
  102 + end
  103 + end
  104 +end