diff --git a/lib/www/client/source/src/components/help-dialog.vue b/lib/www/client/source/src/components/help-dialog.vue index 61b88d3..1e91222 100644 --- a/lib/www/client/source/src/components/help-dialog.vue +++ b/lib/www/client/source/src/components/help-dialog.vue @@ -45,6 +45,14 @@ mdi-bug Report a bug + + + mdi-rss @@ -73,7 +81,8 @@ export default { data () { return { dialog: false, - email: "dougal-support@aaltronav.eu" + email: "dougal-support@aaltronav.eu", + feed: btoa(encodeURIComponent("https://gitlab.com/wgp/dougal/software.atom?feed_token=XSPpvsYEny8YmH75Nz5W")) }; } diff --git a/lib/www/client/source/src/router/index.js b/lib/www/client/source/src/router/index.js index c1070ea..9458350 100644 --- a/lib/www/client/source/src/router/index.js +++ b/lib/www/client/source/src/router/index.js @@ -33,6 +33,14 @@ Vue.use(VueRouter) // which is lazy-loaded when the route is visited. component: () => import(/* webpackChunkName: "about" */ '../views/About.vue') }, + { + path: '/feed/:source', + name: 'Feed', + // route level code-splitting + // this generates a separate chunk (about.[hash].js) for this route + // which is lazy-loaded when the route is visited. + component: () => import(/* webpackChunkName: "about" */ '../views/Feed.vue') + }, { pathToRegexpOptions: { strict: true }, path: "/login", diff --git a/lib/www/client/source/src/views/Feed.vue b/lib/www/client/source/src/views/Feed.vue new file mode 100644 index 0000000..d440202 --- /dev/null +++ b/lib/www/client/source/src/views/Feed.vue @@ -0,0 +1,103 @@ + + + diff --git a/lib/www/server/api/index.js b/lib/www/server/api/index.js index 7d4cd21..eab8f50 100644 --- a/lib/www/server/api/index.js +++ b/lib/www/server/api/index.js @@ -183,6 +183,9 @@ app.map({ get: [ mw.gis.navdata.get ] } }, + '/rss/': { + get: [ mw.rss.get ] + } // // '/user': { // get: [ mw.user.get ], diff --git a/lib/www/server/api/middleware/index.js b/lib/www/server/api/middleware/index.js index eaecf29..19fc302 100644 --- a/lib/www/server/api/middleware/index.js +++ b/lib/www/server/api/middleware/index.js @@ -12,5 +12,6 @@ module.exports = { configuration: require('./configuration'), info: require('./info'), meta: require('./meta'), - openapi: require('./openapi') + openapi: require('./openapi'), + rss: require('./rss') }; diff --git a/lib/www/server/api/middleware/rss/get.js b/lib/www/server/api/middleware/rss/get.js new file mode 100644 index 0000000..020b137 --- /dev/null +++ b/lib/www/server/api/middleware/rss/get.js @@ -0,0 +1,21 @@ +const fetch = require('node-fetch'); + +module.exports = async function (req, res, next) { + + try { + if (req.query.remote) { + // We're being asked to fetch a remote feed + // NOTE: No, we don't limit what feeds the user can fetch + + const r = await fetch(req.query.remote); + if (r && r.ok) { + res.set("Content-Type", "application/xml"); + res.send(await r.text()); + return; + } + } + res.status(400).send(); + } catch (err) { + next(err); + } +} diff --git a/lib/www/server/api/middleware/rss/index.js b/lib/www/server/api/middleware/rss/index.js new file mode 100644 index 0000000..fe5c66b --- /dev/null +++ b/lib/www/server/api/middleware/rss/index.js @@ -0,0 +1,4 @@ + +module.exports = { + get: require('./get') +}