summary refs log tree commit diff stats
path: root/src/app.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/app.js')
-rw-r--r--src/app.js65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/app.js b/src/app.js
new file mode 100644
index 0000000..84722fc
--- /dev/null
+++ b/src/app.js
@@ -0,0 +1,65 @@
+'use strict'
+
+const Koa = require('koa')
+const app = new Koa()
+
+const streamify = require('stream-array')
+
+const send = require('koa-send')
+const responders = require('./responders.js')
+
+const config = require('./modules/config.js')
+
+const Router = require('koa-router')
+const router = new Router()
+
+app.context.getURL = router.url.bind(router)
+
+const Posts = require('./modules/posts.js')
+const posts = Posts.getFolder(config.posts.folder)
+
+function toArrayStream (iterator) {
+  return streamify(Array.from(iterator.entries()))
+}
+
+const postsStream = toArrayStream(posts)
+router.get('home', '/', async function (ctx, next) {
+  responders.home(ctx, config, postsStream)
+})
+
+router.get('post', '/post/:filename', async function (ctx, next) {
+  ctx.assert(posts.has(ctx.params.filename), 404, 'Post not found')
+  const post = posts.get(ctx.params.filename)
+  post.body = Posts.render(post)
+
+  responders.post(ctx, config, post)
+})
+
+const taxonomies = Posts.taxonomise(config.taxonomies, posts)
+for (let [term, items] of taxonomies) {
+  router.get(`taxon-${term}`, `/${term}/:value`, async function (ctx, next) {
+    const value = ctx.params.value
+    ctx.assert(
+      items.has(ctx.params.value),
+      404,
+      `Could not find ${term} ${value}`
+    )
+
+    const taxonItems = toArrayStream(items.get(value))
+
+    responders.taxon(ctx, config, taxonItems)
+  })
+}
+
+app.use(router.routes()).use(router.allowedMethods())
+
+const prefix = /^\/static\//
+app.use(async function (ctx) {
+  if (prefix.test(ctx.path)) {
+    await send(ctx, ctx.path.replace(prefix, ''), {
+      root: './static'
+    })
+  }
+})
+
+module.exports = app