prodio
Version:
Simplified project management
174 lines (165 loc) • 3.7 kB
JavaScript
var semver = require('semver');
var validatePayload = function validatePayload(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!'
});
}
payload.version = payload.version || '0.0.1';
if(!semver.valid(payload.version)){
return callback({
root: 'error',
error: 'Invalid version specified "'+payload.version+'", must be a valid semver!'
});
}
payload.type = 'project';
callback(null, payload);
};
var listRecords = function listRecords(req, reply){
var self = this;
req.query.filter = req.query.filter || {};
req.query.filter.type='project';
if(req.query.q){
var re = new RegExp(req.query.q, 'i');
req.query.filter.$or = [
{
name: re
},
{
description: re
}
];
}
self.asArray(req.query, function(err, records){
if(err){
return reply({
root: 'error',
error: err
});
}
return reply(records);
});
};
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
});
}
if(!record[record.root]){
return reply({
root: 'error',
error: 'No record with id '+req.params.id+' found!'
});
}
return reply(record);
});
};
var createRecord = function createRecord(req, reply){
var self = this;
validatePayload(req.payload, function(err, payload){
if(err){
return reply(err);
}
self.insert(payload, function(err, record){
if(err){
return reply({
root: 'error',
error: err
});
}
return reply({
root: 'record',
record: record
});
});
});
};
var updateRecord = function updateRecord(req, reply){
var self = this;
validatePayload(req.payload, function(err, payload){
if(err){
return reply(err);
}
self.update(req.params.id, payload, function(err, record){
if(err){
return reply({
root: 'error',
error: err
});
}
return reply({
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 + 'projects',
handler: listRecords.bind(store)
},
{
method: 'GET',
path: config.route + 'project/{id}',
handler: getRecord.bind(store)
},
{
method: 'POST',
path: config.route + 'project',
handler: createRecord.bind(store)
},
{
method: 'PUT',
path: config.route + 'project',
handler: createRecord.bind(store)
},
{
method: 'POST',
path: config.route + 'project/{id}',
handler: updateRecord.bind(store)
},
{
method: 'PUT',
path: config.route + 'project/{id}',
handler: updateRecord.bind(store)
},
{
method: 'DELETE',
path: config.route + 'project/{id}',
handler: deleteRecord.bind(store)
},
]);
next();
};