mirror of
https://github.com/engineer-man/piston.git
synced 2025-05-02 09:56:27 +02:00
123 lines
3.3 KiB
JavaScript
123 lines
3.3 KiB
JavaScript
const logger = require('logplease').create('ppman/routes');
|
|
const semver = require('semver');
|
|
const fetch = require('node-fetch');
|
|
const config = require('../config');
|
|
const { Package } = require('./package');
|
|
|
|
const get_package_list = async () => {
|
|
const repo_content = await fetch(config.repo_url).then(x => x.text());
|
|
|
|
const entries = repo_content
|
|
.split('\n')
|
|
.filter(x => x.length > 0);
|
|
|
|
return entries.map(line => {
|
|
const [ language, version, checksum, download ] = line.split(',', 4);
|
|
|
|
return new Package({
|
|
language,
|
|
version,
|
|
checksum,
|
|
download
|
|
});
|
|
});
|
|
};
|
|
|
|
const get_package = async (lang, version) => {
|
|
const packages = await get_package_list();
|
|
|
|
const candidates = packages
|
|
.filter(pkg => {
|
|
return pkg.language == lang && semver.satisfies(pkg.version, version)
|
|
});
|
|
|
|
candidates.sort((a, b) => semver.rcompare(a.version, b.version));
|
|
|
|
return candidates[0] || null;
|
|
};
|
|
|
|
module.exports = {
|
|
|
|
// GET /packages
|
|
async package_list(req, res) {
|
|
logger.debug('Request to list packages');
|
|
|
|
let packages = await get_package_list();
|
|
|
|
packages = packages
|
|
.map(pkg => {
|
|
return {
|
|
language: pkg.language,
|
|
language_version: pkg.version.raw,
|
|
installed: pkg.installed
|
|
};
|
|
});
|
|
|
|
return res
|
|
.status(200)
|
|
.send(packages);
|
|
},
|
|
|
|
// POST /packages/:language/:version
|
|
async package_install(req, res) {
|
|
logger.debug('Request to install package');
|
|
|
|
const pkg = await get_package(req.params.language, req.params.version);
|
|
|
|
if (pkg == null) {
|
|
return res
|
|
.status(404)
|
|
.send({
|
|
message: `Requested package ${req.params.language}-${req.params.version} does not exist`
|
|
});
|
|
}
|
|
|
|
try {
|
|
const response = await pkg.install();
|
|
|
|
return res
|
|
.status(200)
|
|
.send(response);
|
|
} catch(e) {
|
|
logger.error(`Error while installing package ${pkg.language}-${pkg.version}:`, e.message);
|
|
|
|
return res
|
|
.status(500)
|
|
.send({
|
|
message: e.message
|
|
});
|
|
}
|
|
},
|
|
|
|
// DELETE /packages/:language/:version
|
|
async package_uninstall(req, res) {
|
|
logger.debug('Request to uninstall package');
|
|
|
|
const pkg = await get_package(req.params.language, req.params.version);
|
|
|
|
if (pkg == null) {
|
|
return res
|
|
.status(404)
|
|
.send({
|
|
message: `Requested package ${req.params.language}-${req.params.version} does not exist`
|
|
});
|
|
}
|
|
|
|
try {
|
|
const response = await pkg.uninstall();
|
|
|
|
return res
|
|
.status(200)
|
|
.send(response);
|
|
} catch(e) {
|
|
logger.error(`Error while uninstalling package ${pkg.language}-${pkg.version}:`, e.message);
|
|
|
|
return res
|
|
.status(500)
|
|
.send({
|
|
message: e.message
|
|
});
|
|
}
|
|
}
|
|
|
|
};
|