99 lines
2.0 KiB
JavaScript
99 lines
2.0 KiB
JavaScript
import {readFile} from 'async-file'
|
|
import handlebars from 'handlebars'
|
|
import route from 'koa-route'
|
|
import compose from 'koa-compose'
|
|
|
|
import {map, assign} from '../utils/common'
|
|
import {index as indexFile} from '../config'
|
|
|
|
import sitemap from './sitemap'
|
|
import schedule from './schedule'
|
|
import {getPageUrls} from '../core/pages'
|
|
import news from './news'
|
|
import gallery from './gallery'
|
|
import documents from './documents'
|
|
import teachers from './teachers'
|
|
import events from './events'
|
|
import articles from './articles'
|
|
import pages from './pages'
|
|
|
|
let main = () => route.get('/', index())
|
|
|
|
export function routes(store) {
|
|
return compose([
|
|
main(),
|
|
sitemap(),
|
|
schedule(),
|
|
news(),
|
|
gallery(),
|
|
documents(store),
|
|
teachers(),
|
|
events(),
|
|
articles(),
|
|
pages(),
|
|
])
|
|
}
|
|
|
|
export function queryObject() {
|
|
let toTrue = map(true, i => i === 'true')
|
|
let toFalse = map(false, i => i === 'false')
|
|
const processors = [toTrue, toFalse]
|
|
|
|
return async(ctx, next) => {
|
|
let query = ctx.query
|
|
ctx.query = Object
|
|
.keys(query)
|
|
.reduce((query, key) => assign(
|
|
query,
|
|
key,
|
|
processors
|
|
.reduce((value, fn) => fn(value), query[key])
|
|
), query)
|
|
|
|
await next()
|
|
}
|
|
}
|
|
|
|
export function accepts(routes) {
|
|
return async function (ctx) {
|
|
let request = ctx.request
|
|
let types = Object.keys(routes)
|
|
.filter(type => request.accepts(type))
|
|
|
|
if (types.length) {
|
|
let fn = routes[types[0]]
|
|
|
|
await fn.apply(ctx, arguments)
|
|
} else {
|
|
ctx.status = 406
|
|
}
|
|
}
|
|
}
|
|
|
|
export function index(fn) {
|
|
return async function (ctx) {
|
|
let test = true
|
|
if (fn) test = await fn.apply(ctx, arguments)
|
|
if (!test) ctx.status = 404
|
|
|
|
const data = await getInitialData()
|
|
const source = await readFile(indexFile, 'utf-8')
|
|
const template = handlebars.compile(source)
|
|
|
|
ctx.type = 'text/html'
|
|
ctx.body = template({data: JSON.stringify(data)})
|
|
}
|
|
}
|
|
|
|
export function json(fn) {
|
|
return accepts({
|
|
'text/html': index(),
|
|
'text/plain': index(),
|
|
'application/json': fn
|
|
})
|
|
}
|
|
|
|
async function getInitialData() {
|
|
return {pages: []}
|
|
}
|