From 7709e125005c4400409aeccc3494995e7eef4cc8 Mon Sep 17 00:00:00 2001 From: John Crepezzi Date: Fri, 18 Nov 2011 17:12:28 -0500 Subject: [PATCH] Added FS backed --- .gitignore | 1 + lib/document_handler.js | 67 ++++++++++++++++++++++++++++++----------- 2 files changed, 51 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index bb5fbe3..a4e838b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ npm-debug.log node_modules *.swp *.swo +data diff --git a/lib/document_handler.js b/lib/document_handler.js index 5b07d0d..3e7a903 100644 --- a/lib/document_handler.js +++ b/lib/document_handler.js @@ -1,4 +1,7 @@ +var fs = require('fs'); // TODO won't be needed + var winston = require('winston'); +var hashlib = require('hashlib'); // For handling serving stored documents @@ -8,36 +11,66 @@ var DocumentHandler = function(options) { } }; -// TODO implement with FS backend -DocumentHandler.documents = {}; +// Save a document +// TODO make data path configurable +// TODO move to a separate object +DocumentHandler.save = function(key, data, callback) { + fs.mkdir('data', '700', function() { + fs.writeFile('data/' + hashlib.md5(key), data, 'utf8', function() { + callback(true); // TODO handle errors + }); + }); +}; + +// Retrieve a document by key +DocumentHandler.get = function(key, callback) { + fs.readFile('data/' + hashlib.md5(key), 'utf8', function(err, data) { + if (err) { + callback(false); + } + else { + callback(data); + } + }); +}; // Handle retrieving a document DocumentHandler.prototype.handleGet = function(key, response) { - if (DocumentHandler.documents[key]) { - winston.verbose('retrieved document', { key: key }); - response.writeHead(200, { 'content-type': 'application/json' }); - response.end(JSON.stringify({ data: DocumentHandler.documents[key], key: key })); - } - else { - winston.warn('document not found', { key: key }); - response.writeHead(404, { 'content-type': 'application/json' }); - response.end(JSON.stringify({ message: 'document not found' })); - } + DocumentHandler.get(key, function(ret) { + if (ret) { + winston.verbose('retrieved document', { key: key }); + response.writeHead(200, { 'content-type': 'application/json' }); + response.end(JSON.stringify({ data: ret, key: key })); + } + else { + winston.warn('document not found', { key: key }); + response.writeHead(404, { 'content-type': 'application/json' }); + response.end(JSON.stringify({ message: 'document not found' })); + } + }); }; // Handle adding a new Document DocumentHandler.prototype.handlePost = function(request, response) { var key = this.randomKey(); + var buffer = ''; request.on('data', function(data) { - if (!DocumentHandler.documents[key]) { + if (!buffer) { response.writeHead(200, { 'content-type': 'application/json' }); - DocumentHandler.documents[key] = ''; } - DocumentHandler.documents[key] += data.toString(); + buffer += data.toString(); }); request.on('end', function(end) { - winston.verbose('added document', { key: key }); - response.end(JSON.stringify({ key: key })); + DocumentHandler.save(key, buffer, function(res) { + if (res) { + winston.verbose('added document', { key: key }); + response.end(JSON.stringify({ key: key })); + } + else { + winston.verbose('error adding document'); + response.end(JSON.stringify({ message: 'error adding document' })); + } + }); }); request.on('error', function(error) { winston.error('connection error: ' + error.message);