examples: use path.join instead of concatenation
[express.git] / examples / mvc / lib / boot.js
blob422330dc066399d0e3f2a3dff351e2662c9a7338
1 /**
2  * Module dependencies.
3  */
5 var express = require('../../..');
6 var fs = require('fs');
7 var path = require('path');
9 module.exports = function(parent, options){
10   var dir = path.join(__dirname, '..', 'controllers');
11   var verbose = options.verbose;
12   fs.readdirSync(dir).forEach(function(name){
13     var file = path.join(dir, name)
14     if (!fs.statSync(file).isDirectory()) return;
15     verbose && console.log('\n   %s:', name);
16     var obj = require(file);
17     var name = obj.name || name;
18     var prefix = obj.prefix || '';
19     var app = express();
20     var handler;
21     var method;
22     var url;
24     // allow specifying the view engine
25     if (obj.engine) app.set('view engine', obj.engine);
26     app.set('views', path.join(__dirname, '..', 'controllers', name, 'views'));
28     // generate routes based
29     // on the exported methods
30     for (var key in obj) {
31       // "reserved" exports
32       if (~['name', 'prefix', 'engine', 'before'].indexOf(key)) continue;
33       // route exports
34       switch (key) {
35         case 'show':
36           method = 'get';
37           url = '/' + name + '/:' + name + '_id';
38           break;
39         case 'list':
40           method = 'get';
41           url = '/' + name + 's';
42           break;
43         case 'edit':
44           method = 'get';
45           url = '/' + name + '/:' + name + '_id/edit';
46           break;
47         case 'update':
48           method = 'put';
49           url = '/' + name + '/:' + name + '_id';
50           break;
51         case 'create':
52           method = 'post';
53           url = '/' + name;
54           break;
55         case 'index':
56           method = 'get';
57           url = '/';
58           break;
59         default:
60           /* istanbul ignore next */
61           throw new Error('unrecognized route: ' + name + '.' + key);
62       }
64       // setup
65       handler = obj[key];
66       url = prefix + url;
68       // before middleware support
69       if (obj.before) {
70         app[method](url, obj.before, handler);
71         verbose && console.log('     %s %s -> before -> %s', method.toUpperCase(), url, key);
72       } else {
73         app[method](url, handler);
74         verbose && console.log('     %s %s -> %s', method.toUpperCase(), url, key);
75       }
76     }
78     // mount the app
79     parent.use(app);
80   });