93 lines
1.4 KiB
JavaScript
93 lines
1.4 KiB
JavaScript
|
|
||
|
/**
|
||
|
* Module dependencies.
|
||
|
*/
|
||
|
|
||
|
var render = require('./lib/render');
|
||
|
var logger = require('koa-logger');
|
||
|
var route = require('koa-route');
|
||
|
var views = require('co-views');
|
||
|
var koa = require('../..');
|
||
|
var app = koa();
|
||
|
|
||
|
// "database"
|
||
|
|
||
|
var posts = [];
|
||
|
|
||
|
// middleware
|
||
|
|
||
|
app.use(logger());
|
||
|
|
||
|
// route middleware
|
||
|
|
||
|
app.use(route.get('/', list));
|
||
|
app.use(route.get('/post/new', add));
|
||
|
app.use(route.get('/post/:id', show));
|
||
|
app.use(route.post('/post', create));
|
||
|
|
||
|
// route definitions
|
||
|
|
||
|
/**
|
||
|
* Post listing.
|
||
|
*/
|
||
|
|
||
|
function *list() {
|
||
|
this.body = yield render('list', { posts: posts });
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Show creation form.
|
||
|
*/
|
||
|
|
||
|
function *add() {
|
||
|
this.body = yield render('new');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Show post :id.
|
||
|
*/
|
||
|
|
||
|
function *show(id) {
|
||
|
var post = posts[id];
|
||
|
if (!post) this.throw(404, 'invalid post id');
|
||
|
this.body = yield render('show', { post: post });
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Create a post.
|
||
|
*/
|
||
|
|
||
|
function *create() {
|
||
|
var post = yield parse(this);
|
||
|
var id = posts.push(post) - 1;
|
||
|
post.created_at = new Date;
|
||
|
post.id = id;
|
||
|
this.redirect('/');
|
||
|
}
|
||
|
|
||
|
// TODO: use a lib...
|
||
|
|
||
|
var qs = require('querystring');
|
||
|
|
||
|
function parse(ctx) {
|
||
|
return function(done){
|
||
|
var buf = '';
|
||
|
var req = ctx.req;
|
||
|
req.setEncoding('utf8');
|
||
|
req.on('data', function(chunk){ buf += chunk });
|
||
|
req.on('end', function(){
|
||
|
try {
|
||
|
done(null, qs.parse(buf));
|
||
|
} catch (err){
|
||
|
err.body = buf;
|
||
|
err.status = 400;
|
||
|
done(err);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// listen
|
||
|
|
||
|
app.listen(3000);
|