Commit 25af95e0e6f2ea13de1b694c5e289c987d84a12d

Authored by Spencer Alan
1 parent 3a4364a4
Exists in master

add json scim response structure

Showing 1 changed file with 66 additions and 1 deletions   Show diff stats
app/controllers/concerns/scim_rails/response.rb
1 module ScimRails 1 module ScimRails
2 module Response 2 module Response
  3 + CONTENT_TYPE = "application/scim+json, application/json".freeze
  4 +
3 def json_response(object, status = :ok) 5 def json_response(object, status = :ok)
4 - render(json: object, status: status) 6 + render \
  7 + json: object,
  8 + status: status
  9 + end
  10 +
  11 + def json_scim_response(object:, status: :ok, counts: nil)
  12 + case params[:action]
  13 + when "index"
  14 + render \
  15 + json: list_response(object, counts),
  16 + status: status,
  17 + content_type: CONTENT_TYPE
  18 + when "show", "create", "update"
  19 + render \
  20 + json: user_response(object),
  21 + status: status,
  22 + content_type: CONTENT_TYPE
  23 + end
  24 + end
  25 +
  26 + private
  27 +
  28 + def list_response(object, counts)
  29 + object = object
  30 + .order(:id)
  31 + .offset(counts.offset)
  32 + .limit(counts.limit)
  33 + {
  34 + "schemas": [
  35 + "urn:ietf:params:scim:api:messages:2.0:ListResponse"
  36 + ],
  37 + "totalResults": counts.total,
  38 + "startIndex": counts.start_index,
  39 + "itemsPerPage": counts.limit,
  40 + "Resources": list_users(object)
  41 + }
  42 + end
  43 +
  44 + def list_users(users)
  45 + users.map do |user|
  46 + user_response(user)
  47 + end
  48 + end
  49 +
  50 + def user_response(user)
  51 + schema = ScimRails.config.user_schema
  52 + find_value(user, schema)
  53 + end
  54 +
  55 + def find_value(user, object)
  56 + case object
  57 + when Hash
  58 + object.each.with_object({}) do |(key, value), hash|
  59 + hash[key] = find_value(user, value)
  60 + end
  61 + when Array
  62 + object.map do |value|
  63 + find_value(user, value)
  64 + end
  65 + when Symbol
  66 + user.public_send(object)
  67 + else
  68 + object
  69 + end
5 end 70 end
6 end 71 end
7 end 72 end