46 lines
1.4 KiB
JavaScript
46 lines
1.4 KiB
JavaScript
'use strict';
|
|
|
|
const path = require('path');
|
|
const fs = require('fs');
|
|
|
|
const RELEASES_DIR = path.join(__dirname, '../public/releases');
|
|
const MANIFEST_FILE = path.join(RELEASES_DIR, 'releases-manifest.json');
|
|
|
|
function semverCompare(a, b) {
|
|
const aParts = (a || '0').split('.').map(Number);
|
|
const bParts = (b || '0').split('.').map(Number);
|
|
for (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {
|
|
const diff = (bParts[i] || 0) - (aParts[i] || 0); // descending: highest first
|
|
if (diff !== 0) return diff;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
module.exports = function (app) {
|
|
const router = require('express').Router();
|
|
|
|
/**
|
|
* GET /api/releases
|
|
* Returns the sorted list of release entries (no markdown content).
|
|
* Sorted by `ver` descending — highest version first (latest).
|
|
*/
|
|
router.get('/', (req, res) => {
|
|
fs.readFile(MANIFEST_FILE, 'utf8', (err, data) => {
|
|
if (err) {
|
|
return res.status(500).json({ error: 'Could not read releases manifest.' });
|
|
}
|
|
let manifest;
|
|
try {
|
|
manifest = JSON.parse(data);
|
|
} catch (parseErr) {
|
|
return res.status(500).json({ error: 'Releases manifest is malformed.' });
|
|
}
|
|
const revisions = (manifest && Array.isArray(manifest.revisions)) ? manifest.revisions : [];
|
|
const sorted = [...revisions].sort((a, b) => semverCompare(a.ver, b.ver));
|
|
res.json(sorted);
|
|
});
|
|
});
|
|
|
|
app.use('/api/releases', router);
|
|
};
|