From e2f8ac307090c8aecf4170219c9ba2746b163417 Mon Sep 17 00:00:00 2001 From: oleg Date: Wed, 2 Dec 2015 23:24:45 +0300 Subject: [PATCH] add remove project via api --- httpApi.js | 76 +++++++++++++++++++++++++++++++++++++++++++------- lib/project.js | 32 ++++++++++++++++++++- 2 files changed, 97 insertions(+), 11 deletions(-) diff --git a/httpApi.js b/httpApi.js index a777933..191217d 100644 --- a/httpApi.js +++ b/httpApi.js @@ -2,7 +2,9 @@ var Steppy = require('twostep').Steppy, _ = require('underscore'), - logger = require('./lib/logger')('http api'); + querystring = require('querystring'), + logger = require('./lib/logger')('http api'), + project = require('./lib/project'); /* * Pure rest api on pure nodejs follows below @@ -11,12 +13,43 @@ var Steppy = require('twostep').Steppy, var router = {}; router.routes = {}; -_(['get', 'post', 'patch', 'del']).each(function(method) { - router[method] = function(url, handler) { - router.routes[method + ' ' + url] = handler; +_(['get', 'post', 'patch', 'delete']).each(function(method) { + router[method] = function(path, handler) { + this.routes[method] = this.routes[method] || []; + var keys = [], + regExpStr = path.replace(/:(\w+)/g, function(match, name) { + keys.push(name); + return '(.+)'; + }); + + this.routes[method].push({ + regExp: new RegExp('^' + regExpStr + '$'), + handler: handler, + keys: keys + }); }; }); +router.del = router['delete']; + +router.getRoute = function(req) { + var parts, + route = _(this.routes[req.method.toLowerCase()]).find(function(route) { + parts = route.regExp.exec(req.path); + return parts; + }); + + + if (route && route.keys.length) { + route.params = {}; + _(route.keys).each(function(key, index) { + route.params[key] = parts[index + 1]; + }); + } + + return route; +}; + module.exports = function(app) { // run building of a project @@ -44,19 +77,43 @@ module.exports = function(app) { ); }); + // TODO: restrict access with some sort of token + router.del('/api/projects/:name', function(req, res, next) { + var projectName = req.params.name; + Steppy( + function() { + logger.log('Cleaning up project "%s"', projectName); + project.remove({ + baseDir: app.config.paths.projects, + name: projectName + }, this.slot()); + }, + function() { + logger.log('Project "%s" cleaned up', projectName); + res.statusCode = 204; + res.end(); + }, + next + ); + }); + return function(req, res) { Steppy( function() { var stepCallback = this.slot(); + var urlParts = req.url.split('?'); + req.path = urlParts[0]; + req.query = querystring.parse(urlParts[1]); + req.setEncoding('utf-8'); var bodyString = ''; req.on('data', function(data) { bodyString += data; }); req.on('end', function() { - var body = JSON.parse(bodyString); + var body = bodyString ? JSON.parse(bodyString) : null; stepCallback(null, body); }); req.on('error', stepCallback); @@ -64,11 +121,10 @@ module.exports = function(app) { function(err, body) { req.body = body; - var key = req.method.toLowerCase() + ' ' + req.url, - handler = router.routes[key]; - - if (handler) { - handler(req, res, this.slot()); + var route = router.getRoute(req); + if (route) { + req.params = route.params; + route.handler(req, res, this.slot()); } else { res.statusCode = 404; res.end(); diff --git a/lib/project.js b/lib/project.js index c478450..e3f9ec3 100644 --- a/lib/project.js +++ b/lib/project.js @@ -6,7 +6,8 @@ var Steppy = require('twostep').Steppy, _ = require('underscore'), reader = require('./reader'), db = require('../db'), - utils = require('./utils'); + utils = require('./utils'), + SpawnCommand = require('./command/spawn').Command; /** @@ -138,3 +139,32 @@ exports.getAvgProjectBuildDuration = function(projectName, callback) { callback ); }; + +exports.remove = function(params, callback) { + Steppy( + function() { + db.builds.find({ + start: {projectName: params.name, descCreateDate: ''} + }, this.slot()); + + new SpawnCommand().run({cmd: 'rm', args: [ + '-Rf', path.join(params.baseDir, params.name) + ]}, this.slot()); + }, + function(err, builds) { + if (builds.length) { + db.builds.del(builds, this.slot()); + + var logLinesRemoveGroup = this.makeGroup(); + _(builds).each(function(build) { + db.logLines.remove({ + start: {buildId: build.id} + }, logLinesRemoveGroup.slot()); + }); + } else { + this.pass(null, null); + } + }, + callback + ); +};