Skip to content

Commit 8af12b8

Browse files
committed
Fixed issues relating to calendar connection & deletion in UserMeetingSettingsService.
Previously, when connecting calendars, there were some issues, described in #590. These issues are addressed in the following ways: 1. The NylasService methods were named import because default importing was causing 'getPrimaryCalendar' method to behave asynchronous instead of synchronous. This was the reason for missing ids, as the asynchr> 2. The param 'calendar' sent to method 'createUserMeetingSettingsIfNotExisting' expects keys in Nylas backend API format, so calendarDetails object was extended with 'is_primary' key in 'handleConnectCalendarCallback' method - specifically when creating new UserMeetingSettings. This solved the missing 'isPrimary' values in UserMeetingSettings nylasCalendars array; 3. The method 'getUserMeetingSettingsByUserId' was stripping unwanted data when getting a UserMeetingSettings object. Since this method was reused in 'deleteUserCalendar' method, the former method was updated to not strip unwanted data for this case. This was causing calendar data to be modified with missing key/values after deleting a calendar;
1 parent b0b07a9 commit 8af12b8

File tree

1 file changed

+27
-13
lines changed

1 file changed

+27
-13
lines changed

src/services/UserMeetingSettingsService.js

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,13 @@ const {
1717
const UserMeetingSettings = models.UserMeetingSettings
1818
const { Interviews: InterviewConstants } = require('../../app-constants')
1919
const esClient = helper.getESClient()
20-
const NylasService = require('./NylasService')
20+
const {
21+
getAvailableTimeFromSchedulingPage,
22+
getTimezoneFromSchedulingPage,
23+
getAccessToken,
24+
getExistingCalendars,
25+
getPrimaryCalendar
26+
} = require('./NylasService')
2127
const jwt = require('jsonwebtoken')
2228

2329
/**
@@ -48,14 +54,18 @@ function stripUnwantedData (userMeetingSettings) {
4854
return userMeetingSettings
4955
}
5056

57+
function handleUserMeetingSettingsData (data, shouldNotStripUnwantedData) {
58+
return shouldNotStripUnwantedData ? data : stripUnwantedData(data)
59+
}
60+
5161
/**
5262
* Get UserMeetingsettings by userid
5363
* @param {Object} currentUser the user who perform this operation.
5464
* @param {String} userId the user id
5565
* @param {Boolean} fromDb flag if query db for data or not
5666
* @returns {Object} the userMeetingSetting object
5767
*/
58-
async function getUserMeetingSettingsByUserId (currentUser, userId, fromDb) {
68+
async function getUserMeetingSettingsByUserId (currentUser, userId, fromDb, shouldNotStripUnwantedData) {
5969
// check permission
6070
await ensureUserIsPermitted(currentUser, userId)
6171
if (!fromDb) {
@@ -68,7 +78,7 @@ async function getUserMeetingSettingsByUserId (currentUser, userId, fromDb) {
6878
// extract interviews from ES object
6979
const userMeetingSettings = _.get(userMeetingSettingsES, 'body._source', [])
7080
if (userMeetingSettings) {
71-
return stripUnwantedData(userMeetingSettings)
81+
return handleUserMeetingSettingsData(userMeetingSettings, shouldNotStripUnwantedData)
7282
}
7383
throw new errors.NotFoundError(`The userMeetingSettings for userId=${userId} not found.`)
7484
} catch (err) {
@@ -88,12 +98,13 @@ async function getUserMeetingSettingsByUserId (currentUser, userId, fromDb) {
8898
throw new errors.NotFoundError(`The userMeetingSettings for userId=${userId} not found.`)
8999
}
90100

91-
return stripUnwantedData(userMeetingSettings.dataValues)
101+
return handleUserMeetingSettingsData(userMeetingSettings, shouldNotStripUnwantedData)
92102
}
93103
getUserMeetingSettingsByUserId.schema = Joi.object().keys({
94104
currentUser: Joi.object().required(),
95105
userId: Joi.string().uuid().required(),
96-
fromDb: Joi.boolean()
106+
fromDb: Joi.boolean(),
107+
shouldNotStripUnwantedData: Joi.boolean()
97108
}).required()
98109

99110
// TODO document
@@ -102,10 +113,11 @@ async function createUserMeetingSettingsIfNotExisting (currentUser, userId, cale
102113
await ensureUserIsPermitted(currentUser, userId)
103114

104115
let userMeetingSettings = await UserMeetingSettings.findById(userId, false)
116+
105117
const payload = {
106118
id: userId,
107-
defaultAvailableTime: await NylasService.getAvailableTimeFromSchedulingPage(schedulingPage),
108-
defaultTimezone: await NylasService.getTimezoneFromSchedulingPage(schedulingPage),
119+
defaultAvailableTime: await getAvailableTimeFromSchedulingPage(schedulingPage),
120+
defaultTimezone: await getTimezoneFromSchedulingPage(schedulingPage),
109121
createdBy: await helper.getUserId(currentUser.userId),
110122
nylasCalendars: [].concat({
111123
accessToken: calendar.accessToken,
@@ -115,6 +127,7 @@ async function createUserMeetingSettingsIfNotExisting (currentUser, userId, cale
115127
isPrimary: calendar.is_primary
116128
})
117129
}
130+
118131
if (_.isNil(userMeetingSettings)) {
119132
userMeetingSettings = await UserMeetingSettings.create(payload, { transaction: transaction })
120133
await processCreate(userMeetingSettings.toJSON())
@@ -178,21 +191,19 @@ async function handleConnectCalendarCallback (reqQuery) {
178191

179192
try {
180193
// getting user's accessToken from Nylas using 'code' found in request query
181-
const { accessToken, accountId, provider } = await NylasService.getAccessToken(reqQuery.code)
182-
194+
const { accessToken, accountId, provider } = await getAccessToken(reqQuery.code)
183195
// view https://developer.nylas.com/docs/api/#post/oauth/token for error response schema
184196
if (!accessToken || !accountId) {
185197
throw new errors.BadRequestError('Error during getting access token for the calendar.')
186198
}
187199

188200
// getting user's all existing calendars
189-
const calendars = await NylasService.getExistingCalendars(accessToken)
190-
201+
const calendars = await getExistingCalendars(accessToken)
191202
if (!Array.isArray(calendars) || calendars.length < 1) {
192203
throw new errors.BadRequestError('Error getting calendar data for the user.')
193204
}
194205

195-
const primaryCalendar = NylasService.getPrimaryCalendar(calendars)
206+
const primaryCalendar = getPrimaryCalendar(calendars)
196207
if (!primaryCalendar) {
197208
throw new errors.NotFoundError('Could not find any writable calendar.')
198209
}
@@ -215,6 +226,9 @@ async function handleConnectCalendarCallback (reqQuery) {
215226

216227
// reuse this method to create UserMeetingSettings object
217228
if (_.isNil(userMeetingSettings)) {
229+
// method 'createUserMeetingSettingsIfNotExisting' expects keys in Nylas backend
230+
// API format, so extend calendarDetails object with 'is_primary' key
231+
_.extend(calendarDetails, { is_primary: calendarDetails.isPrimary })
218232
userMeetingSettings = await createUserMeetingSettingsIfNotExisting(
219233
currentUser,
220234
userId,
@@ -272,7 +286,7 @@ async function deleteUserCalendar (currentUser, reqParams) {
272286
await ensureUserIsPermitted(currentUser, reqParams.userId)
273287

274288
try {
275-
const userMeetingSettings = await getUserMeetingSettingsByUserId(currentUser, reqParams.userId)
289+
const userMeetingSettings = await getUserMeetingSettingsByUserId(currentUser, reqParams.userId, false, true)
276290

277291
// error if no calendar found with the given id in request param
278292
if (

0 commit comments

Comments
 (0)