Google日历增量同步,初始time_max

时间:2017-01-24 20:19:27

标签: ruby-on-rails ruby google-calendar-api

我尝试将Google日历与我的rails应用程序同步。我一直在关注Google提供的文档: Synchronize Resources Efficiently

我的目标是仅将事件在未来一年同步,并将重复事件分成单个事件,这样我就不必处理重复规则的复杂性并为重复的父事件创建子事件。

在初始同步期间,我将time_max设置为未来1年,在初始同步期间,我只会在未来一年内获得重复事件。

当我执行增量同步时,我会传递同步令牌并期望将重复性事件限制在初始同步时间_max的一年内,但这不是我所看到的。我看到的事件已经过了一年(〜10年)。

在增量同步期间,由于Google收到此预期错误,我无法设置time_max。

  

捕获错误syncTokenWithRequestRestrictions:同步令牌不能与其他请求限制一起使用。

这是我用来将Google中的事件同步到我的应用程序中的代码

def sync_from_google
    next_page_token = nil

    begin
      if sync_token.nil? # full sync
        response = @calendar_service.list_events(google_id,
          time_min: Time.now.utc.strftime("%FT%TZ"),
          time_max: 1.year.from_now.utc.strftime("%FT%TZ"),
          single_events: true)
      else # incremental sync
        response = @calendar_service.list_events(google_id,
          sync_token: sync_token,
          page_token: next_page_token,
          single_events: true)
      end

      response.items.each do |gevent|
        GoogleCalendarEvent.create_event(self.id, gevent, nil)
      end
      next_page_token = response.next_page_token

    rescue Google::Apis::ClientError => error
      if error.status_code == 410
        self.unsync
      end
    end while (response.next_sync_token.nil?)

    update_attributes(synced: true, sync_token: response.next_sync_token)
end

我是一个假人并且遗失了一些明显的东西吗?

初始同步提供的sync_tokens应该存储所需事件的时间范围吗?

还有其他方法可以限制增量同步的时间范围吗?

1 个答案:

答案 0 :(得分:3)

我最终删除了single_events参数,然后使用定义的time_min&手动循环遍历重复事件的实例。 time_max。

这是更新的代码,任何人都会在将来偶然发现这一点。

def sync_from_google
    next_page_token = nil

    begin
      if sync_token.nil? # full sync
        response = @calendar_service.list_events(google_id,
          time_min: Time.now.utc.strftime("%FT%TZ"),
          time_max: 1.year.from_now.utc.strftime("%FT%TZ"))
      else # incremental sync
        response = @calendar_service.list_events(google_id,
          sync_token: sync_token,
          page_token: next_page_token)
      end

      response.items.each do |gevent|
        if gevent.recurrence
            sync_reccuring_events(gevent)
        else
          GoogleCalendarEvent.create_event(self.id, gevent, nil)
        end
      end
      next_page_token = response.next_page_token

    rescue Google::Apis::ClientError => error
      if error.status_code == 410
        self.unsync
      end
    end while (response.next_sync_token.nil?)

    update_attributes(synced: true, sync_token: response.next_sync_token)
end

以及循环重复事件实例的附加方法

def sync_reccuring_events(google_event)
    next_page_token = nil

    begin
      response = calendar_service.list_event_instances(google_id,
        google_event.id,
        time_min: Time.now.utc.strftime("%FT%TZ"),
        time_max: 1.year.from_now.utc.strftime("%FT%TZ"),
        page_token: next_page_token)

      response.items.each do |gevent|
          GoogleCalendarEvent.create_event(self.id, gevent, nil)
      end
      next_page_token = response.next_page_token

    end while (next_page_token)
end