prodio
Version:
Simplified project management
286 lines (276 loc) • 6.66 kB
JavaScript
var validatePayload = function validatePayload(store, project_id, payload, callback){
if((!payload)||(typeof(payload)!=='object')){
return callback({
root: 'error',
error: 'Must supply a payload!'
});
}
if(!payload.name){
return callback({
root: 'error',
error: 'Must supply a name!'
});
}
if(!payload.type){
return callback({
root: 'error',
error: 'Must supply a type!'
});
}
payload.project_id = project_id;
payload.parent_id = payload.parent_id || payload.project_id;
store.get(project_id, function(err, project){
if(err){
return callback({
root: 'error',
error: err
});
}
if(!project[project.root]){
return callback({
root: 'error',
error: 'Could not locate a project with id of '+project_id+'!'
});
}
if(project[project.root].type!=='project'){
return callback({
root: 'error',
error: 'Could not locate a project with id of '+project_id+'!'
});
}
callback(null, {project: project[project.root], payload: payload});
});
};
var listRecords = function listRecords(req, reply){
var self = this;
var options = req.query||{};
options.filter = options.filter || {};
options.filter.project_id = req.params.project_id;
if(req.query.q){
var re = new RegExp(req.query.q, 'i');
options.filter.$or = [
{
name: re
},
{
description: re
},
{
version: re
}
];
}
self.asArray(options, function(err, records){
if(err){
return reply({
root: 'error',
error: err
});
}
return reply(records);
});
};
var getTree = function listRecords(req, reply){
var self = this;
var options = req.query||{};
options.filter = options.filter || {};
options.filter.project_id = req.params.project_id;
self.get(req.params.project_id, function(err, record){
if(err){
return reply({
root: 'error',
error: err
});
}
self.asArray(options, function(err, records){
if(err){
return reply({
root: 'error',
error: err
});
}
var tree = {
root: record[record.root],
nodes: records[records.root],
edges: [],
criteria: {
length: records.length,
offset: records.offset,
count: records.count,
limit: records.limit
}
};
tree.nodes.forEach(function(node){
tree.edges.push({from: node.parent_id, to: node._id});
});
return reply({
root: 'tree',
tree: tree
});
});
});
};
var getBranch = function(req, reply){
var self = this;
var options = req.query||{};
options.filter = options.filter || {};
options.filter.project_id = req.params.project_id;
options.filter.parent_id = req.params.id;
self.get(req.params.id, function(err, record){
if(err){
return reply({
root: 'error',
error: err
});
}
self.asArray(options, function(err, records){
if(err){
return reply({
root: 'error',
error: err
});
}
var tree = {
root: record[record.root],
nodes: records[records.root],
edges: [],
criteria: {
length: records.length,
offset: records.offset,
count: records.count,
limit: records.limit
}
};
tree.nodes.forEach(function(node){
tree.edges.push({from: node.parent_id, to: node._id});
});
return reply({
root: 'tree',
tree: tree
});
});
});
};
var getRecord = function getRecord(req, reply){
var self = this;
self.get(req.params.id, function(err, record){
if(err){
return reply({
root: 'error',
error: err
});
}
return reply(record.root?record:{
root: 'record',
record: record
});
});
};
var createRecord = function createRecord(req, reply){
var self = this;
validatePayload(self, req.params.project_id, req.payload, function(err, details){
if(err){
return reply(err);
}
self.insert(details.payload, function(err, record){
if(err){
return reply({
root: 'error',
error: err
});
}
return reply(record.root?record:{
root: 'record',
record: record
});
});
});
};
var updateRecord = function updateRecord(req, reply){
var self = this;
validatePayload(self, req.params.project_id, req.payload, function(err, details){
if(err){
return reply(err);
}
self.update(req.params.id, details.payload, function(err, record){
if(err){
return reply({
root: 'error',
error: err
});
}
return reply(record.root?record:{
root: 'record',
record: record
});
});
});
};
var deleteRecord = function deleteRecord(req, reply){
var self = this;
self.delete(req.params.id, function(err, deleted){
if(err){
return reply({
root: 'error',
error: err
});
}
return reply({
root: 'deleted',
deleted: deleted
});
});
};
module.exports = function(options, next){
var config = options.config;
var server = options.hapi;
var store = options.stores(config.collectionName||'items');
server.route([
{
method: 'GET',
path: config.route + 'project/{project_id}/items',
handler: listRecords.bind(store)
},
{
method: 'GET',
path: config.route + 'project/{project_id}/item/{id}',
handler: getRecord.bind(store)
},
{
method: 'POST',
path: config.route + 'project/{project_id}/item',
handler: createRecord.bind(store)
},
{
method: 'PUT',
path: config.route + 'project/{project_id}/item',
handler: createRecord.bind(store)
},
{
method: 'POST',
path: config.route + 'project/{project_id}/item/{id}',
handler: updateRecord.bind(store)
},
{
method: 'PUT',
path: config.route + 'project/{project_id}/item/{id}',
handler: updateRecord.bind(store)
},
{
method: 'DELETE',
path: config.route + 'project/{project_id}/item/{id}',
handler: deleteRecord.bind(store)
},
{
method: 'GET',
path: config.route + 'project/{project_id}/tree',
handler: getTree.bind(store)
},
{
method: 'GET',
path: config.route + 'project/{project_id}/branch/{id}',
handler: getBranch.bind(store)
}
]);
next();
};