feat: other email notifications for approved/available

also adds UI to configure email notifications to frontend
This commit is contained in:
sct
2020-11-24 14:36:31 +00:00
parent f8c01fbc83
commit 0d73d88f35
9 changed files with 390 additions and 10 deletions

View File

@@ -35,9 +35,10 @@ class EmailAgent implements NotificationAgent {
}
private getNewEmail() {
const settings = getSettings().notifications.agents.email;
return new Email({
message: {
from: 'no-reply@os.sct.dev',
from: settings.options.emailFrom,
},
send: true,
transport: this.getSmtpTransport(),
@@ -55,9 +56,6 @@ class EmailAgent implements NotificationAgent {
.filter((user) => user.hasPermission(Permission.MANAGE_REQUESTS))
.forEach((user) => {
const email = this.getNewEmail();
logger.debug('Sending email notification', {
label: 'Notifications',
});
email.send({
template: path.join(
@@ -74,6 +72,7 @@ class EmailAgent implements NotificationAgent {
timestamp: new Date().toTimeString(),
requestedBy: payload.notifyUser.username,
actionUrl: settings.applicationUrl,
requestType: 'New Request',
},
});
});
@@ -87,6 +86,72 @@ class EmailAgent implements NotificationAgent {
}
}
private async sendMediaApprovedEmail(payload: NotificationPayload) {
const settings = getSettings().main;
try {
const email = this.getNewEmail();
email.send({
template: path.join(
__dirname,
'../../../templates/email/media-request'
),
message: {
to: payload.notifyUser.email,
},
locals: {
body: 'Your request for the following media has been approved:',
mediaName: payload.subject,
imageUrl: payload.image,
timestamp: new Date().toTimeString(),
requestedBy: payload.notifyUser.username,
actionUrl: settings.applicationUrl,
requestType: 'Request Approved',
},
});
return true;
} catch (e) {
logger.error('Mail notification failed to send', {
label: 'Notifications',
message: e.message,
});
return false;
}
}
private async sendMediaAvailableEmail(payload: NotificationPayload) {
const settings = getSettings().main;
try {
const email = this.getNewEmail();
email.send({
template: path.join(
__dirname,
'../../../templates/email/media-request'
),
message: {
to: payload.notifyUser.email,
},
locals: {
body: 'Your requsested media is now available!',
mediaName: payload.subject,
imageUrl: payload.image,
timestamp: new Date().toTimeString(),
requestedBy: payload.notifyUser.username,
actionUrl: settings.applicationUrl,
requestType: 'Now Available',
},
});
return true;
} catch (e) {
logger.error('Mail notification failed to send', {
label: 'Notifications',
message: e.message,
});
return false;
}
}
public async send(
type: Notification,
payload: NotificationPayload
@@ -97,6 +162,12 @@ class EmailAgent implements NotificationAgent {
case Notification.MEDIA_PENDING:
this.sendMediaRequestEmail(payload);
break;
case Notification.MEDIA_APPROVED:
this.sendMediaApprovedEmail(payload);
break;
case Notification.MEDIA_AVAILABLE:
this.sendMediaAvailableEmail(payload);
break;
}
return true;