@release-notes/hub
Version:
A hub for hosting release notes.
75 lines (59 loc) • 2.2 kB
JavaScript
const Service = require('kermit/Service');
class UpdateService extends Service {
calculateUpdates(releaseNotesModel, newReleaseNotes) {
let latestRelease = null;
if (releaseNotesModel.latestVersion) {
latestRelease = this.findReleaseByVersion(releaseNotesModel, releaseNotesModel.latestVersion);
}
if (!latestRelease) {
latestRelease = this.calculateLastRelease(releaseNotesModel);
}
return this.calculateNewReleases(latestRelease, newReleaseNotes);
}
applyUpdate(releaseNotesModel, newReleaseNotes) {
const latestRelease = this.calculateLastRelease(newReleaseNotes);
const releaseNotesUpdate = {
title: newReleaseNotes.title,
description: newReleaseNotes.description,
releases: newReleaseNotes.releases,
latestVersion: latestRelease.version || '',
latestReleaseDate: latestRelease.date || ''
};
return this.serviceManager.get('releaseNotesRepository').findByIdAndUpdate(
releaseNotesModel._id,
{ $set: releaseNotesUpdate}
);
}
static isUnreleased(release) {
return ['next', 'upcoming', 'unreleased'].indexOf((release.version || '').toLowerCase()) !== -1;
}
calculateNewReleases(lastRelease, releaseNotes) {
return (releaseNotes.releases || [])
.filter(release => (
!UpdateService.isUnreleased(release)
&& (!lastRelease || lastRelease.date < new Date(release.date))
)
);
}
calculateLastRelease(releaseNotes) {
let latestVersion = null;
let latestReleaseDate = null;
let latestRelease = null;
(releaseNotes.releases || []).forEach((release) => {
const version = release.version;
const releaseDate = release.date;
const isUnreleased = UpdateService.isUnreleased(release);
if (!isUnreleased && (!latestVersion || latestReleaseDate < releaseDate)) {
latestVersion = version;
latestReleaseDate = releaseDate;
latestRelease = release;
}
});
return latestRelease;
}
findReleaseByVersion(releaseNotes, version) {
return (releaseNotes.releases || []).find(release => release.version === version);
}
}
module.exports = UpdateService;
;