Compare commits
2 Commits
9d32012bbc
...
764641b5a6
Author | SHA1 | Date |
---|---|---|
Thomas Hobson | 764641b5a6 | |
Thomas Hobson | 8b61f4f69f |
|
@ -3,19 +3,35 @@
|
|||
|
||||
const { get_latest_runtime_matching_language_version } = require('../runtime');
|
||||
const { Job } = require('./job');
|
||||
const { body } = require('express-validator');
|
||||
|
||||
module.exports = {
|
||||
run_job_validators: [
|
||||
body('language')
|
||||
.isString(), // eslint-disable-line snakecasejs/snakecasejs
|
||||
body('version')
|
||||
.isSemVer(), // eslint-disable-line snakecasejs/snakecasejs
|
||||
body('files')
|
||||
.isArray(), // eslint-disable-line snakecasejs/snakecasejs
|
||||
body('files.*.name')
|
||||
.isString() // eslint-disable-line snakecasejs/snakecasejs
|
||||
.bail()
|
||||
.not()
|
||||
.contains('/'),
|
||||
body('files.*.content')
|
||||
.isString(), // eslint-disable-line snakecasejs/snakecasejs
|
||||
body('*_timeout')
|
||||
.isNumeric(), // eslint-disable-line snakecasejs/snakecasejs
|
||||
body('stdin')
|
||||
.isString(), // eslint-disable-line snakecasejs/snakecasejs
|
||||
body('args')
|
||||
.isArray(),
|
||||
body('args.*')
|
||||
.isString() // eslint-disable-line snakecasejs/snakecasejs
|
||||
],
|
||||
async run_job(req, res){
|
||||
// POST /jobs
|
||||
var errored = false;
|
||||
['language', 'version',
|
||||
'files', 'main',
|
||||
'args', 'stdin',
|
||||
'compile_timeout', 'run_timeout',
|
||||
].forEach(key => {
|
||||
if(req.body[key] == undefined) errored = errored || res.json_error(`${key} is required`, 400);
|
||||
});
|
||||
if(errored) return errored;
|
||||
|
||||
|
||||
const runtime = get_latest_runtime_matching_language_version(req.body.language, req.body.version);
|
||||
if(runtime == undefined) return res.json_error(`${req.body.language}-${req.body.version} runtime is unknown`, 400);
|
||||
|
|
|
@ -11,6 +11,7 @@ const fs = require('fs/promises');
|
|||
const fss = require('fs');
|
||||
const body_parser = require('body-parser');
|
||||
const runtime = require('./runtime');
|
||||
const {validationResult} = require('express-validator'); //eslint-disable-line snakecasejs/snakecasejs
|
||||
|
||||
const logger = Logger.create('index');
|
||||
const app = express();
|
||||
|
@ -58,11 +59,6 @@ const app = express();
|
|||
|
||||
logger.debug('Constructing Express App');
|
||||
|
||||
logger.debug('Registering middleware');
|
||||
|
||||
app.use(body_parser.urlencoded({extended: true}));
|
||||
app.use(body_parser.json());
|
||||
|
||||
logger.debug('Registering custom message wrappers');
|
||||
|
||||
express.response.json_error = function(message, code) {
|
||||
|
@ -74,23 +70,33 @@ const app = express();
|
|||
return this.json({success: true, data: obj});
|
||||
};
|
||||
|
||||
logger.debug('Registering middleware');
|
||||
|
||||
app.use(body_parser.urlencoded({extended: true}));
|
||||
app.use(body_parser.json());
|
||||
|
||||
|
||||
function validate(req, res, next) {
|
||||
const errors = validationResult(req); //eslint-disable-line snakecasejs/snakecasejs
|
||||
if (!errors.isEmpty()) //eslint-disable-line snakecasejs/snakecasejs
|
||||
return res.json_error(errors.array(), 422);
|
||||
next();
|
||||
}
|
||||
|
||||
logger.debug('Registering Routes');
|
||||
|
||||
const ppman_routes = require('./ppman/routes');
|
||||
|
||||
app.get ('/repos', ppman_routes.repo_list);
|
||||
app.post ('/repos', ppman_routes.repo_add);
|
||||
app.get ('/repos/:repo_slug', ppman_routes.repo_info);
|
||||
app.get ('/repos/:repo_slug/packages', ppman_routes.repo_packages);
|
||||
app.get ('/repos/:repo_slug/packages/:language/:version', ppman_routes.package_info);
|
||||
app.post ('/repos/:repo_slug/packages/:language/:version', ppman_routes.package_install);
|
||||
app.delete('/repos/:repo_slug/packages/:language/:version', ppman_routes.package_uninstall); //TODO
|
||||
app.get ('/repos', validate, ppman_routes.repo_list);
|
||||
app.post ('/repos', ppman_routes.repo_add_validators, validate, ppman_routes.repo_add);
|
||||
app.get ('/repos/:repo_slug', ppman_routes.repo_info_validators, validate, ppman_routes.repo_info);
|
||||
app.get ('/repos/:repo_slug/packages', ppman_routes.repo_packages_validators, validate, ppman_routes.repo_packages);
|
||||
app.get ('/repos/:repo_slug/packages/:language/:version', ppman_routes.package_info_validators, validate, ppman_routes.package_info);
|
||||
app.post ('/repos/:repo_slug/packages/:language/:version', ppman_routes.package_info_validators, validate, ppman_routes.package_install);
|
||||
app.delete('/repos/:repo_slug/packages/:language/:version', ppman_routes.package_info_validators, validate, ppman_routes.package_uninstall); //TODO
|
||||
|
||||
const executor_routes = require('./executor/routes');
|
||||
app.post ('/jobs', executor_routes.run_job);
|
||||
|
||||
|
||||
|
||||
app.post ('/jobs', executor_routes.run_job_validators, validate, executor_routes.run_job);
|
||||
|
||||
logger.debug('Calling app.listen');
|
||||
const [address,port] = config.bind_address.split(':');
|
||||
|
|
|
@ -3,6 +3,7 @@ const state = require('../state');
|
|||
const logger = require('logplease').create('ppman/routes');
|
||||
const {Repository} = require('./repo');
|
||||
const semver = require('semver');
|
||||
const { body, param } = require('express-validator');
|
||||
|
||||
async function get_or_construct_repo(slug){
|
||||
if(repos.has(slug))return repos.get(slug);
|
||||
|
@ -39,31 +40,46 @@ module.exports = {
|
|||
}))
|
||||
});
|
||||
},
|
||||
repo_add_validators: [
|
||||
body('slug')
|
||||
.notEmpty() // eslint-disable-line snakecasejs/snakecasejs
|
||||
.bail()
|
||||
.isSlug() // eslint-disable-line snakecasejs/snakecasejs
|
||||
.bail()
|
||||
.not()
|
||||
.custom(value=>state.state.get('repositories').keys().includes(value))
|
||||
.withMessage('slug is already in use'), // eslint-disable-line snakecasejs/snakecasejs
|
||||
body('url')
|
||||
.notEmpty() // eslint-disable-line snakecasejs/snakecasejs
|
||||
.bail()
|
||||
.isURL({require_protocol: true}) // eslint-disable-line snakecasejs/snakecasejs
|
||||
|
||||
],
|
||||
async repo_add(req, res){
|
||||
// POST /repos
|
||||
|
||||
logger.debug(`Request for repoAdd slug=${req.body.slug} url=${req.body.url}`);
|
||||
if(!req.body.slug)
|
||||
return res.json_error('slug is missing from request body', 400);
|
||||
if(!req.body.url)
|
||||
return res.json_error('url is missing from request body', 400);
|
||||
|
||||
const repo_state = state.state.get('repositories');
|
||||
|
||||
if(repo_state.has(req.body.slug)) return res.json_error(`repository ${req.body.slug} already exists`, 409);
|
||||
|
||||
repo_state.set(req.body.slug, req.body.url);
|
||||
logger.info(`Repository ${req.body.slug} added url=${req.body.url}`);
|
||||
|
||||
return res.json_success(req.body.slug);
|
||||
},
|
||||
repo_info_validators: [
|
||||
param('repo_slug')
|
||||
.isSlug() // eslint-disable-line snakecasejs/snakecasejs
|
||||
.bail()
|
||||
.custom(value=>state.state.get('repositories').has(value))
|
||||
.withMessage('repository does not exist') // eslint-disable-line snakecasejs/snakecasejs
|
||||
.bail()
|
||||
],
|
||||
async repo_info(req, res){
|
||||
// GET /repos/:slug
|
||||
|
||||
logger.debug(`Request for repoInfo for ${req.params.repo_slug}`);
|
||||
const repo = await get_or_construct_repo(req.params.repo_slug);
|
||||
|
||||
if(repo == null) return res.json_error(`Requested repo ${req.params.repo_slug} does not exist`, 404);
|
||||
|
||||
res.json_success({
|
||||
slug: repo.slug,
|
||||
|
@ -71,6 +87,14 @@ module.exports = {
|
|||
packages: repo.packages.length
|
||||
});
|
||||
},
|
||||
repo_packages_validators: [
|
||||
param('repo_slug')
|
||||
.isSlug() // eslint-disable-line snakecasejs/snakecasejs
|
||||
.bail()
|
||||
.custom(value=>state.state.get('repositories').has(value))
|
||||
.withMessage('repository does not exist') // eslint-disable-line snakecasejs/snakecasejs
|
||||
.bail()
|
||||
],
|
||||
async repo_packages(req, res){
|
||||
// GET /repos/:slug/packages
|
||||
logger.debug('Request to repoPackages');
|
||||
|
@ -86,13 +110,20 @@ module.exports = {
|
|||
}))
|
||||
});
|
||||
},
|
||||
package_info_validators: [
|
||||
param('repo_slug')
|
||||
.isSlug() // eslint-disable-line snakecasejs/snakecasejs
|
||||
.bail()
|
||||
.custom(value=>state.state.get('repositories').has(value))
|
||||
.withMessage('repository does not exist') // eslint-disable-line snakecasejs/snakecasejs
|
||||
.bail()
|
||||
],
|
||||
async package_info(req, res){
|
||||
// GET /repos/:slug/packages/:language/:version
|
||||
|
||||
logger.debug('Request to packageInfo');
|
||||
|
||||
const repo = await get_or_construct_repo(req.params.repo_slug);
|
||||
if(repo == null) return res.json_error(`Requested repo ${req.params.repo_slug} does not exist`, 404);
|
||||
|
||||
const pkg = await get_package(repo, req.params.language, req.params.version);
|
||||
if(pkg == null) return res.json_error(`Requested package ${req.params.language}-${req.params.version} does not exist`, 404);
|
||||
|
@ -113,8 +144,6 @@ module.exports = {
|
|||
logger.debug('Request to packageInstall');
|
||||
|
||||
const repo = await get_or_construct_repo(req.params.repo_slug);
|
||||
if(repo == null) return res.json_error(`Requested repo ${req.params.repo_slug} does not exist`, 404);
|
||||
|
||||
const pkg = await get_package(repo, req.params.language, req.params.version);
|
||||
if(pkg == null) return res.json_error(`Requested package ${req.params.language}-${req.params.version} does not exist`, 404);
|
||||
|
||||
|
@ -131,6 +160,7 @@ module.exports = {
|
|||
async package_uninstall(req,res){
|
||||
// DELETE /repos/:slug/packages/:language/:version
|
||||
|
||||
res.json(req.body); //TODO
|
||||
//res.json(req.body); //TODO
|
||||
res.json_error('not implemented', 500);
|
||||
}
|
||||
};
|
Loading…
Reference in New Issue