class VacationRentalsIcalAdapters::Adapters::JsonAvailabilityMapAdapter
Availability map response format should be similar to
{
"availabilities": [ { "map":"1111100000000011", "start_date":"2016-12-08" } ]
}
Public Instance Methods
applicable?(body:, source:)
click to toggle source
# File lib/vacation_rentals_ical_adapters/adapters/json_availability_map_adapter.rb, line 17 def applicable?(body:, source:) begin availability = JSON.parse(body)["availabilities"][0] !!(availability["map"].present? && availability["start_date"].to_date) rescue false end end
to_ical(body)
click to toggle source
# File lib/vacation_rentals_ical_adapters/adapters/json_availability_map_adapter.rb, line 26 def to_ical(body) events = parse_events(body) VacationRentalsIcalAdapters::IcalConverter.to_ical(events) end
Private Instance Methods
extract_ranges(body)
click to toggle source
# File lib/vacation_rentals_ical_adapters/adapters/json_availability_map_adapter.rb, line 42 def extract_ranges(body) availability = JSON.parse(body)["availabilities"][0] days = availability["map"].split(//) start_date = availability["start_date"].to_date end_date = start_date.advance(days: days.length) ranges = [] previous_state = nil range_start_date = start_date (start_date..end_date).each_with_index do |day, index| previous_state ||= days[index] current_state = days[index] if current_state != previous_state ranges << { start_date: range_start_date, end_date: day, state: previous_state } range_start_date = day previous_state = current_state end end ranges.find_all { |range| range[:state] != "0" } end
parse_events(body)
click to toggle source
# File lib/vacation_rentals_ical_adapters/adapters/json_availability_map_adapter.rb, line 33 def parse_events(body) extract_ranges(body).map do |range| VacationRentalsIcalAdapters::Event.new( start_date: range[:start_date].iso8601, end_date: range[:end_date].iso8601 ) end end