Skip to content

Commit 885c363

Browse files
authored
Merge pull request #286 from haystack/develop
Send notification to users when they are invited to a class
2 parents 9288936 + 00fa98c commit 885c363

4 files changed

Lines changed: 50 additions & 8 deletions

File tree

public/nb_viewer.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@
7777
<script type="text/javascript">
7878
const queryString = window.location.search;
7979
const urlParams = new URLSearchParams(queryString);
80-
const DEFAULT_URL = "uploads/" + urlParams.get('id')
80+
const DEFAULT_URL = `uploads/${urlParams.get('id')}.pdf`
8181
document.getElementById("download").setAttribute("href", DEFAULT_URL)
8282
run()
8383

routes/classes.js

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ const stripBomStream = require('strip-bom-stream');
1111
var randomstring = require("randomstring");
1212
var upload = multer({ dest: 'uploads/' });
1313
const { Op } = require("sequelize");
14+
const EmailUtil = require('../utils/emailUtil')
15+
const { v4: uuidv4 } = require('uuid');
1416

1517
const router = express.Router();
1618

@@ -361,6 +363,9 @@ router.post('/user/:id', (req, res) => {
361363
*/
362364

363365
router.post('/upload/:id', upload.single("file"), function (req, res) {
366+
var addedToClass = []
367+
var accountCreated = []
368+
364369
Class.findByPk(req.params.id, {
365370
include:
366371
[
@@ -384,22 +389,29 @@ router.post('/upload/:id', upload.single("file"), function (req, res) {
384389
let section = student_entry['Section']
385390
let email = student_entry['Email']
386391
if (email) {
392+
var reset_password_id = uuidv4();
393+
394+
387395
User.create({
388396
username: email,
389397
first_name: student_entry["First"],
390398
last_name: student_entry["Last"],
391399
email: email.toLowerCase(),
392400
password: randomstring.generate(),
401+
reset_password_id: reset_password_id,
393402
})
394-
.then((user) => {
395-
resolve() // resolve so that we can send a signal back to the frontend
403+
.then( (user) => {
396404
utils.addStudentToSection(nb_class, user, section)
405+
const link = req.headers.origin + "/reset?id=" + user.reset_password_id;
406+
accountCreated.push({user, link})
407+
resolve()
397408
}).catch((err) => {
398-
resolve()
399409
User.findOne({ where: { email: { [Op.iLike]: email } } })
400-
.then(function (user) {
410+
.then( function (user) {
401411
if (user) {
402412
utils.addStudentToSection(nb_class, user, section)
413+
addedToClass.push({ user})
414+
resolve()
403415
}
404416
})
405417
})
@@ -409,7 +421,17 @@ router.post('/upload/:id', upload.single("file"), function (req, res) {
409421
});
410422
})
411423
Promise.all(requests)
412-
.then(() => { res.status(200).json(null); })
424+
.then(async () => {
425+
for (const r of accountCreated) {
426+
await sendEmailAccountCreatedForClass(nb_class, r.user, r.link)
427+
}
428+
429+
for (const r of addedToClass) {
430+
await sendEmailAddedToClass(nb_class, r.user)
431+
}
432+
433+
res.status(200).json(null);
434+
})
413435
.catch((err) => {
414436
res.status(200).json(null);
415437
});
@@ -418,6 +440,26 @@ router.post('/upload/:id', upload.single("file"), function (req, res) {
418440
});
419441
});
420442

443+
async function sendEmailAddedToClass(nb_class, user) {
444+
const body = `Hi,<br><br>Your instructor added to ${nb_class.class_name}.<br><br><a href="https://nb.mit.edu">https://nb.mit.edu</a>`
445+
const email = new EmailUtil().to(user.email).subject(`[NB] You've been added to ${nb_class.class_name}`).userId(user.id).emailType('SYSTEM').html(body)
446+
try {
447+
await email.send()
448+
} catch (error) {
449+
console.error(error.message);
450+
}
451+
}
452+
453+
async function sendEmailAccountCreatedForClass(nb_class, user, resetLink) {
454+
const body = `Hi,<br><br>Welcome to NB, your instructor created your account for ${nb_class.class_name}. Please use the following link to set your password: <a href="${resetLink}">${resetLink}</a>`
455+
const email = new EmailUtil().to(user.email).subject(`[NB] Your account created by instructor for ${nb_class.class_name}`).userId(user.id).emailType('SYSTEM').html(body)
456+
try {
457+
await email.send()
458+
} catch (error) {
459+
console.error(error.message);
460+
}
461+
}
462+
421463
/**
422464
* Remove a student from a given class
423465
* @name DELETE/api/classes/student/:courseid/:userid

src/components/user/ResetPassword.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<template>
22
<div class="form">
3-
<h1 class="title">Rest Password</h1>
3+
<h1 class="title">Reset Password</h1>
44
<div class="profile-row">
55
<div class="group">
66
<label for="new-user-email"> Email: </label>

utils/emailUtil.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ class EmailUtil {
8080
throw Error('User id and email type are required!')
8181
}
8282

83-
if (await this.isUserSubscribed()) {
83+
if (this._emailType === 'SYSTEM' || await this.isUserSubscribed()) {
8484
const unsubscribeLink = EmailUtil.generateUnsubscribeLink(this._userId, this._emailType)
8585

8686
const options = {

0 commit comments

Comments
 (0)