desirae.js/server.js

103 lines
2.7 KiB
JavaScript

'use strict';
require('require-yaml');
var PromiseA = require('bluebird').Promise
, connect = require('connect')
, query = require('connect-query')
, bodyParser = require('body-parser')
, serveStatic = require('serve-static')
, forEachAsync = require('foreachasync').forEachAsync
, send = require('connect-send-json')
, app = connect()
, walk = require('./lib/walk')
, config = require('./config.yml')
, safeResolve = require('./lib/deardesi-utils').safeResolve
, path = require('path')
, blogdir = path.resolve(config.blogdir || __dirname)
, sha1sum = function (str) { return require('secret-utils').hashsum('sha1', str); }
, fs = PromiseA.promisifyAll(require('fs'))
;
app
.use(send.json())
.use(query())
.use(bodyParser.json())
.use('/api/fs/files', 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.body.paths
, files = []
;
if (!filepaths || !filepaths.length) {
res.json({ error: "please specify req.query.path or req.body.paths" });
return;
}
return forEachAsync(filepaths, function (filepath) {
var pathname = safeResolve(blogdir, filepath)
;
return fs.lstatAsync(pathname).then(function (stat) {
return fs.readFileAsync(pathname, null).then(function (buffer) {
files.push({
path: filepath
, size: buffer.byteLength
, lastModifiedDate: stat.mtime.toISOString()
, contents: buffer.toString('utf8')
, sha1: sha1sum(buffer)
,
});
});
}).catch(function (e) {
files.push({ path: filepath, error: e.message });
});
}).then(function () {
res.send(files);
});
})
.use('/api/fs/walk', function (req, res, next) {
if (!(/^GET$/i.test(req.method) || /^GET$/i.test(req.query._method))) {
next();
return;
}
var dirnames = req.query.dir && [req.query.dir] || req.body.dirs
;
if (!dirnames || !dirnames.length) {
res.json({ error: "please specify req.query.dir or req.body.dirs" });
return;
}
walk.walkDirs(blogdir, dirnames, { contents: false }).then(function (stats) {
if (!req.body.dirs) {
res.json(stats[dirnames[0]]);
} else {
res.json(stats);
}
});
})
.use('/api/fs', function (req, res, next) {
next();
return;
})
.use(serveStatic('.'))
;
module.exports = app;
require('http').createServer(app).listen(8080, function () {
console.log('listening 8080');
});