add remove project via api

This commit is contained in:
oleg 2015-12-02 23:24:45 +03:00
parent 6697bdd139
commit e2f8ac3070
2 changed files with 97 additions and 11 deletions

View File

@ -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();

View File

@ -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
);
};