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 @@
+
+
+
+
+
+
+
+ {{feed.title}}
+ mdi-link
+
+ Last updated: {{feed.updated}}
+
+
+
+
+
+ {{item.title}}
+
+ {{item.updated}} ({{item.author}})
+
+
+
+ Complete story
+
+
+
+
+
+
+
+
+
+
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')
+}