diff --git a/.gitignore b/.gitignore index e607e67..40db2c9 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ results npm-debug.log .idea node_modules +providers-private.json diff --git a/CHANGES.md b/CHANGES.md index 886554c..7da5a8b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,13 @@ +2015-01-16, Version 1.1.0 +========================= + + * Upgrade deps (Raymond Feng) + + * Fix bad CLA URL in CONTRIBUTING.md (Ryan Graham) + + * #4: Return a 404 if file doesn't exist (Timo Saikkonen) + + 2014-11-27, Version 1.0.6 ========================= diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0c150b7..a8231d3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -14,7 +14,7 @@ Contributing to `loopback-component-storage` is easy. In a few simple steps: * Adhere to code style outlined in the [Google C++ Style Guide][] and [Google Javascript Style Guide][]. - * Sign the [Contributor License Agreement](https://cla.strongloop.com/strongloop/loopback-component-storage) + * Sign the [Contributor License Agreement](https://cla.strongloop.com/agreements/strongloop/loopback-component-storage) * Submit a pull request through Github. diff --git a/example/.gitignore b/example/.gitignore deleted file mode 100644 index 5e82b51..0000000 --- a/example/.gitignore +++ /dev/null @@ -1 +0,0 @@ -providers-private.json diff --git a/example/app.js b/example/app.js index 71906f6..0121b43 100644 --- a/example/app.js +++ b/example/app.js @@ -3,17 +3,12 @@ var loopback = require('loopback') var path = require('path'); -app.use(app.router); - // expose a rest api app.use('/api', loopback.rest()); app.use(loopback.static(path.join(__dirname, 'public'))); - -app.configure(function () { - app.set('port', process.env.PORT || 3000); -}); +app.set('port', process.env.PORT || 3000); var ds = loopback.createDataSource({ connector: require('../index'), @@ -25,21 +20,5 @@ var container = ds.createModel('container'); app.model(container); -/* -app.get('/', function (req, res, next) { - res.setHeader('Content-Type', 'text/html'); - var form = "

Storage Service Demo

" + - "List all containers

" + - "Upload to container c1:

" + - "

" - + "File to upload:
" - + "Notes about the file:
" - + "
" + - ""; - res.send(form); - res.end(); -}); -*/ - app.listen(app.get('port')); console.log('http://127.0.0.1:' + app.get('port')); diff --git a/example/upload-amazon.js b/example/upload-amazon.js index 96bd035..1f180a8 100644 --- a/example/upload-amazon.js +++ b/example/upload-amazon.js @@ -1,17 +1,16 @@ var StorageService = require('../').StorageService; -var providers = require('./providers.json'); +var providers = null; +try { + providers = require('./providers-private.json'); +} catch(err) { + providers = require('./providers.json'); +} var express = require('express'); var app = express(); -app.configure(function () { - app.set('port', process.env.PORT || 3001); - app.set('views', __dirname + '/views'); - app.set('view engine', 'ejs'); - app.use(express.favicon()); - // app.use(express.logger('dev')); - app.use(express.methodOverride()); - app.use(app.router); -}); +app.set('port', process.env.PORT || 3000); +app.set('views', __dirname + '/views'); +app.set('view engine', 'ejs'); var handler = new StorageService( { @@ -20,7 +19,7 @@ var handler = new StorageService( keyId: providers.amazon.keyId }); -app.get('/', function (req, res, next) { +app.get('/', function(req, res, next) { res.setHeader('Content-Type', 'text/html'); var form = "

Storage Service Demo

" + "List all containers

" + @@ -34,43 +33,43 @@ app.get('/', function (req, res, next) { res.end(); }); -app.post('/upload/:container', function (req, res, next) { - handler.upload(req, res, function (err, result) { +app.post('/upload/:container', function(req, res, next) { + handler.upload(req, res, function(err, result) { if (!err) { res.setHeader('Content-Type', 'application/json'); - res.send(200, result); + res.status(200).send(result); } else { - res.send(500, err); + res.status(500).send(err); } }); }); -app.get('/download', function (req, res, next) { - handler.getContainers(function (err, containers) { +app.get('/download', function(req, res, next) { + handler.getContainers(function(err, containers) { var html = "

Containers

Home

"; - res.send(200, html); + res.status(200).send(html); }); }); -app.get('/download/:container', function (req, res, next) { - handler.getFiles(req.params.container, function (err, files) { +app.get('/download/:container', function(req, res, next) { + handler.getFiles(req.params.container, function(err, files) { var html = "

Files in container " + req.params.container + "

Home

"; - res.send(200, html); + res.status(200).send(html); }); }); -app.get('/download/:container/:file', function (req, res, next) { - handler.download(req.params.container, req.params.file, res, function (err, result) { +app.get('/download/:container/:file', function(req, res, next) { + handler.download(req.params.container, req.params.file, res, function(err, result) { if (err) { - res.send(500, err); + res.status(500).send(err); } }); }); diff --git a/example/upload.js b/example/upload.js index 70183ed..f740237 100644 --- a/example/upload.js +++ b/example/upload.js @@ -3,15 +3,9 @@ var StorageService = require('../').StorageService; var express = require('express'); var app = express(); -app.configure(function () { - app.set('port', process.env.PORT || 3001); - app.set('views', __dirname + '/views'); - app.set('view engine', 'ejs'); - app.use(express.favicon()); - // app.use(express.logger('dev')); - app.use(express.methodOverride()); - app.use(app.router); -}); +app.set('port', process.env.PORT || 3000); +app.set('views', __dirname + '/views'); +app.set('view engine', 'ejs'); // Create the container var mkdirp = require('mkdirp'); @@ -19,7 +13,7 @@ mkdirp.sync('/tmp/storage/con1'); var handler = new StorageService({provider: 'filesystem', root: '/tmp/storage'}); -app.get('/', function (req, res, next) { +app.get('/', function(req, res, next) { res.setHeader('Content-Type', 'text/html'); var form = "

Storage Service Demo

" + "List all containers

" + @@ -33,43 +27,43 @@ app.get('/', function (req, res, next) { res.end(); }); -app.post('/upload/:container', function (req, res, next) { - handler.upload(req, res, function (err, result) { +app.post('/upload/:container', function(req, res, next) { + handler.upload(req, res, function(err, result) { if (!err) { res.setHeader('Content-Type', 'application/json'); - res.send(200, result); + res.status(200).send(result); } else { - res.send(500, err); + res.status(500).send(err); } }); }); -app.get('/download', function (req, res, next) { - handler.getContainers(function (err, containers) { +app.get('/download', function(req, res, next) { + handler.getContainers(function(err, containers) { var html = "

Containers

Home

"; - res.send(200, html); + res.status(200).send(html); }); }); -app.get('/download/:container', function (req, res, next) { - handler.getFiles(req.params.container, function (err, files) { +app.get('/download/:container', function(req, res, next) { + handler.getFiles(req.params.container, function(err, files) { var html = "

Files in container " + req.params.container + "

Home

"; - res.send(200, html); + res.status(200).send(html); }); }); -app.get('/download/:container/:file', function (req, res, next) { - handler.download(req.params.container, req.params.file, res, function (err, result) { +app.get('/download/:container/:file', function(req, res, next) { + handler.download(req.params.container, req.params.file, res, function(err, result) { if (err) { - res.send(500, err); + res.status(500).send(err); } }); }); diff --git a/lib/storage-handler.js b/lib/storage-handler.js index f56c669..5a75437 100644 --- a/lib/storage-handler.js +++ b/lib/storage-handler.js @@ -118,9 +118,16 @@ exports.download = function (provider, req, res, container, file, cb) { container: container || req && req.params.container, remote: file || req && req.params.file }); + res.type(file); reader.pipe(res); reader.on('error', function (err) { + if (err.code === 'ENOENT') { + res.type('application/json'); + res.send(404, { error: err }); + return; + } + res.type('application/json'); res.send(500, { error: err }); }); diff --git a/lib/storage-service.js b/lib/storage-service.js index 3f4b755..f71a04a 100644 --- a/lib/storage-service.js +++ b/lib/storage-service.js @@ -92,6 +92,10 @@ StorageService.prototype.destroyContainer = function (container, cb) { */ StorageService.prototype.getContainer = function (container, cb) { return this.client.getContainer(container, function (err, container) { + if (err && err.code === 'ENOENT') { + err.statusCode = err.status = 404; + return cb(err); + } return cb(err, map(container)); }); }; diff --git a/package.json b/package.json index 9e31ec1..5f9d40c 100644 --- a/package.json +++ b/package.json @@ -1,22 +1,22 @@ { "name": "loopback-component-storage", "description": "Loopback Storage Service", - "version": "1.0.6", + "version": "1.1.0", "main": "index.js", "scripts": { "test": "./node_modules/.bin/mocha --timeout 30000 test/*test.js" }, "dependencies": { - "pkgcloud": "~0.9.6", - "async": "~0.9.0", - "formidable": "~1.0.14" + "pkgcloud": "^1.1.0", + "async": "^0.9.0", + "formidable": "^1.0.16" }, "devDependencies": { - "express": "~3.4.0", - "loopback": "1.x.x", - "mocha": "~1.18.2", - "supertest": "~0.13.0", - "mkdirp": "~0.5.0" + "express": "^4.11.0", + "loopback": "^2.10.0", + "mocha": "^2.1.0", + "supertest": "^0.15.0", + "mkdirp": "^0.5.0" }, "repository": { "type": "git", @@ -27,6 +27,6 @@ "url": "https://github.com/strongloop/loopback-strorage-service/blob/master/LICENSE" }, "optionalDependencies": { - "sl-blip": "http://blip.strongloop.com/loopback-component-storage@1.0.6" + "sl-blip": "http://blip.strongloop.com/loopback-component-storage@1.1.0" } }