|
# encoding: utf-8 |
|
require 'json_parser' |
|
|
|
class Mapper < JSONMapper |
|
|
|
def execute |
|
map_response(json_doc) |
|
end |
|
|
|
private |
|
|
|
def map_response(response_node) |
|
Models::Response.new({ |
|
:web_services_interface_version => response_node.fetch('web_services_interface_version'), |
|
:start_time => response_node.fetch('start_time'), |
|
:token => response_node.fetch('token'), |
|
:internal_processing_time_in_seconds => response_node.fetch('internal_processing_time_in_seconds').gsub(/,/,'.'), |
|
}).tap {|response| |
|
error_node = response_node.fetch("error") |
|
response.error = map_error(error_node) |
|
|
|
hotels_node = Array.wrap(response_node.fetch("available_hotel_list").fetch("availability_list_hotel")) |
|
response.available_hotels = map_hotels(hotels_node) |
|
} |
|
end |
|
|
|
def map_error(error_node) |
|
Models::Error.new({ |
|
:error_category => error_node.fetch('error_category'), |
|
:error_code => error_node.fetch('error_code'), |
|
:lower_threshold => error_node.fetch('lower_threshold'), |
|
:upper_threshold => error_node.fetch('upper_threshold'), |
|
}) |
|
end |
|
|
|
def map_hotels(hotels_node) |
|
hotels_node.map do |hotel_node| |
|
Models::Hotel.new({ |
|
:property_number => hotel_node.fetch('property_number'), |
|
:name => hotel_node.fetch('name'), |
|
:rating_hotel_de => hotel_node.fetch('rating_hotel_de'), |
|
:main_chain_id => hotel_node.fetch('main_chain_id'), |
|
:overall_evaluation => hotel_node.fetch('overall_evaluation'), |
|
:freenights_hotel => hotel_node.fetch('is_freenights_hotel'), |
|
:internet_best_price_hotel => hotel_node.fetch('is_internet_best_price_hotel'), |
|
:package_hotel => hotel_node.fetch('is_package_hotel'), |
|
:location_number => hotel_node.fetch('location_number'), |
|
:catering => hotel_node.fetch('catering'), |
|
:total_number_of_rooms => hotel_node.fetch('total_number_of_rooms'), |
|
:direct_booking_link => hotel_node.fetch('direct_booking_link'), |
|
:distance_from_geo_coordinates => hotel_node.fetch('distance_from_geo_coordinates'), |
|
:contract_state => hotel_node.fetch('contract_status').fetch('contract_state'), |
|
:sort_index => hotel_node.fetch('contract_status').fetch('sort_index'), |
|
}).tap { |hotel| |
|
address_node = hotel_node.fetch('hotel_address') |
|
hotel.address = map_address(address_node) |
|
|
|
location_node = hotel_node.fetch('location') |
|
hotel.location = map_location(location_node) |
|
|
|
price_node = hotel_node.fetch('price') |
|
hotel.price = map_price(price_node) |
|
} |
|
end |
|
end |
|
|
|
def map_address(address_node) |
|
Models::Address.new({ |
|
:street => address_node.fetch("street"), |
|
:postal_code => address_node.fetch("postal_code"), |
|
:city => address_node.fetch("city"), |
|
:country_is_oa3 => address_node.fetch("country_is_oa3"), |
|
:latitude => address_node.fetch("geographic_coordinates").fetch("latitude"), |
|
:longitude => address_node.fetch("geographic_coordinates").fetch("longitude"), |
|
:coordinate_reliablity => address_node.fetch("geographic_coordinates").fetch("coordinate_reliablity"), |
|
}) |
|
end |
|
|
|
def map_location(location_node) |
|
Models::Location.new({ |
|
:location_nr => location_node.fetch("location_nr"), |
|
:parent_location_nr => location_node.fetch("parent_location_nr"), |
|
:location_name => location_node.fetch("location_name"), |
|
:type => location_node.fetch("type"), |
|
:country_is_oa3 => location_node.fetch("country_is_oa3"), |
|
:main_region => location_node.fetch("main_region"), |
|
:postal_code_range => location_node.fetch("postal_code_range"), |
|
:latitude => location_node.fetch("latitude"), |
|
:longitude => location_node.fetch("longitude"), |
|
:sort_index => location_node.fetch("sort_index"), |
|
}) |
|
end |
|
|
|
def map_price(price_node) |
|
Models::Price.new({ |
|
:euro_exchange_rate => price_node.fetch("@euro_exchange_rate"), |
|
:amount_after_tax => price_node.fetch("@amount_after_tax"), |
|
:currency => price_node.fetch("@currency"), |
|
}) |
|
end |
|
|
|
end |