UNPKG

decentralized-internet

Version:

An NPM library of programs to create decentralized web and distributed computing projects

324 lines (244 loc) 8.3 kB
# couch-provider Provide methods to interface with couchdb and your server application. Upload documents, attachments, retrieve, modify and delete functions are provided. **If you don't want to store attachments in the couchdb server you can provide a 'datapath' in the configuration. The attachments will be store in that location on your server.** This package is implemented using [bluebird](https://github.com/petkaantonov/bluebird) Promises ---- npm install couch-provider ---- ## Usage ### Standalone usage, codename is always optional, if not provided it will use the 'default' name in your configuration ---- //Multiple db configuration, namespace is optional, you can add multiple namespaces by providing an array var couchdbconfig = { "default" : "db1", "db1" : { "hostname": "http://localhost:5984", "database": "users1", "datapath": "/some/path/in/server" }, "db2" : { "hostname": "http://yourdomain.com", "database": "users2" } } //Single db configuration, namespace is optional //var couchdbconfig = { // "hostname": "http://localhost:5984", // "database": "users1" //} var couchProvider = require('couch-provider').couchProvider; couchProvider.setConfiguration(confexample); var url = couchProvider.getCouchDBServer(codename); --- #### Create the DB --- return couchProvider.createDB("users1") .then(function(res){ console.log(res); }); --- #### Upload a document --- var docs = [{ "someinfo" : "someotherinfo" }]; return couchProvider.uploadDocuments(docs, codename) .then(function(res){ var docids = _.pluck(res, "id");//Underscore library https://underscorejs.org/ }); --- #### Fetch documents --- return Promise.map(docids, function(docid){ return couchProvider.getDocument(docid, codename); }) .then(function(doc){ console.log(doc); }); --- #### Add attachment --- var filename = path.join(__dirname, "README.md"); var stream = fs.createReadStream(filename); return Promise.map(docids, function(docid){ return couchProvider.getDocument(docid, codename) .then(function(doc){ return couchProvider.addDocumentAttachment(doc, 'name/in/database.txt', stream, codename); }); }); --- #### Get attachment --- return couchProvider.getDocument(docid, codename) .then(function(doc){ return couchProvider.getDocumentAttachment(doc, 'name/in/database.txt', codename); }) .then(function(res){ //res is a buffer with the file content console.log(res.toString()); }); --- #### Get attachment stream --- return couchProvider.getDocument(docid, codename) .then(function(doc){ var stream = couchProvider.getDocumentStreamAttachment(doc, 'name/in/database.txt', codename); //Do something with the stream, write, pipe somewhere, etc. }); --- #### Delete attachment --- return Promise.map(docids, function(docid){ return couchProvider.getDocument(docid, codename) .then(function(doc){ return couchProvider.deleteAttachment(doc, "testname/README.md", codename); }) .then(function(res){ console.log(res); }); }); --- #### Delete document --- return Promise.map(docids, function(docid){ return couchProvider.getDocument(docid, codename) .then(function(doc){ return couchProvider.deleteDocument(doc, codename); }) .then(function(res){ console.log("Document deleted", res); }); }); --- #### Get view from db --- couchProvider.getView('_design/user/_view/info') .then(function(data){ console.log(data);//Array of documents }); --- ###This package can be used as an Hapi plugin. --- /* * To use as an Hapi plugin, the methods will be available to your server application as server.methods.yourserverapp.* * @server Hapi server object * @couchdbconfig couchdb configuration object with multiple databases, optionally use only one database * @namespace Optional namespace. The methods will be added to the Hapi server. For this example, * the methods will be made available as server.methods.yourserverapp.* * By default the namespace is couchprovider */ var plugin = {}; plugin.register = require('couch-provider'); plugin.options = couchdbconfig; ---- #### How to use couch-provider if used as an Hapi plugin, add a namespace to the configuration ---- //Multiple db configuration, namespace is optional, you can add multiple namespaces by providing an array var couchdbconfig = { "default" : "db1", "db1" : { "hostname": "http://localhost:5984", "database": "users1", "datapath": "/some/path/in/server" }, "db2" : { "hostname": "http://yourdomain.com", "database": "users2" }, "namespace": "yourserverapp" } var server = new Hapi.Server(); var plugins = []; var plugin = {}; plugin.register = require('couch-provider'); plugin.options = couchdbconfig; plugins.push(plugin); server.register(plugins, function(err){ if (err) { throw err; // something bad happened loading the plugin } }); server.start(function () { console.log("The server has started"); }); --- ##### getCouchDBServer(codename) Returns the uri of couchdb ex. 'http://localhost:5984/users1' ---- //yourserverapp is the namespace in the configuration. The namespace is used to add methods to the server. Check Hapi doc for more //information on server methods https://hapijs.com/tutorials/server-methods var uri = server.methods.yourserverapp.getCouchDBServer(codename); ---- ##### uploadDocuments(docs, codename) Add a new document, the parameter docs can be either an array of json objects or a single object ---- server.methods.yourserverapp.uploadDocuments(docs) .then(function(res){ console.log(res); //result of the couchdb operation }); ---- ##### getDocument(id, codename) Get a document from the db given an id ---- server.methods.yourserverapp.getDocument(id) .then(function(res){ console.log(res); //document }); ---- ##### deleteDocument(doc, codename) Delete the document from couchdb, the object doc is needed since deletion requires the document id and the revision number. ---- server.methods.yourserverapp.deleteDocument(doc) .then(function(res){ console.log(res); //result of the operation }); ---- ##### deleteDocumentAttachment(doc, name, codename) Delete the document attachment from couchdb or filesystem, the object doc is needed since deletion requires the document id and the revision number. ---- server.methods.yourserverapp.deleteDocument(doc) .then(function(res){ console.log(res); //result of the operation }); ---- ##### addDocumentAttachment(doc, name, stream, codename) Add the attachment to the document or filesystem. The stream parameter must implement 'pipe' method. See 'stream' documentation in node.js[nodejs.org]. name is a string and it is the name of the attachment ---- server.methods.yourserverapp.addDocumentAttachment(doc, name, stream) .then(function(res){ console.log(res); //result of the operation }); ---- ##### getDocumentStreamAttachment(doc, name, codename) Returns the stream of an attachment. Example of a request, reply in Hapi ---- function getAttachment = function(request, reply){ var docid = request.params.id;//If your Hapi handler method uses the doc id as parameter var attachmentname = request.params.name;//If the name of the attachment is passed as a parameter server.methods.yourserverapp.getDocument(docid) .then(function(doc){ reply(server.methods.yourserverapp.getDocumentStreamAttachment(doc, attachmentname)); }) .catch(function(e){ rep(Boom.wrap(e)); }); } ---- ##### getDocumentAttachment(doc, name, codename) Get the attachment data ---- server.methods.yourserverapp.getDocumentAttachment(doc, attachmentname) .then(function(data){ console.log(data);//This is a buffer }); ---- ##### getView(view, codename) The view parameter is the path to the couchdb view ex. '_design/user/_view/info'. ---- server.methods.yourserverapp.getView('_design/user/_view/info') .then(function(data){ console.log(data); }); ----