diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6f0efa8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +node_modules +*.log +.idea diff --git a/README.md b/README.md index eee9d7d..5249934 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ # RAML Store - - ## Overview raml-store provides a simple storage API plus a persistence plugin which enables you to run the [RAML API Designer](https://github.com/mulesoft/api-designer) locally (rather than use the APIHub cloud service) and still be able to manage and collaborate on your design. @@ -19,25 +17,14 @@ To start mongodb as background process: `cd /usr/local/mongodb` (mongodb installation directory) - `mongod --fork --logpath /var/log/mongodb.log` - -### Installing MongoDB Node.js Driver -From the top-level directory (e.g. raml-store): - -`npm install mongodb` - -### Installing Express +### Installing Express and MongoDB Node.js Driver From the top-level directory (e.g. raml-store): `npm install ` - - - - - + ## Running the Service From the top-level directory (e.g. raml-store): diff --git a/lib/files.js b/lib/files.js new file mode 100644 index 0000000..55d72d9 --- /dev/null +++ b/lib/files.js @@ -0,0 +1,127 @@ +var mongo = require('mongodb'); + +var Server = mongo.Server, + Db = mongo.Db, + BSON = mongo.BSONPure; + +var server = new Server('localhost', 27017, {auto_reconnect: true}); +db = new Db('ramldb', server); + +db.open(function (err, db) { + if (!err) { + console.log("Connected to 'ramldb' database"); + db.collection('files', {strict: true}, function (err, collection) { + if (err) { + console.log("The 'files' collection doesn't exist. Use POST to add RAML files..."); + populateDB(); + } + }); + } +}); + +exports.findById = function (req, res) { + var id = req.params.id; + console.log('Retrieving file: ' + id); + db.collection('files', function (err, collection) { + collection.findOne({'_id': new BSON.ObjectID(id)}, function (err, item) { + delete item._id; + res.header("Access-Control-Allow-Origin", "*"); + res.send(item); + }); + }); +}; + +exports.findAll = function (req, res) { + var filelist = new Object(); + db.collection('files', function (err, collection) { + collection.find({}, function (err, resultCursor) { + resultCursor.each(function (err, item) { + if (item != null) { + console.log('Item : ' + item._id + ' : ' + JSON.stringify(item)); + filelist[item._id] = item; + delete filelist[item._id]._id; + console.log(JSON.stringify(filelist)); + } + else { + res.header("Access-Control-Allow-Origin", "*"); + res.send(JSON.stringify(filelist)); + } + }); + }); + }); + +}; + +exports.addFile = function (req, res) { + var file = req.body; + console.log('Adding file : ' + JSON.stringify(file)); + + db.collection('files', function (err, collection) { + collection.insert(file, {safe: true}, function (err, result) { + if (err) { + res.send({'error': 'An error has occurred'}); + } else { + console.log('Success: ' + JSON.stringify(result[0])); + res.header("Access-Control-Allow-Origin", "*"); + res.send(result[0]); + } + }); + }); +} + +exports.updateFile = function (req, res) { + var id = req.params.id; + var file = req.body; + console.log('Updating file: ' + id); + console.log(JSON.stringify(file)); + + db.collection('files', function (err, collection) { + collection.update({'_id': new BSON.ObjectID(id)}, file, {safe: true}, function (err, result) { + if (err) { + console.log('Error updating file : ' + err); + res.send({'error': 'An error has occurred'}); + } else { + console.log('' + result + ' document(s) updated'); + res.header("Access-Control-Allow-Origin", "*"); + res.send('{"status":"success","id":"' + id + '","message":"The file was successfully updated."}'); + } + }); + }); +} + +exports.deleteFile = function (req, res) { + var id = req.params.id; + console.log('Deleting file: ' + id); + db.collection('files', function (err, collection) { + collection.remove({'_id': new BSON.ObjectID(id)}, {safe: true}, function (err, result) { + if (err) { + res.send({'error': 'An error has occurred - ' + err}); + } else { + console.log('' + result + ' document(s) deleted'); + res.send(req.body); + } + }); + }); + + +} + +/*--------------------------------------------------------------------------------------------------------------------*/ +// Populate database with sample data -- Only used once: the first time the application is started. +// You'd typically not find this code in a real-life app, since the database would already exist. +var populateDB = function () { + + var files = [ + { + name: "ExampleRAML", + path: "%2F", + contents: "gggggg" + } + ]; + + db.collection('files', function (err, collection) { + collection.insert(files, {safe: true}, function (err, result) { + }); + }); + +}; diff --git a/package.json b/package.json index 62f0ddb..c0a9d54 100755 --- a/package.json +++ b/package.json @@ -1,9 +1,10 @@ { -"name": "raml-files", -"description": "Remote RAML File Store API", -"version": "0.0.1", -"private": true, -"dependencies": { -"express": "3.x" -} + "name": "raml-files", + "description": "Remote RAML File Store API", + "version": "0.0.2", + "private": true, + "dependencies": { + "express": "3.x", + "mongodb": "1.x" + } } diff --git a/routes/files.js b/routes/files.js deleted file mode 100644 index cfcaba4..0000000 --- a/routes/files.js +++ /dev/null @@ -1,125 +0,0 @@ -var mongo = require('mongodb'); - -var Server = mongo.Server, -Db = mongo.Db, -BSON = mongo.BSONPure; - -var server = new Server('localhost', 27017, {auto_reconnect: true}); -db = new Db('ramldb', server); - -db.open(function(err, db) { -if(!err) { -console.log("Connected to 'ramldb' database"); -db.collection('files', {strict:true}, function(err, collection) { -if (err) { -console.log("The 'files' collection doesn't exist. Use POST to add RAML files..."); -populateDB(); -} -}); -} -}); - -exports.findById = function(req, res) { - var id = req.params.id; - console.log('Retrieving file: ' + id); - db.collection('files', function(err, collection) { - collection.findOne({'_id':new BSON.ObjectID(id)}, function(err, item) { - delete item._id; - res.header("Access-Control-Allow-Origin", "*"); - res.send(item); - }); - }); -}; - -exports.findAll = function(req, res) { - var filelist = new Object(); - db.collection('files', function(err, collection) { - collection.find({}, function(err, resultCursor) { - resultCursor.each(function(err,item) { - if(item != null){ - console.log('Item : '+item._id+' : ' + JSON.stringify(item)); - filelist[item._id] = item; - delete filelist[item._id]._id; - console.log(JSON.stringify(filelist)); - } - else{ - res.header("Access-Control-Allow-Origin", "*"); - res.send(JSON.stringify(filelist)); - } - }); - }); - }); - -}; - -exports.addFile = function(req, res) { - var file = req.body; - console.log('Adding file : ' + JSON.stringify(file)); - - db.collection('files', function(err, collection) { - collection.insert(file, {safe:true}, function(err, result) { - if (err) { - res.send({'error':'An error has occurred'}); - } else { - console.log('Success: ' + JSON.stringify(result[0])); - res.header("Access-Control-Allow-Origin", "*"); - res.send(result[0]); - } - }); - }); -} - -exports.updateFile = function(req, res) { - var id = req.params.id; - var file = req.body; - console.log('Updating file: ' + id); - console.log(JSON.stringify(file)); - - db.collection('files', function(err, collection) { - collection.update({'_id':new BSON.ObjectID(id)}, file, {safe:true}, function(err, result) { - if (err) { - console.log('Error updating file : ' + err); - res.send({'error':'An error has occurred'}); - } else { - console.log('' + result + ' document(s) updated'); - res.header("Access-Control-Allow-Origin", "*"); - res.send('{"status":"success","id":"'+id+'","message":"The file was successfully updated."}'); - } - }); - }); -} - -exports.deleteFile = function(req, res) { -var id = req.params.id; -console.log('Deleting file: ' + id); -db.collection('files', function(err, collection) { -collection.remove({'_id':new BSON.ObjectID(id)}, {safe:true}, function(err, result) { -if (err) { -res.send({'error':'An error has occurred - ' + err}); -} else { -console.log('' + result + ' document(s) deleted'); -res.send(req.body); -} -}); -}); - - -} - -/*--------------------------------------------------------------------------------------------------------------------*/ -// Populate database with sample data -- Only used once: the first time the application is started. -// You'd typically not find this code in a real-life app, since the database would already exist. -var populateDB = function() { - -var files = [ -{ -name: "ExampleRAML", -path: "%2F", -contents: "gggggg" -}]; - -db.collection('files', function(err, collection) { -collection.insert(files, {safe:true}, function(err, result) {}); -}); - -}; diff --git a/sample-designer.html b/sample-designer.html index 419a93d..06491e8 100644 --- a/sample-designer.html +++ b/sample-designer.html @@ -1,6 +1,6 @@ - + API Designer @@ -24,190 +24,183 @@ - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/server.js b/server.js index e266bb4..e1c8877 100755 --- a/server.js +++ b/server.js @@ -1,41 +1,41 @@ - var express = require('express'), -files = require('./routes/files'); - + files = require('./lib/files'); + var app = express(); app.configure(function () { -app.use(express.logger('dev')); /* 'default', 'short', 'tiny', 'dev' */ -app.use(express.bodyParser()); + app.use(express.logger('dev')); + /* 'default', 'short', 'tiny', 'dev' */ + app.use(express.bodyParser()); }); app.use(express.methodOverride()); - + // ## CORS middleware // // see: http://stackoverflow.com/questions/7067966/how-to-allow-cors-in-express-nodejs -var allowCrossDomain = function(req, res, next) { - res.header('Access-Control-Allow-Origin', '*'); - res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); - res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization'); - - // intercept OPTIONS method - if ('OPTIONS' == req.method) { - res.send(200); - } - else { - next(); - } +var allowCrossDomain = function (req, res, next) { + res.header('Access-Control-Allow-Origin', '*'); + res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE'); + res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization'); + + // intercept OPTIONS method + if ('OPTIONS' == req.method) { + res.send(200); + } + else { + next(); + } }; app.use(allowCrossDomain); - + app.get('/files', files.findAll); app.get('/files/:id', files.findById); app.post('/files', files.addFile); app.put('/files/:id', files.updateFile); app.delete('/files/:id', files.deleteFile); - + app.listen(3000); console.log('Listening on port 3000...');