|
16 | 16 | var express = require('express');
|
17 | 17 | var bodyParser = require('body-parser');
|
18 | 18 |
|
19 |
| - |
20 |
| -module.exports = function(model) { |
| 19 | +module.exports = function (model) { |
21 | 20 |
|
22 | 21 | var router = express.Router();
|
23 | 22 |
|
24 |
| - router.use(bodyParser.urlencoded({extended: false})); |
25 |
| - |
26 |
| - |
27 |
| - function handleRpcError(err, res) { |
28 |
| - res.status(err.code || 500).send(err.message); |
29 |
| - } |
| 23 | + // Automatically parse request body as form data |
| 24 | + router.use(bodyParser.urlencoded({ extended: false })); |
30 | 25 |
|
31 |
| - |
32 |
| - router.use(function(req, res, next){ |
| 26 | + // Set Content-Type for all responses for these routes |
| 27 | + router.use(function (req, res, next){ |
33 | 28 | res.set('Content-Type', 'text/html');
|
34 | 29 | next();
|
35 | 30 | });
|
36 | 31 |
|
37 |
| - |
38 |
| - router.get('/', function list(req, res) { |
39 |
| - model.list(10, req.query.pageToken, |
40 |
| - function(err, entities, cursor) { |
41 |
| - if (err) { return handleRpcError(err, res); } |
42 |
| - res.render('books/list.jade', { |
43 |
| - books: entities, |
44 |
| - nextPageToken: cursor |
45 |
| - }); |
46 |
| - } |
47 |
| - ); |
| 32 | + /** |
| 33 | + * GET /books/add |
| 34 | + * |
| 35 | + * Display a page of books (up to ten at a time). |
| 36 | + */ |
| 37 | + router.get('/', function list(req, res, next) { |
| 38 | + model.list(10, req.query.pageToken, function (err, entities, cursor) { |
| 39 | + if (err) { return next(err); } |
| 40 | + res.render('books/list.jade', { |
| 41 | + books: entities, |
| 42 | + nextPageToken: cursor |
| 43 | + }); |
| 44 | + }); |
48 | 45 | });
|
49 | 46 |
|
50 |
| - |
51 |
| -// [START add_get] |
| 47 | + /** |
| 48 | + * GET /books/add |
| 49 | + * |
| 50 | + * Display a form for creating a book. |
| 51 | + */ |
| 52 | + // [START add_get] |
52 | 53 | router.get('/add', function addForm(req, res) {
|
53 | 54 | res.render('books/form.jade', {
|
54 | 55 | book: {},
|
55 | 56 | action: 'Add'
|
56 | 57 | });
|
57 | 58 | });
|
58 |
| -// [END add_get] |
59 |
| - |
60 |
| - |
61 |
| -// [START add_post] |
62 |
| - router.post('/add', function insert(req, res) { |
| 59 | + // [END add_get] |
| 60 | + |
| 61 | + /** |
| 62 | + * POST /books/add |
| 63 | + * |
| 64 | + * Create a book. |
| 65 | + */ |
| 66 | + // [START add_post] |
| 67 | + router.post('/add', function insert(req, res, next) { |
63 | 68 | var data = req.body;
|
64 | 69 |
|
65 | 70 | // Save the data to the database.
|
66 |
| - model.create(data, function(err, savedData) { |
67 |
| - if (err) { return handleRpcError(err, res); } |
| 71 | + model.create(data, function (err, savedData) { |
| 72 | + if (err) { return next(err); } |
68 | 73 | res.redirect(req.baseUrl + '/' + savedData.id);
|
69 | 74 | });
|
70 | 75 | });
|
71 |
| -// [END add_post] |
72 |
| - |
73 |
| - |
74 |
| - router.get('/:book/edit', function editForm(req, res) { |
75 |
| - model.read(req.params.book, function(err, entity) { |
76 |
| - if (err) { return handleRpcError(err, res); } |
| 76 | + // [END add_post] |
| 77 | + |
| 78 | + /** |
| 79 | + * GET /books/:id/edit |
| 80 | + * |
| 81 | + * Display a book for editing. |
| 82 | + */ |
| 83 | + router.get('/:book/edit', function editForm(req, res, next) { |
| 84 | + model.read(req.params.book, function (err, entity) { |
| 85 | + if (err) { return next(err); } |
77 | 86 | res.render('books/form.jade', {
|
78 | 87 | book: entity,
|
79 | 88 | action: 'Edit'
|
80 | 89 | });
|
81 | 90 | });
|
82 | 91 | });
|
83 | 92 |
|
84 |
| - |
85 |
| - router.post('/:book/edit', function update(req, res) { |
| 93 | + /** |
| 94 | + * POST /books/:id/edit |
| 95 | + * |
| 96 | + * Update a book. |
| 97 | + */ |
| 98 | + router.post('/:book/edit', function update(req, res, next) { |
86 | 99 | var data = req.body;
|
87 | 100 |
|
88 |
| - model.update(req.params.book, data, function(err, savedData) { |
89 |
| - if (err) { return handleRpcError(err, res); } |
| 101 | + model.update(req.params.book, data, function (err, savedData) { |
| 102 | + if (err) { return next(err); } |
90 | 103 | res.redirect(req.baseUrl + '/' + savedData.id);
|
91 | 104 | });
|
92 | 105 | });
|
93 | 106 |
|
94 |
| - |
95 |
| - router.get('/:book', function get(req, res) { |
96 |
| - model.read(req.params.book, function(err, entity) { |
97 |
| - if (err) { return handleRpcError(err, res); } |
| 107 | + /** |
| 108 | + * GET /books/:id |
| 109 | + * |
| 110 | + * Display a book. |
| 111 | + */ |
| 112 | + router.get('/:book', function get(req, res, next) { |
| 113 | + model.read(req.params.book, function (err, entity) { |
| 114 | + if (err) { return next(err); } |
98 | 115 | res.render('books/view.jade', {
|
99 | 116 | book: entity
|
100 | 117 | });
|
101 | 118 | });
|
102 | 119 | });
|
103 | 120 |
|
104 |
| - |
105 |
| - router.get('/:book/delete', function _delete(req, res) { |
106 |
| - model.delete(req.params.book, function(err) { |
107 |
| - if (err) { return handleRpcError(err, res); } |
| 121 | + /** |
| 122 | + * GET /books/:id/delete |
| 123 | + * |
| 124 | + * Delete a book. |
| 125 | + */ |
| 126 | + router.get('/:book/delete', function _delete(req, res, next) { |
| 127 | + model.delete(req.params.book, function (err) { |
| 128 | + if (err) { return next(err); } |
108 | 129 | res.redirect(req.baseUrl);
|
109 | 130 | });
|
110 | 131 | });
|
111 | 132 |
|
| 133 | + /** |
| 134 | + * Errors on "/books/*" routes. |
| 135 | + */ |
| 136 | + router.use(function handleRpcError(err, req, res, next) { |
| 137 | + // Format error and forward to generic error handler for logging and |
| 138 | + // responding to the request |
| 139 | + err.response = err.message; |
| 140 | + next(err); |
| 141 | + }); |
112 | 142 |
|
113 | 143 | return router;
|
114 |
| - |
115 | 144 | };
|
0 commit comments