class ChefZero::Endpoints::RestObjectEndpoint
Typical REST leaf endpoint (/roles/NAME or /data/BAG/NAME)
Attributes
identity_keys[R]
Public Class Methods
new(server, identity_keys = [ "name" ])
click to toggle source
Calls superclass method
# File lib/chef_zero/endpoints/rest_object_endpoint.rb, line 9 def initialize(server, identity_keys = [ "name" ]) super(server) identity_keys = [ identity_keys ] if identity_keys.is_a?(String) @identity_keys = identity_keys end
Public Instance Methods
delete(request)
click to toggle source
# File lib/chef_zero/endpoints/rest_object_endpoint.rb, line 42 def delete(request) result = get_data(request) delete_data(request) already_json_response(200, populate_defaults(request, result)) end
get(request)
click to toggle source
# File lib/chef_zero/endpoints/rest_object_endpoint.rb, line 17 def get(request) already_json_response(200, populate_defaults(request, get_data(request))) end
patch_request_body(request)
click to toggle source
# File lib/chef_zero/endpoints/rest_object_endpoint.rb, line 48 def patch_request_body(request) existing_value = get_data(request, nil, :nil) if existing_value request_json = FFI_Yajl::Parser.parse(request.body) existing_json = FFI_Yajl::Parser.parse(existing_value) merged_json = existing_json.merge(request_json) if merged_json.size > request_json.size return FFI_Yajl::Encoder.encode(merged_json, pretty: true) end end request.body end
put(request)
click to toggle source
# File lib/chef_zero/endpoints/rest_object_endpoint.rb, line 21 def put(request) # We grab the old body to trigger a 404 if it doesn't exist get_data(request) # If it's a rename, check for conflict and delete the old value if is_rename?(request) key = identity_key_value(request) begin create_data(request, request.rest_path[0..-2], key, request.body, :data_store_exceptions) rescue DataStore::DataAlreadyExistsError return error(409, "Cannot rename '#{request.rest_path[-1]}' to '#{key}': '#{key}' already exists") end delete_data(request) already_json_response(201, populate_defaults(request, request.body)) else set_data(request, request.rest_path, request.body) already_json_response(200, populate_defaults(request, request.body)) end end
Private Instance Methods
identity_key_value(request)
click to toggle source
Get the value of the (first existing) identity key from the request body or nil
# File lib/chef_zero/endpoints/rest_object_endpoint.rb, line 65 def identity_key_value(request) request_json = parse_json(request.body) identity_keys.map { |k| request_json[k] }.compact.first end
is_rename?(request)
click to toggle source
Does this request change the value of the identity key?
# File lib/chef_zero/endpoints/rest_object_endpoint.rb, line 71 def is_rename?(request) return false unless (key = identity_key_value(request)) key != request.rest_path[-1] end