Skip to content

Commit b0b07a9

Browse files
committed
fix connecting first calendar without timezone
1 parent e43c5f9 commit b0b07a9

File tree

4 files changed

+29
-9
lines changed

4 files changed

+29
-9
lines changed

migrations/2021-09-30-interview-nylas.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ module.exports = {
5050
defaultAvailableTime: nylasAvailableTimeSchema('defaultAvailableTime'),
5151
defaultTimezone: {
5252
field: 'defaultTimezone',
53-
type: Sequelize.STRING(255),
54-
allowNull: false
53+
type: Sequelize.STRING(255)
5554
},
5655
nylasCalendars: nylasCalendarsSchema(),
5756
createdBy: {

src/models/UserMeetingSettings.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,7 @@ module.exports = (sequelize) => {
5353
defaultAvailableTime: nylasAvailableTimeSchema('defaultAvailableTime'),
5454
defaultTimezone: {
5555
field: 'defaultTimezone',
56-
type: Sequelize.STRING(255),
57-
allowNull: false
56+
type: Sequelize.STRING(255)
5857
},
5958
nylasCalendars: nylasCalendarsSchema(),
6059
createdBy: {

src/services/NylasService.js

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ async function createVirtualCalendarForUser (userId, userEmail, userFullName, ti
4242
if (_.isEmpty(calendars)) {
4343
calendar = await createVirtualCalendar(userFullName, timezone, accessToken)
4444
} else {
45-
calendar = calendars.find(c => c.is_primary) || calendars[0]
45+
calendar = getPrimaryCalendar(calendars)
4646
}
4747
return _.extend(calendar, { accessToken: accessToken })
4848
}
@@ -162,12 +162,35 @@ async function patchSchedulingPage (pageId, accessToken, changes) {
162162
return page
163163
}
164164

165+
/**
166+
* Detect calendar which would be used as a primary one
167+
*
168+
* @param {Array<Object>} calendars list of Nylas calendars
169+
* @returns
170+
*/
171+
function getPrimaryCalendar (calendars) {
172+
const primaryCalendar = _.find(calendars, { is_primary: true, read_only: false })
173+
174+
if (primaryCalendar) {
175+
return primaryCalendar
176+
}
177+
178+
const writableCalendars = _.filter(calendars, { read_only: false })
179+
180+
if (writableCalendars.length > 0) {
181+
return writableCalendars[0]
182+
}
183+
184+
return null
185+
}
186+
165187
module.exports = {
166188
createVirtualCalendarForUser,
167189
createSchedulingPage,
168190
patchSchedulingPage,
169191
getAvailableTimeFromSchedulingPage,
170192
getTimezoneFromSchedulingPage,
171193
getExistingCalendars,
172-
getAccessToken
194+
getAccessToken,
195+
getPrimaryCalendar
173196
}

src/services/UserMeetingSettingsService.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -192,9 +192,9 @@ async function handleConnectCalendarCallback (reqQuery) {
192192
throw new errors.BadRequestError('Error getting calendar data for the user.')
193193
}
194194

195-
const primaryCalendar = calendars.find(c => c.is_primary)
195+
const primaryCalendar = NylasService.getPrimaryCalendar(calendars)
196196
if (!primaryCalendar) {
197-
throw new errors.NotFoundError('Could not find any primary calendar in Nylas backend server.')
197+
throw new errors.NotFoundError('Could not find any writable calendar.')
198198
}
199199

200200
const calendarDetails = {
@@ -225,7 +225,6 @@ async function handleConnectCalendarCallback (reqQuery) {
225225
booking: { opening_hours: [] }
226226
}
227227
})
228-
await processCreate(userMeetingSettings)
229228
} else { // or just update calendar details in the exisiting object
230229
const calendarIndexInUserMeetingSettings = _.findIndex(userMeetingSettings.nylasCalendars, (item) => item.id === calendarDetails.id)
231230

0 commit comments

Comments
 (0)