diff --git a/api/src/executor/routes.js b/api/src/executor/routes.js index a69aeeb..07f7ace 100644 --- a/api/src/executor/routes.js +++ b/api/src/executor/routes.js @@ -3,35 +3,19 @@ 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); diff --git a/api/src/index.js b/api/src/index.js index 98d9a1d..7b295b3 100644 --- a/api/src/index.js +++ b/api/src/index.js @@ -11,7 +11,6 @@ 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(); @@ -59,6 +58,11 @@ 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) { @@ -70,33 +74,23 @@ 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', 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 + 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 const executor_routes = require('./executor/routes'); - app.post ('/jobs', executor_routes.run_job_validators, validate, executor_routes.run_job); + app.post ('/jobs', executor_routes.run_job); + + + logger.debug('Calling app.listen'); const [address,port] = config.bind_address.split(':'); diff --git a/api/src/ppman/routes.js b/api/src/ppman/routes.js index 86a45e7..c376172 100644 --- a/api/src/ppman/routes.js +++ b/api/src/ppman/routes.js @@ -3,7 +3,6 @@ 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); @@ -40,46 +39,31 @@ 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, @@ -87,14 +71,6 @@ 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'); @@ -110,20 +86,13 @@ 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); @@ -144,6 +113,8 @@ 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); @@ -160,7 +131,6 @@ module.exports = { async package_uninstall(req,res){ // DELETE /repos/:slug/packages/:language/:version - //res.json(req.body); //TODO - res.json_error('not implemented', 500); + res.json(req.body); //TODO } }; \ No newline at end of file