Skip to content

Commit 918e716

Browse files
authored
Merge pull request #757 from wickathou/feat/updated-project-review-process
Major update - Multiple bug fixes and micro features added
2 parents 36b9393 + cd04eb9 commit 918e716

85 files changed

Lines changed: 24934 additions & 23157 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.vscode/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
],
1616
"editor.formatOnSave": true,
1717
"editor.codeActionsOnSave": {
18-
"source.fixAll.eslint": true
18+
"source.fixAll.eslint": "explicit"
1919
},
2020
"editor.formatOnType": true,
2121
"javascript.format.semicolons": "remove",

backend/common/services/sendgrid.js

Lines changed: 93 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ const sendgridAddRecipientsToList = (listId, recipientIds) => {
3737
})
3838
}
3939

40+
const replaceLinebreaksToHtml = str => {
41+
return _.replace(str, /\n/gm, '<br />')
42+
}
43+
4044
// A function that takes in the email body as a string and replaces the tags with corresponding dynamic information
4145
const replaceBodyTags = (str, event, user) => {
4246
if (typeof str !== 'string' || !str.length) {
@@ -48,82 +52,115 @@ const replaceBodyTags = (str, event, user) => {
4852
}
4953

5054
if (!user || typeof user !== 'object') {
51-
throw new Error("User object is missing or not an object")
55+
throw new Error('User object is missing or not an object')
5256
}
5357

5458
const data = {
55-
"{USER_ID}": user.userId,
56-
"{FIRST_NAME}": user.firstName,
57-
"{LAST_NAME}": user.lastName,
58-
"{EVENT_NAME}": event.name,
59-
"{REGISTRATION_START_TIME}": moment(event.registrationStartTime).format('MMMM Do YYYY, h:mm:ss a'),
60-
"{REGISTRATION_END_TIME}": moment(event.registrationEndTime).format('MMMM Do YYYY, h:mm:ss a'),
61-
"{SUBMISSION_START_TIME}": moment(event.submissionStartTime).format('MMMM Do YYYY, h:mm:ss a'),
62-
"{SUBMISSION_END_TIME}": moment(event.submissionEndTime).format('MMMM Do YYYY, h:mm:ss a'),
63-
"{REVIEW_START_TIME}": moment(event.reviewStartTime).format('MMMM Do YYYY, h:mm:ss a'),
64-
"{REVIEW_END_TIME}": moment(event.reviewEndTime).format('MMMM Do YYYY, h:mm:ss a'),
65-
"{EVENT_START_TIME}": moment(event.startTime).format('MMMM Do YYYY, h:mm:ss a'),
66-
"{EVENT_END_TIME}": moment(event.endTime).format('MMMM Do YYYY, h:mm:ss a'),
67-
"{CURRENT_TIME}": moment().format('MMMM Do YYYY, h:mm:ss a'),
59+
'{USER_ID}': user.userId,
60+
'{FIRST_NAME}': user.firstName,
61+
'{LAST_NAME}': user.lastName,
62+
'{EVENT_NAME}': event.name,
63+
'{REGISTRATION_START_TIME}': moment(event.registrationStartTime).format(
64+
'MMMM Do YYYY, h:mm:ss a',
65+
),
66+
'{REGISTRATION_END_TIME}': moment(event.registrationEndTime).format(
67+
'MMMM Do YYYY, h:mm:ss a',
68+
),
69+
'{SUBMISSION_START_TIME}': moment(event.submissionStartTime).format(
70+
'MMMM Do YYYY, h:mm:ss a',
71+
),
72+
'{SUBMISSION_END_TIME}': moment(event.submissionEndTime).format(
73+
'MMMM Do YYYY, h:mm:ss a',
74+
),
75+
'{REVIEW_START_TIME}': moment(event.reviewStartTime).format(
76+
'MMMM Do YYYY, h:mm:ss a',
77+
),
78+
'{REVIEW_END_TIME}': moment(event.reviewEndTime).format(
79+
'MMMM Do YYYY, h:mm:ss a',
80+
),
81+
'{EVENT_START_TIME}': moment(event.startTime).format(
82+
'MMMM Do YYYY, h:mm:ss a',
83+
),
84+
'{EVENT_END_TIME}': moment(event.endTime).format(
85+
'MMMM Do YYYY, h:mm:ss a',
86+
),
87+
'{CURRENT_TIME}': moment().format('MMMM Do YYYY, h:mm:ss a'),
6888
}
6989
try {
7090
for (const key in data) {
7191
if (data[key] === null || data[key] === undefined) {
7292
console.error(`Data for key ${key} is missing or undefined`)
73-
continue // We skip this replacement if the data is missing
93+
continue // We skip this replacement if the data is missing
7494
}
7595
str = str.replace(new RegExp(key, 'g'), data[key]) // Replace all instances of the tag with the corresponding data
7696
}
7797
} catch (err) {
78-
console.error("Error replacing body tags:", err)
98+
console.error('Error replacing body tags:', err)
7999
return str
80100
}
81-
82101
return str
83102
}
84103

104+
const formatBody = (str, event, user) => {
105+
return replaceBodyTags(replaceLinebreaksToHtml(str), event, user)
106+
}
107+
85108
const SendgridService = {
86109
sendAcceptanceEmail: (event, user) => {
87-
88-
89-
var header_image_url = null
90-
if (typeof event.coverImage !== "undefined") {
110+
let header_image_url = null
111+
if (typeof event.coverImage !== 'undefined') {
91112
header_image_url = event.coverImage.url
92113
}
93114
const msg = SendgridService.buildTemplateMessage(
94115
user.email,
95116
global.gConfig.SENDGRID_GENERIC_TEMPLATE,
96117
{
97118
header_image: header_image_url,
98-
subject: event.emailConfig.acceptanceEmail.title || `Congratulations!`,
99-
subtitle: event.emailConfig.acceptanceEmail.subtitle || `You've been accepted to ${event.name}!`,
100-
body: replaceBodyTags(event.emailConfig.acceptanceEmail.body, event, user),
119+
subject:
120+
event.emailConfig.acceptanceEmail.title ||
121+
`Congratulations!`,
122+
subtitle:
123+
event.emailConfig.acceptanceEmail.subtitle ||
124+
`You've been accepted to ${event.name}!`,
125+
body: formatBody(
126+
event.emailConfig.acceptanceEmail.body,
127+
event,
128+
user,
129+
),
101130
cta_text: 'Event dashboard',
102131
cta_link: `${global.gConfig.FRONTEND_URL}/dashboard/event/${event.slug}`,
103132
},
104133
)
105134
return SendgridService.send(msg)
106135
},
107136
sendRejectionEmail: (event, user) => {
108-
var header_image_url = null
109-
if (typeof event.coverImage !== "undefined") {
137+
let header_image_url = null
138+
if (typeof event.coverImage !== 'undefined') {
110139
header_image_url = event.coverImage.url
111140
}
112141
const msg = SendgridService.buildTemplateMessage(
113142
user.email,
114143
global.gConfig.SENDGRID_GENERIC_TEMPLATE,
115144
{
116-
header_image_url: header_image_url,
117-
subject: event.emailConfig.rejectionEmail.title || `Oh-oh, bad news...`,
118-
subtitle: event.emailConfig.rejectionEmail.subtitle || `We couldn't give you a spot at ${event.name}.`,
119-
body: replaceBodyTags(event.emailConfig.rejectionEmail.body, event, user),
145+
header_image: header_image_url,
146+
subject:
147+
event.emailConfig.rejectionEmail.title ||
148+
`Oh-oh, bad news...`,
149+
subtitle:
150+
event.emailConfig.rejectionEmail.subtitle ||
151+
`We couldn't give you a spot at ${event.name}.`,
152+
body: formatBody(
153+
event.emailConfig.rejectionEmail.body,
154+
event,
155+
user,
156+
),
120157
},
121158
)
122159
return SendgridService.send(msg)
123160
},
124161
sendRegisteredEmail: (event, user) => {
125-
var header_image_url = null
126-
if (typeof event.coverImage !== "undefined") {
162+
let header_image_url = null
163+
if (typeof event.coverImage !== 'undefined') {
127164
header_image_url = event.coverImage.url
128165
}
129166
let msg
@@ -133,9 +170,17 @@ const SendgridService = {
133170
global.gConfig.SENDGRID_GENERIC_TEMPLATE,
134171
{
135172
header_image: header_image_url,
136-
subject: event.emailConfig.registrationEmail.title || `Thanks for registering to ${event.name}!`,
137-
subtitle: event.emailConfig.registrationEmail.subtitle || 'Awesome! Now just sit back and relax.',
138-
body: replaceBodyTags(event.emailConfig.registrationEmail.body, event, user),
173+
subject:
174+
event.emailConfig.registrationEmail.title ||
175+
`Thanks for registering to ${event.name}!`,
176+
subtitle:
177+
event.emailConfig.registrationEmail.subtitle ||
178+
'Awesome! Now just sit back and relax.',
179+
body: formatBody(
180+
event.emailConfig.registrationEmail.body,
181+
event,
182+
user,
183+
),
139184
cta_text: 'Event dashboard',
140185
cta_link: `${global.gConfig.FRONTEND_URL}/dashboard/event/${event.slug}`,
141186
},
@@ -146,8 +191,12 @@ const SendgridService = {
146191
global.gConfig.SENDGRID_GENERIC_TEMPLATE,
147192
{
148193
header_image: header_image_url,
149-
subject: event.emailConfig.registrationEmail.title || `Thanks for registering to ${event.name}!`,
150-
subtitle: event.emailConfig.registrationEmail.subtitle || `Thank you for registering to ${event.name}!`,
194+
subject:
195+
event.emailConfig.registrationEmail.title ||
196+
`Thanks for registering to ${event.name}!`,
197+
subtitle:
198+
event.emailConfig.registrationEmail.subtitle ||
199+
`Thank you for registering to ${event.name}!`,
151200
body: `You can modify your registration until the registration period ends <b>${moment(
152201
event.registrationEndTime,
153202
).format(
@@ -315,19 +364,23 @@ const SendgridService = {
315364
return SendgridService.sendGenericEmail(user.email, params)
316365
},
317366
sendGenericEmail: (to, params, from = {}, event, user) => {
367+
let header_image_url = null
368+
if (typeof event.coverImage !== 'undefined') {
369+
header_image_url = event.coverImage.url
370+
}
318371
const msg = SendgridService.buildTemplateMessage(
319372
to,
320373
global.gConfig.SENDGRID_GENERIC_TEMPLATE,
321374
{
322375
subject: params.subject,
323376
subtitle: params.subtitle,
324-
header_image: params.header_image,
325-
body: replaceBodyTags(params.body, event, user),
377+
header_image: header_image_url,
378+
body: formatBody(params.body, event, user),
326379
cta_text: params.cta_text,
327380
cta_link: params.cta_link,
328381
reply_to: params.reply_to,
329382
},
330-
from
383+
from,
331384
)
332385
console.log('sending', msg)
333386
return SendgridService.send(msg)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
const mongoose = require('mongoose')
2+
const Promise = require('bluebird')
3+
4+
module.exports = {
5+
index: 27,
6+
name: '27-add-experimental-flag-to-events',
7+
description:
8+
'Add new experimental flag to events, to allow events to use experimental features',
9+
run: async () => {
10+
const addExperimental = await mongoose.model('Event').updateMany(
11+
{ experimental: { $exists: false } },
12+
{
13+
$set: {
14+
experimental: false,
15+
},
16+
},
17+
)
18+
19+
console.log(
20+
'Done adding experimental flag to events',
21+
addExperimental.n,
22+
addExperimental.nModified,
23+
)
24+
25+
return Promise.resolve()
26+
},
27+
}

backend/migrations/27-migrate-projects-to-final.js

Lines changed: 0 additions & 97 deletions
This file was deleted.

backend/migrations/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ const migrations = [
3030
require('./24-sync-registration-to-profiles'),
3131
require('./25-add-emailConfig-to-event'),
3232
require('./26-fix-empty-senderEmail-in-event'),
33-
//require('./27-migrate-projects-to-final')
33+
require('./27-add-experimental-flag-to-events'),
3434
]
3535

3636
const run = async () => {

0 commit comments

Comments
 (0)