diff --git a/routes/index.js b/routes/index.js index 9c18c01..02a20a0 100644 --- a/routes/index.js +++ b/routes/index.js @@ -4,7 +4,7 @@ const router = express.Router(); const db = require('../modules/db'); const magnet = require('./magnet'); -template = (magnet, meta) => (` +const foundTemplate = (magnet, meta) => (` @@ -22,24 +22,39 @@ template = (magnet, meta) => (` `) -router.get('/:shortlink', (req, res, next) => { +const notFoundTemplate = () => (` + + + + + + Not Found + + + +

⚡ Oops! Nothing found here.

+ + +`) + +router.get('/:shortlink', (req, res) => { db.get(req.params.shortlink) .then(record => { const r = String(record); - const [ magnet, title ] = r.split('@@title@@'); + const [magnet, title] = r.split('@@title@@'); const meta = { title: title ? '⚡ ' + title : '⚡ :magnet:' } - res.send(template(magnet, meta)) + res.send(foundTemplate(magnet, meta)) }) .catch(e => { console.log(`[ERR!] Occured while retrieving shortlink`, e.stack); - res.end('Invalid shortlink') + res.send(notFoundTemplate()) }); -}) +}); /* GET home page. */ -router.get('/', function(req, res, next) { +router.get('/', function (req, res) { res.render('index', { title: ':magnet: ⚡️' }); }); diff --git a/routes/magnet.js b/routes/magnet.js index 9b01af6..b514719 100644 --- a/routes/magnet.js +++ b/routes/magnet.js @@ -3,47 +3,59 @@ const router = express.Router(); const db = require('../modules/db'); -const createMagnet = (uri, title, baseUrl, ctx) => { - const key = Math.random().toString(36).slice(4); - if (!uri.match(/magnet:\?xt=urn:.*/i)) { - console.log(`[ERR!] Invalid request ${uri}`); - ctx.res.status(400); - ctx.res.json({ - err: 'Invalid magnet URI' - }); - return; - } - - const value = title ? uri + '@@title@@' + title : uri; - - db.put(key, value) - .then(() => ctx.res.json({ - status: 'OK', - uri: baseUrl + '/' + key - })) - .catch(e => { +const handleSuccess = ({ res, baseUrl, key }) => res.json({ status: 'OK', uri: baseUrl + '/' + key }) + +const handleError = ({ res, uri }, err) => { + switch (err.message) { + case "ERR_NO_URI": { + console.log(`[ERR!] Invalid request ${uri}`); + return res.status(400).json({ + err: 'No magnet URI found' + }); + } + case "ERR_INVALID_URI": { + console.log(`[ERR!] Invalid request ${uri}`); + return res.status(400).json({ + err: 'Invalid magnet URI' + }); + } + default: { console.log(`[ERR!] Occured while creating new shortlink`, e.stack); - ctx.res.status(520); - ctx.res.json({ + return res.status(520).json({ err: 'Unknown err! Please try again' }); - }) + } + } } -router.get('/:body', (req, res, next) => { +const createMagnet = (uri, title, baseUrl, res) => { + if (!uri) + return Promise.reject(new Error("ERR_NO_URI")); + + if (!uri.match(/magnet:\?xt=urn:.*/i)) + return Promise.reject(new Error("ERR_INVALID_URI")); + + const key = Math.random().toString(36).slice(4); + const value = title ? uri + '@@title@@' + title : uri; + return db.put(key, value) + .then(() => handleSuccess({ res, baseUrl, key })) + .catch(handleError.bind(undefined, { res, uri })); +} + +router.get('/:body', (req, res) => { const body = req.originalUrl.split('/api/')[1]; - const [ uri, title ] = body.split('@@title@@'); + const [uri, title] = body.split('@@title@@'); const baseUrl = req.protocol + '://' + req.get('host'); - return createMagnet(uri, title, baseUrl, { req, res }); -}) + return createMagnet(uri, title, baseUrl, res); +}); /* POST magnet link. */ -router.post('/', (req, res, next) => { +router.post('/', (req, res) => { const { uri, title } = req.body; const baseUrl = req.protocol + '://' + req.get('host'); - return createMagnet(uri, title, baseUrl, { req, res }); + return createMagnet(uri, title, baseUrl, res); }); module.exports = router; \ No newline at end of file