@@ -61,42 +61,49 @@ module.exports = function(RED) {
6161 var request = {
6262 url : 'https://www.googleapis.com/calendar/v3/calendars/' + cal . id + '/events' ,
6363 } ;
64- if ( typeof msg . payload === 'object' ) {
65- request . qs = msg . payload ;
66- } else {
67- request . qs = {
68- maxResults : 1 ,
69- orderBy : 'startTime' ,
70- singleEvents : true ,
71- } ;
72- if ( msg . after instanceof Date ) {
73- request . qs . timeMin = msg . after . toISOString ( ) ;
74- } else if ( typeof msg . after === 'string' ) {
75- request . qs . timeMin = msg . timeMin ;
76- } else {
77- request . qs . timeMin = ( new Date ( ) ) . toISOString ( ) ;
78- }
79- if ( msg . payload ) {
80- request . qs . q = RED . util . ensureString ( msg . payload ) ;
81- }
64+ var now = new Date ( ) ;
65+ request . qs = {
66+ maxResults : 10 ,
67+ orderBy : 'startTime' ,
68+ singleEvents : true ,
69+ timeMin : now . toISOString ( )
70+ } ;
71+ if ( msg . payload ) {
72+ request . qs . q = RED . util . ensureString ( msg . payload ) ;
8273 }
8374 node . google . request ( request , function ( err , data ) {
8475 if ( err ) {
8576 node . error ( "Error: " + err . toString ( ) ) ;
8677 node . status ( { fill :"red" , shape :"ring" , text :"failed" } ) ;
8778 } else if ( data . error ) {
88- node . error ( "Error: " + data . error . message ) ;
79+ node . error ( "Error " + data . error . code + ": " +
80+ JSON . stringify ( data . error . message ) ) ;
8981 node . status ( { fill :"red" , shape :"ring" , text :"failed" } ) ;
9082 } else {
91- var ev = data . items [ 0 ] ;
83+ var payload = msg . payload = { } ;
84+ var ev ;
85+ /* 0 - 10 events ending after now ordered by startTime
86+ * so we find the first that starts after now to
87+ * give us the "next" event
88+ */
89+ for ( var i = 0 ; i < data . items . length ; i ++ ) {
90+ ev = data . items [ i ] ;
91+ var start = getEventDate ( ev ) ;
92+ if ( start && start . getTime ( ) > now . getTime ( ) ) {
93+ payload . start = start ;
94+ break ;
95+ }
96+ ev = undefined ;
97+ }
9298 if ( ! ev ) {
9399 delete msg . data ;
94100 node . send ( msg ) ;
95101 node . status ( { fill :"red" , shape :"ring" , text :"no event" } ) ;
96102 return ;
97103 }
98- var payload = msg . payload = { } ;
99- payload . title = msg . title = ev . summary ;
104+ if ( ev . summary ) {
105+ payload . title = msg . title = ev . summary ;
106+ }
100107 if ( ev . description ) {
101108 payload . description = msg . description = ev . description ;
102109 } else {
@@ -116,27 +123,19 @@ module.exports = function(RED) {
116123 } else {
117124 delete msg . location ;
118125 }
119- if ( ev . start . dateTime ) {
120- payload . start = new Date ( ev . start . dateTime ) ;
121- delete payload . allDayEvent ;
122- } else if ( ev . start . date ) {
123- payload . start = new Date ( ev . start . date ) ;
126+ if ( ev . start && ev . start . date ) {
124127 payload . allDayEvent = true ;
125- } else {
126- delete payload . start ;
127- delete payload . allDayEvent ;
128128 }
129- if ( ev . end . dateTime ) {
130- payload . end = new Date ( ev . end . dateTime ) ;
131- } else if ( ev . end . date ) {
132- payload . end = new Date ( ev . end . date ) ;
133- } else {
134- delete payload . end ;
129+ var end = getEventDate ( ev , 'end' ) ;
130+ if ( end ) {
131+ payload . end = end ;
132+ }
133+ if ( ev . creator ) {
134+ payload . creator = {
135+ name : ev . creator . displayName ,
136+ email : ev . creator . email ,
137+ } ;
135138 }
136- payload . creator = {
137- name : ev . creator . displayName ,
138- email : ev . creator . email ,
139- } ;
140139 if ( ev . attendees ) {
141140 payload . attendees = [ ] ;
142141 ev . attendees . forEach ( function ( a ) {
@@ -156,6 +155,19 @@ module.exports = function(RED) {
156155 }
157156 RED . nodes . registerType ( "google calendar" , GoogleCalendarQueryNode ) ;
158157
158+ function getEventDate ( ev , type ) {
159+ if ( typeof type === 'undefined' ) {
160+ type = 'start' ;
161+ }
162+ if ( ev [ type ] && ev [ type ] . dateTime ) {
163+ return new Date ( ev [ type ] . dateTime ) ;
164+ } else if ( ev . start && ev . start . date ) {
165+ return new Date ( ev [ type ] . date ) ;
166+ } else {
167+ return null ;
168+ }
169+ }
170+
159171 GoogleCalendarQueryNode . prototype . calendarByName = function ( name ) {
160172 for ( var cal in this . calendars ) {
161173 if ( this . calendars . hasOwnProperty ( cal ) ) {
0 commit comments