2017-01-24 1 views
0

Я пытаюсь синхронизировать календарь Google с моим рельсовым приложением. Я слежу за документацией, предоставленной Google: Synchronize Resources Efficiently.Инкрементная синхронизация Google Calendar с начальным временем_макс

Моя цель - только синхронизировать события один год в будущем и разделить повторяющиеся события на отдельные события, чтобы мне не приходилось иметь дело со сложностью правил повторения и создания дочерних событий для повторяющихся родительских событий.

Во время начальной синхронизации я установил time_max в течение 1 года в будущем и во время начальной синхронизации. Я получаю повторяющиеся события до одного года в будущем.

Когда я выполняю инкрементную синхронизацию, я передаю токен синхронизации и ожидаю получить повторяющиеся события, ограниченные в течение одного года от времени_макса начальной синхронизации, но это не то, что я вижу. Я вижу события за последний год (~ 10 лет).

Во время инкрементной синхронизации я не могу установить time_max, поскольку получаю это Ожидаемая ошибка от Google.

Попадание ошибки 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, предоставленный начальной синхронизацией, хранить временной диапазон желаемых событий?

Есть ли другой способ, которым я могу ограничить временной диапазон инкрементной синхронизации?

+0

ли вы попробуйте удалить 'time_max', чтобы увидеть, если это все равно будет происходить? Если нет, это может быть один из токенов синхронизации фильтра, который несовместим с использованием, указанным в [Пример кода] (https://developers.google.com/google-apps/calendar/v3/sync#sample_code). –

+0

SingleEvents = true допускается при инкрементной синхронизации (только времяMin и timeMax отсутствуют, и вы должны опубликовать неинтересные записи, которые поступают с инкрементной синхронизацией) – luc

ответ

1

В результате я удалил параметр 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 
Смежные вопросы