@release-notes/hub
Version:
A hub for hosting release notes.
102 lines (82 loc) • 2.98 kB
JavaScript
const Service = require('kermit/Service');
class NotificationService extends Service {
bootstrap() {
const sm = this.serviceManager;
this.subscriptionRepository = sm.get('subscriptionRepository');
this.releaseNotesUpdateService = sm.get('releaseNotesUpdateService');
this.emailService = sm.get('emailService');
this.sparky = sm.get('sparkPost');
this.logger = sm.get('logging');
return this;
}
async sendReleaseNotesUpdateNotification(releaseNotes, releaseNotesUpdate) {
const subscriptions = await this.loadReleaseNotesSubscriptions(
releaseNotes._id
);
if (!subscriptions || !subscriptions.length) {
this.logger.info(`No subscriptions, no update notifications sent for @${releaseNotes.scope}/${releaseNotes.name}`);
return;
}
const emailRecipients = subscriptions.map(subscription => subscription.email);
const newReleases = this.releaseNotesUpdateService.calculateUpdates(
releaseNotes, releaseNotesUpdate
);
if (!newReleases || !newReleases.length) {
this.logger.info(`No new releases, no update notifications sent for @${releaseNotes.scope}/${releaseNotes.name}`);
return;
}
try {
const content = await this.emailService.compose(
'release-notes-update', {
releaseNotes,
releases: newReleases,
}
);
return this.sendEmailNotification(
{ recipients: emailRecipients, content, releaseNotes }
);
} catch (emailComposeErr) {
this.logger.error(
`Update notification composition error for @${releaseNotes.scope}/${releaseNotes.name}`,
emailComposeErr
);
throw emailComposeErr;
}
}
async sendEmailNotification({ recipients, releaseNotes, content }) {
try {
const emailTransmissionResponse = await this.sparky.sendMessage({
recipients,
content: {
subject: `New version of @${releaseNotes.scope}/${releaseNotes.name} released`,
from: 'Release Notes <notifications@release-notes.com>',
text: content.text,
html: content.html,
},
});
this.logger.info(
`Update notification transmitted to ${recipients.length} subscribers for @${releaseNotes.scope}/${releaseNotes.name}`,
emailTransmissionResponse
);
} catch (emailTransmissionErr) {
this.logger.error(
`Update notification transmission error for @${releaseNotes.scope}/${releaseNotes.name}`,
emailTransmissionErr
);
throw emailTransmissionErr;
}
}
async loadReleaseNotesSubscriptions(id) {
try {
return await this.subscriptionRepository.findByReleaseNotesId(id);
} catch (subscriptionLookupErr) {
this.logger.error(
`Error loading subscriptions of release notes #${id}:`,
subscriptionLookupErr.message
);
throw subscriptionLookupErr;
}
}
}
module.exports = NotificationService;
;