piston/api/src/ppman/routes.js

69 lines
2.1 KiB
JavaScript
Raw Normal View History

2021-02-20 23:39:03 +01:00
const logger = require('logplease').create('ppman/routes');
const semver = require('semver');
2021-03-06 07:17:56 +01:00
const fetch = require('node-fetch');
const config = require('../config');
const { Package } = require('./package');
2021-02-20 15:13:56 +01:00
2021-03-06 07:17:56 +01:00
async function get_package_list(){
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});
})
2021-02-20 15:13:56 +01:00
}
2021-03-06 07:17:56 +01:00
async function get_package(lang, version){
const packages = await get_package_list();
const candidates = packages.filter(
2021-02-20 15:13:56 +01:00
pkg => pkg.language == lang && semver.satisfies(pkg.version, version)
2021-02-20 23:39:03 +01:00
);
return candidates.sort((a,b)=>semver.rcompare(a.version,b.version))[0] || null;
2021-02-20 15:13:56 +01:00
}
module.exports = {
2021-03-06 07:17:56 +01:00
async package_list(req, res){
// GET /packages
logger.debug('Request to list packages');
2021-02-20 15:13:56 +01:00
2021-03-06 07:17:56 +01:00
const packages = await get_package_list();
2021-02-20 15:13:56 +01:00
res.json_success({
2021-03-06 07:17:56 +01:00
packages: packages.map(pkg=>({
2021-02-20 15:13:56 +01:00
language: pkg.language,
language_version: pkg.version.raw,
installed: pkg.installed
}))
2021-02-20 23:39:03 +01:00
});
2021-02-20 15:13:56 +01:00
},
async package_install(req,res){
2021-03-06 07:17:56 +01:00
// POST /packages/:language/:version
2021-02-20 15:13:56 +01:00
2021-03-06 07:17:56 +01:00
logger.debug('Request to install package');
2021-02-20 15:13:56 +01:00
2021-03-06 07:17:56 +01:00
const pkg = await get_package(req.params.language, req.params.version);
2021-02-20 23:39:03 +01:00
if(pkg == null) return res.json_error(`Requested package ${req.params.language}-${req.params.version} does not exist`, 404);
2021-02-20 15:13:56 +01:00
try{
2021-02-20 23:39:03 +01:00
const response = await pkg.install();
return res.json_success(response);
2021-02-20 15:13:56 +01:00
}catch(err){
2021-02-20 23:39:03 +01:00
logger.error(`Error while installing package ${pkg.language}-${pkg.version}:`, err.message);
res.json_error(err.message,500);
2021-02-20 15:13:56 +01:00
}
},
async package_uninstall(req,res){
2021-03-06 07:17:56 +01:00
// DELETE /packages/:language/:version
2021-02-20 15:13:56 +01:00
2021-02-27 00:58:30 +01:00
//res.json(req.body); //TODO
2021-02-27 01:08:51 +01:00
res.json_error('not implemented', 500);
2021-02-20 15:13:56 +01:00
}
2021-02-20 23:39:03 +01:00
};