agmission/server/routes/releases.js

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);
};