Skip to content

Commit 4593901

Browse files
committed
Adding support for generic duration format
1 parent 9ee4dab commit 4593901

File tree

2 files changed

+39
-42
lines changed

2 files changed

+39
-42
lines changed

config/default.js

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -244,10 +244,6 @@ module.exports = {
244244
NOTIFICATION_SENDER_EMAIL: process.env.NOTIFICATION_SENDER_EMAIL,
245245
// the email notification sendgrid template id
246246
NOTIFICATION_SENDGRID_TEMPLATE_ID: process.env.NOTIFICATION_SENDGRID_TEMPLATE_ID,
247-
// hours after interview completed when we should post the notification
248-
INTERVIEW_COMPLETED_NOTIFICATION_HOURS: process.env.INTERVIEW_COMPLETED_NOTIFICATION_HOURS || 4,
249-
// no of weeks before expiry when we should post the notification
250-
RESOURCE_BOOKING_EXPIRY_NOTIFICATION_WEEKS: process.env.RESOURCE_BOOKING_EXPIRY_NOTIFICATION_WEEKS || 3,
251247
// frequency of cron checking for available candidates for review
252248
CRON_CANDIDATE_REVIEW: process.env.CRON_CANDIDATE_REVIEW || '00 00 13 * * 0-6',
253249
// frequency of cron checking for coming up interviews
@@ -259,5 +255,15 @@ module.exports = {
259255
// frequency of cron checking for post interview actions
260256
CRON_POST_INTERVIEW: process.env.CRON_POST_INTERVIEW || '00 00 13 * * 0-6',
261257
// frequency of cron checking for upcoming resource bookings
262-
CRON_UPCOMING_RESOURCE_BOOKING: process.env.CRON_UPCOMING_RESOURCE_BOOKING || '00 00 13 * * 1'
258+
CRON_UPCOMING_RESOURCE_BOOKING: process.env.CRON_UPCOMING_RESOURCE_BOOKING || '00 00 13 * * 1',
259+
// The match window for fetching interviews which are coming up
260+
INTERVIEW_COMING_UP_MATCH_WINDOW: process.env.INTERVIEW_COMING_UP_MATCH_WINDOW || 'PT5M',
261+
// The remind time for fetching interviews which are coming up
262+
INTERVIEW_COMING_UP_REMIND_TIME: (process.env.INTERVIEW_COMING_UP_REMIND_TIME || 'PT1H,PT24H').split(','),
263+
// The match window for fetching completed interviews
264+
INTERVIEW_COMPLETED_MATCH_WINDOW: process.env.INTERVIEW_COMPLETED_MATCH_WINDOW || 'PT5M',
265+
// The interview completed past time for fetching interviews
266+
INTERVIEW_COMPLETED_PAST_TIME: process.env.INTERVIEW_COMPLETED_PAST_TIME || 'PT4H',
267+
// The time before resource booking expiry when we should start sending notifications
268+
RESOURCE_BOOKING_EXPIRY_TIME: process.env.RESOURCE_BOOKING_EXPIRY_TIME || 'P21D'
263269
}

src/services/EmailNotificationService.js

Lines changed: 28 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ async function getDataForInterview (interview, jobCandidate, job) {
8888

8989
const interviewLink = `${config.TAAS_APP_URL}/${job.projectId}/positions/${job.id}/candidates/interviews`
9090
const guestName = _.isEmpty(interview.guestNames) ? '' : interview.guestNames[0]
91-
const startTime = _.isEmpty(interview.startTimestamp) ? '' : interview.startTimestamp.toUTCString()
91+
const startTime = interview.startTimestamp ? interview.startTimestamp.toUTCString() : ''
9292

9393
return {
9494
jobTitle: job.title,
@@ -182,43 +182,33 @@ async function sendCandidatesAvailableEmails () {
182182
*/
183183
async function sendInterviewComingUpEmails () {
184184
const currentTime = moment.utc()
185-
const minutesRange = 5
186-
187-
const oneDayFromNow = currentTime.clone().add(24, 'hours')
188-
const dayEndTime = oneDayFromNow.clone().add(minutesRange, 'minutes')
185+
const timestampFilter = {
186+
[Op.or]: []
187+
}
188+
const window = moment.duration(config.INTERVIEW_COMING_UP_MATCH_WINDOW)
189+
for (const remindTime of config.INTERVIEW_COMING_UP_REMIND_TIME) {
190+
const rangeStart = currentTime.clone().add(moment.duration(remindTime))
191+
const rangeEnd = rangeStart.clone().add(window)
192+
193+
timestampFilter[Op.or].push({
194+
[Op.and]: [
195+
{
196+
[Op.gt]: rangeStart
197+
},
198+
{
199+
[Op.lte]: rangeEnd
200+
}
201+
]
202+
})
203+
}
189204

190-
const oneHourFromNow = currentTime.clone().add(1, 'hour')
191-
const hourEndTime = oneHourFromNow.clone().add(minutesRange, 'minutes')
192205
const filter = {
193206
[Op.and]: [
194207
{
195208
status: { [Op.eq]: constants.Interviews.Status.Scheduled }
196209
},
197210
{
198-
startTimestamp: {
199-
[Op.or]: [
200-
{
201-
[Op.and]: [
202-
{
203-
[Op.gt]: oneDayFromNow
204-
},
205-
{
206-
[Op.lte]: dayEndTime
207-
}
208-
]
209-
},
210-
{
211-
[Op.and]: [
212-
{
213-
[Op.gt]: oneHourFromNow
214-
},
215-
{
216-
[Op.lte]: hourEndTime
217-
}
218-
]
219-
}
220-
]
221-
}
211+
startTimestamp: timestampFilter
222212
}
223213
]
224214
}
@@ -272,9 +262,9 @@ async function sendInterviewComingUpEmails () {
272262
* Sends email reminder to the interview host after it ends to change the interview status
273263
*/
274264
async function sendInterviewCompletedEmails () {
275-
const minutesRange = 5
276-
const hoursBeforeNow = moment.utc().subtract(config.INTERVIEW_COMPLETED_NOTIFICATION_HOURS, 'hours')
277-
const endTime = hoursBeforeNow.clone().add(minutesRange, 'minutes')
265+
const window = moment.duration(config.INTERVIEW_COMPLETED_MATCH_WINDOW)
266+
const rangeStart = moment.utc().subtract(moment.duration(config.INTERVIEW_COMPLETED_PAST_TIME))
267+
const rangeEnd = rangeStart.clone().add(window)
278268
const filter = {
279269
[Op.and]: [
280270
{
@@ -284,10 +274,10 @@ async function sendInterviewCompletedEmails () {
284274
endTimestamp: {
285275
[Op.and]: [
286276
{
287-
[Op.gte]: hoursBeforeNow
277+
[Op.gte]: rangeStart
288278
},
289279
{
290-
[Op.lt]: endTime
280+
[Op.lt]: rangeEnd
291281
}
292282
]
293283
}
@@ -396,7 +386,8 @@ async function sendPostInterviewActionEmails () {
396386
*/
397387
async function sendResourceBookingExpirationEmails () {
398388
const currentTime = moment.utc()
399-
const maxEndDate = currentTime.clone().add(config.RESOURCE_BOOKING_EXPIRY_NOTIFICATION_WEEKS, 'weeks')
389+
const maxEndDate = currentTime.clone().add(moment.duration(config.RESOURCE_BOOKING_EXPIRY_TIME))
390+
400391
const expiringResourceBookings = await ResourceBooking.findAll({
401392
where: {
402393
endDate: {

0 commit comments

Comments
 (0)