2016-04-12 26 views
1

Google Takvim API'sinin bazı işlevlerini uyguluyorum. Google takvimiyle senkronizasyon yapabilme özelliğine sahip bir takvimim var. Bu, takvimimden takvim ve etkinlikleri Google Takvim hesabına oluşturabilir ve düzenleyebilirsiniz. Karşılaştığım ana sorun, etkinliği doğrudan benim google takvimimden güncellerse. Push bildirimlerini uygulayıp şu şekilde yanıt aldım:Google Takvim Etkinliği değiştirildiği zaman DB'yi Güncelle

{ 
     "Google_channel_ID": "19835150 - 0057 - 11e6 - bc9c - 1735798 ca540", 
     "Google_channel_token": "calendar_id = 4e7 d5c20ht9lpfdtuukcsvgeq4 @group.calendar.google.com & user_id = 43e d7rxeqqce3fk09ahszc", 
     "Google_channel_expiration": "Tue,12 Apr 2016 12: 34: 36 GMT", 
     "Google_resource_id": "oLMEEhHAw5Xo3r2187CWykjAtm0", 
     "Google_resource_URI": "https: //www.googleapis.com/calendar/v3/calendars/[email protected]/events?alt=json", 
     "Google_resource_state": "sync", 
     "Google_message_number": "1" 
    } 

Ancak bu yanıt çok geneldir. Örneğin, bu takvimde 1000 etkinliğim varsa ve 1000 olayın tamamını güncellerseniz. Her zaman aynı bildirimi 1000 alacağım. Bilmek istiyorum, hangi olay kimliğinin değiştiğini bulmak mümkün ise, bu yüzden DB'mi gerçekleştirebilir ve güncelleyebilirim.

Ben nöbet init yolu şu şekildedir: hangi olayları almak için iyi bir yol arıyoruz insanlar için

exports.watch = function(req, res){ 
     var channel_id  = uuid.v1(); 
     var user_id  = req.body.user_id; 
     var calendar_id  = req.body.calendar_id; 

     authorize(user_id, function(oauth2Client){ 
      var data = { 
      auth: oauth2Client, 
      calendarId: calendar_id, 
      resource: { 
       id: channel_id, 
       token: 'calendar_id='+ calendar_id + '&user_id=' + user_id, 
       address: 'https://api.medradr.com/google-watch', 
       type: 'web_hook', 
       params: { 
        ttl: '36000' 
      } 
     } 
     }; 
     calendar.events.watch(data, function (err, response) { 
      if (err) { 
       console.error('The API returned an error: ' + err); 
       return; 
      }else{ 
       res.send({ok: true, message: 'Listener created', result:response}); 
      } 
     }); 
    }); 
    } 
+0

Çoğalt. Bu [konu] bölümünde soru yanıtlandı (http://stackoverflow.com/questions/18206024/update-database-if-change-in-google-calendar-event). – noogui

+0

Bu iş parçacığında düzgün bir şekilde yanıtlanmadı. İlk sorumu okursanız, push bildirimlerinin başarıyla yapılandırıldığını görecek ve her defasında o takvimdeki bir şey olduğunda push bildirimleri aldım. Asıl soru şuydu: Şimdi push olaylarının tetiklediği olayların hangileri değişti? Zaten bir çözüm buldum ve cevabı buraya yazdım. –

cevap

4

zaman web kanca tetikler değiştirdi. Böyle bir şey alacak X-Goog-Kaynak-URI günü

X-Goog-Channel-ID: channel-ID-value 
    X-Goog-Channel-Token: channel-token-value 
    X-Goog-Channel-Expiration: expiration-date-and-time // In human-readable format; present only if channel expires. 
    X-Goog-Resource-ID: identifier-for-the-watched-resource 
    X-Goog-Resource-URI: version-specific-URI-of-the-watched-resource 
    X-Goog-Resource-State: sync 
    X-Goog-Message-Number: 1 

: web kanca tetiklendiğinde, böyle bir şey alacak Seninle OAuth kimlik doğrulaması

https://www.googleapis.com/calendar/v3/calendars/[email protected]/events?alt=json 

, Bu takvime ait tüm etkinlikleri almak için bu URL'ye bir GET isteği gönderebilirsiniz. Şimdi hangi kaynakların değiştiğini bilmek hiledir. Her olay için böyle bir şey alacak:

 { 
      event_id: 335, 
      user_id: '43ed7rxeqqce3fk09ahszc', 
      kind: 'calendar#event', 
      etag: '"2921213870180000"', 
      google_id: 'cpbcesg966skprb3rh1p1ud668', 
      status: 'confirmed', 
      htmlLink: 'https://www.google.com/calendar/event?eid=Y3BiY2VzZzk2NnNrcHJiM3JoMXAxdWQ2NjggNGU3ZDVjMjBodDlscGZkdHV1a2NzdmdlcTRAZw', 
      created: Thu Apr 14 2016 00:00:00 GMT-0500 (CDT), 
      updated: Thu Apr 14 2016 00:00:00 GMT-0500 (CDT), 
      summary: 'Testing google notifications', 
      description: '', 
      creator: '[email protected]', 
      organizer: '[email protected]', 
      start: Sat Apr 09 2016 00:00:00 GMT-0500 (CDT), 
      end: Sun Apr 10 2016 00:00:00 GMT-0500 (CDT), 
      iCalUID: '[email protected]', 
      event_type_id: 0, 
      calendar_id: 0, 
      timezone_id: 0, 
      sequence: 0, 
      calendar_color_id: '' 
    } 

Gördüğünüz gibi, bir dizisidir: 0, bu aşamalıdır. Bu, etkinliğinizde bazı değişiklikler uyguladığınız zaman (özet, açıklama, başlangıç ​​tarihi, bitiş tarihi, vb.) Anlamına gelir. Bu sayı +1 artırılacaktır. Bunu veritabanınıza kaydedebilirsiniz, böylece web kancası her tetiklendiğinde, yalnızca diziyi kaydedilen sıradan daha büyük olan olayları güncelleştirirsiniz. Temel olarak, olayı günceller ve dizinin yeni değerini kaydedersiniz. Web kancası bir sonraki sefer tetiklendiğinde, yalnızca DB'nizde bu durumda bulunan olayları güncelleyecektir.

Yardım edin, mutlu kodlar.

İlgili konular