与初始 time_max 的 Google 日历增量同步

Ric*_*man 6 ruby ruby-on-rails google-calendar-api

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

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

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

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

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

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

这是我用来将来自谷歌的事件同步到我的应用程序的代码

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
Run Code Online (Sandbox Code Playgroud)

我是个傻瓜,遗漏了一些明显的东西吗?

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

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

Ric*_*man 5

我最终删除了 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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)