mirror of
https://github.com/viq/NewsBlur.git
synced 2025-04-13 09:38:09 +00:00
98 lines
3.4 KiB
JavaScript
98 lines
3.4 KiB
JavaScript
// Generated by CoffeeScript 2.6.1
|
|
(function() {
|
|
var busboy, fs, fsPromises, log, mkdirp, mkdirpPromise, original_page, path;
|
|
|
|
path = require('path');
|
|
|
|
busboy = require('connect-busboy');
|
|
|
|
fs = require('fs');
|
|
|
|
mkdirp = require('mkdirp');
|
|
|
|
log = require('./log.js');
|
|
|
|
fsPromises = fs.promises;
|
|
|
|
mkdirpPromise = require('util').promisify(mkdirp);
|
|
|
|
original_page = (app) => {
|
|
var DB_PATH, DEV, splitFeedId;
|
|
DEV = process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'docker' || process.env.NODE_ENV === 'debug';
|
|
DB_PATH = '/srv/originals';
|
|
app.use(busboy());
|
|
app.get(/^\/original_page\/(\d+)\/?/, function(req, res) {
|
|
var etag, feedId, feedIdDir, filePath, lastModified;
|
|
if (req.query.test) {
|
|
return res.end("OK");
|
|
}
|
|
feedId = parseInt(req.params[0], 10);
|
|
etag = req.header('If-None-Match');
|
|
lastModified = req.header('If-Modified-Since');
|
|
feedIdDir = splitFeedId(feedId);
|
|
filePath = `${DB_PATH}/${feedIdDir}.zhtml`;
|
|
// Convert to async flow with try/catch using CoffeeScript's then/catch for Promises
|
|
return fsPromises.stat(filePath).then(function(stats) {
|
|
var fileEtag;
|
|
fileEtag = Date.parse(stats.mtime).toString();
|
|
if (etag === fileEtag || lastModified === stats.mtime.toISOString()) {
|
|
log.debug(`Not modified: ${feedId} (${filePath})`);
|
|
return res.sendStatus(304);
|
|
} else {
|
|
return fsPromises.readFile(filePath).then(function(content) {
|
|
log.debug(`Sending: ${feedId} (${filePath}) ${stats.size} bytes`);
|
|
res.header('Etag', fileEtag);
|
|
return res.send(content);
|
|
});
|
|
}
|
|
}).catch(function(err) {
|
|
if (err.code === 'ENOENT') {
|
|
log.debug(`Original page not found: ${feedId} (${filePath})`);
|
|
return res.sendStatus(404);
|
|
} else {
|
|
log.debug(`Error reading original page: ${feedId} (${filePath}) ${err}`);
|
|
return res.sendStatus(500);
|
|
}
|
|
});
|
|
});
|
|
app.post(/^\/original_page\/(\d+)\/?/, function(req, res) {
|
|
var feedId, feedIdDir, filePath, filePathDir;
|
|
feedId = parseInt(req.params[0], 10);
|
|
feedIdDir = splitFeedId(feedId);
|
|
filePath = `${DB_PATH}/${feedIdDir}.zhtml`;
|
|
filePathDir = path.dirname(filePath);
|
|
// Ensure directory exists before proceeding
|
|
return mkdirpPromise(filePathDir).then(function() {
|
|
var fstream;
|
|
fstream = fs.createWriteStream(filePath);
|
|
req.pipe(req.busboy);
|
|
return req.busboy.on('file', function(fieldname, file, filename) {
|
|
file.pipe(fstream);
|
|
return fstream.on('close', function() {
|
|
return fsPromises.stat(filePath).then(function(stats) {
|
|
log.debug(`Saving: ${feedId} (${filePath}) ${stats.size} bytes`);
|
|
return res.send("OK");
|
|
});
|
|
});
|
|
});
|
|
}).catch(function(err) {
|
|
log.debug(err);
|
|
return res.sendStatus(500);
|
|
});
|
|
});
|
|
splitFeedId = function(feedId) {
|
|
var rgx;
|
|
feedId += '';
|
|
// x2 = if feedId.length > 1 then '.' + feedId[1] else ''
|
|
rgx = /(\d+)(\d{3})/;
|
|
while (rgx.test(feedId)) {
|
|
feedId = feedId.replace(rgx, '$1' + '/' + '$2');
|
|
}
|
|
return feedId;
|
|
};
|
|
return log.debug(`Starting Original Page server ${DEV ? "on DEV" : "in production"}`);
|
|
};
|
|
|
|
exports.original_page = original_page;
|
|
|
|
}).call(this);
|