flavorjones/calendar-assistant

View on GitHub
lib/calendar_assistant/local_service.rb

Summary

Maintainability
A
25 mins
Test Coverage
A
100%
class CalendarAssistant
  class LocalService
    Result = Struct.new(:items)
    attr_reader :file

    def initialize(file: nil, load_events: true)
      @file = file
      if (@file && File.exist?(@file) && load_events)
        payload = File.read(@file)
        @store = if YAML.respond_to?(:unsafe_load)
          YAML::unsafe_load(payload)
        else
          YAML::load(payload)
        end
      else
        @store = {}
      end
    end

    def list_events(calendar_id, options)
      time_min = Time.parse(options.fetch(:time_min))
      time_max = Time.parse(options.fetch(:time_max))
      search_range = time_min..time_max

      events = get_calendar_events(calendar_id).map do |id, event|
        event_range = (event.start.date_time || event.start.date)..(event.end.date_time || event.end.date)
        event if (event_range.first < search_range.last && event_range.last > search_range.first)
      end.compact
      Result.new(events)
    end

    def insert_event(calendar_id, event)
      save do
        get_calendar_events(calendar_id)[event.id] = event
      end
    end

    def delete_event(calendar_id, id)
      save do
        get_calendar_events(calendar_id).delete(id)
      end
    end

    def update_event(calendar_id, id, event)
      save do
        get_calendar_events(calendar_id)[id] = event
      end
    end

    def get_event(calendar_id, id)
      get_calendar_events(calendar_id)[id]
    end

    def insert_calendar(calendar)
      save do
        @store[calendar.id] ||= {}
        @store[calendar.id][:calendar] = calendar
        @store[calendar.id][:events] = {}
      end
    end

    def get_calendar(calendar_id)
      get_calendar_and_events(calendar_id)[:calendar]
    end

    private

    def get_calendar_and_events(calendar_id)
      return @store[calendar_id] if @store.has_key?(calendar_id)
      return @store.first[1] if @store.length > 0
      raise Google::Apis::ClientError.new("notFound")
    end

    def get_calendar_events(calendar_id)
      get_calendar_and_events(calendar_id)[:events]
    end

    def save
      obj = yield
      if (file)
        File.open(file, "w") { |f| f.write(@store.to_yaml) }
      end

      obj
    end
  end
end