140 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| 
 | |
| var fsapi = require("desirae/lib/node-adapters").fsapi;
 | |
| module.exports.create = function (options) {
 | |
|   var restful = {};
 | |
|   //
 | |
|   // Required for desirae
 | |
|   //
 | |
|   restful.walk = function (req, res, next) {
 | |
|     if (!(/^GET$/i.test(req.method) || /^GET$/i.test(req.query._method))) {
 | |
|       next();
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     var opts = {},
 | |
|       dirnames =
 | |
|         (req.query.dir && [req.query.dir]) ||
 | |
|         (req.query.dirs && req.query.dirs.split(/,/g)) ||
 | |
|         req.body.dirs;
 | |
|     if (!dirnames || !dirnames.length) {
 | |
|       res.send({
 | |
|         error:
 | |
|           "please specify GET w/ req.query.dir or POST w/ _method=GET&dirs=path/to/thing,...",
 | |
|       });
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     if (
 | |
|       !dirnames.every(function (dirname) {
 | |
|         return "string" === typeof dirname;
 | |
|       })
 | |
|     ) {
 | |
|       res.send({ error: "malformed request: " + JSON.stringify(dirnames) });
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     /*
 | |
|     if (req.query.excludes) {
 | |
|       opts.excludes = req.query.excludes.split(',');
 | |
|     }
 | |
|     */
 | |
| 
 | |
|     if (req.query.extensions) {
 | |
|       opts.extensions = req.query.extensions.split(/,/g);
 | |
|     }
 | |
| 
 | |
|     if ("true" === req.query.dotfiles) {
 | |
|       opts.dotfiles = true;
 | |
|     }
 | |
|     if ("false" === req.query.sha1sum) {
 | |
|       opts.sha1sum = false;
 | |
|     }
 | |
|     if ("true" === req.query.contents) {
 | |
|       opts.contents = true;
 | |
|     }
 | |
| 
 | |
|     // TODO opts.contents?
 | |
|     fsapi.walk.walkDirs(options.blogdir, dirnames, opts).then(function (stats) {
 | |
|       if (!req.body.dirs && !req.query.dirs) {
 | |
|         res.send(stats[dirnames[0]]);
 | |
|       } else {
 | |
|         res.send(stats);
 | |
|       }
 | |
|     });
 | |
|   };
 | |
| 
 | |
|   restful.getFiles = function (req, res, next) {
 | |
|     if (!(/^GET$/i.test(req.method) || /^GET$/i.test(req.query._method))) {
 | |
|       next();
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     var filepaths =
 | |
|       (req.query.path && [req.query.path]) ||
 | |
|       (req.query.paths && req.query.paths.split(/,/g)) ||
 | |
|       req.body.paths;
 | |
|     if (!filepaths || !filepaths.length) {
 | |
|       res.send({
 | |
|         error:
 | |
|           "please specify GET w/ req.query.path or POST _method=GET&paths=path/to/thing,...",
 | |
|       });
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     return fsapi.getfs(options.blogdir, filepaths).then(function (files) {
 | |
|       if (!req.body.paths && !req.query.paths) {
 | |
|         res.send(files[0]);
 | |
|       } else {
 | |
|         res.send(files);
 | |
|       }
 | |
|     });
 | |
|   };
 | |
| 
 | |
|   restful.putFiles = function (req, res, next) {
 | |
|     if (
 | |
|       !(/^POST|PUT$/i.test(req.method) || /^POST|PUT$/i.test(req.query._method))
 | |
|     ) {
 | |
|       next();
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     var opts = {},
 | |
|       files = req.body.files;
 | |
|     if (!files || !files.length) {
 | |
|       res.send({ error: "please specify POST w/ req.body.files" });
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     opts.tmpdir = options.tmpdir;
 | |
|     return fsapi.putfs(options.blogdir, files, opts).then(function (results) {
 | |
|       res.send(results);
 | |
|     });
 | |
|   };
 | |
| 
 | |
|   restful.copy = function (req, res, next) {
 | |
|     if (
 | |
|       !(/^POST|PUT$/i.test(req.method) || /^POST|PUT$/i.test(req.query._method))
 | |
|     ) {
 | |
|       next();
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     var opts = {},
 | |
|       files = req.body.files;
 | |
|     if ("object" !== typeof files || !Object.keys(files).length) {
 | |
|       res.send({ error: "please specify POST w/ req.body.files" });
 | |
|       return;
 | |
|     }
 | |
| 
 | |
|     return fsapi.copyfs(options.blogdir, files, opts).then(function (results) {
 | |
|       res.send(results);
 | |
|     });
 | |
|   };
 | |
|   //
 | |
|   // end Desirae API
 | |
|   //
 | |
| 
 | |
|   return restful;
 | |
| };
 |