84 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict'
 | |
| 
 | |
| /**
 | |
|  * Module dependencies.
 | |
|  */
 | |
| 
 | |
| var express = require('../../..');
 | |
| var fs = require('node:fs');
 | |
| var path = require('node:path');
 | |
| 
 | |
| module.exports = function(parent, options){
 | |
|   var dir = path.join(__dirname, '..', 'controllers');
 | |
|   var verbose = options.verbose;
 | |
|   fs.readdirSync(dir).forEach(function(name){
 | |
|     var file = path.join(dir, name)
 | |
|     if (!fs.statSync(file).isDirectory()) return;
 | |
|     verbose && console.log('\n   %s:', name);
 | |
|     var obj = require(file);
 | |
|     var name = obj.name || name;
 | |
|     var prefix = obj.prefix || '';
 | |
|     var app = express();
 | |
|     var handler;
 | |
|     var method;
 | |
|     var url;
 | |
| 
 | |
|     // allow specifying the view engine
 | |
|     if (obj.engine) app.set('view engine', obj.engine);
 | |
|     app.set('views', path.join(__dirname, '..', 'controllers', name, 'views'));
 | |
| 
 | |
|     // generate routes based
 | |
|     // on the exported methods
 | |
|     for (var key in obj) {
 | |
|       // "reserved" exports
 | |
|       if (~['name', 'prefix', 'engine', 'before'].indexOf(key)) continue;
 | |
|       // route exports
 | |
|       switch (key) {
 | |
|         case 'show':
 | |
|           method = 'get';
 | |
|           url = '/' + name + '/:' + name + '_id';
 | |
|           break;
 | |
|         case 'list':
 | |
|           method = 'get';
 | |
|           url = '/' + name + 's';
 | |
|           break;
 | |
|         case 'edit':
 | |
|           method = 'get';
 | |
|           url = '/' + name + '/:' + name + '_id/edit';
 | |
|           break;
 | |
|         case 'update':
 | |
|           method = 'put';
 | |
|           url = '/' + name + '/:' + name + '_id';
 | |
|           break;
 | |
|         case 'create':
 | |
|           method = 'post';
 | |
|           url = '/' + name;
 | |
|           break;
 | |
|         case 'index':
 | |
|           method = 'get';
 | |
|           url = '/';
 | |
|           break;
 | |
|         default:
 | |
|           /* istanbul ignore next */
 | |
|           throw new Error('unrecognized route: ' + name + '.' + key);
 | |
|       }
 | |
| 
 | |
|       // setup
 | |
|       handler = obj[key];
 | |
|       url = prefix + url;
 | |
| 
 | |
|       // before middleware support
 | |
|       if (obj.before) {
 | |
|         app[method](url, obj.before, handler);
 | |
|         verbose && console.log('     %s %s -> before -> %s', method.toUpperCase(), url, key);
 | |
|       } else {
 | |
|         app[method](url, handler);
 | |
|         verbose && console.log('     %s %s -> %s', method.toUpperCase(), url, key);
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     // mount the app
 | |
|     parent.use(app);
 | |
|   });
 | |
| };
 |