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