/
controller.js
171 lines (155 loc) · 4.51 KB
/
controller.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
/**
* Mobius-JS
* /\ \
* / \ \
* / \ \
* / \ \
* / /\ \ \
* / / \ \ \
* / / \ \ \
* / / / \ \ \
* / / / \ \ \
* / / /---------' \
* / / /_______________\
* \ / /
* \/_____________________/
*
* Benjamin Coe (BenjaminCoe.com) - MIT Licensed.
*
* Description: This is the base controller inherited by all other
* controllers in the Mobius framework.
*/
// Dependencies.
var resig = require('resig/resig');
var sys = require('sys');
var helpers = require('mobius-js/helpers/helpers');
var webHelpers = require('mobius-js/helpers/web-helpers')
/**
* A Mobius controller inherits from a Resig class.
*/
MobiusController = resig.Class.extend( {
});
/**
* The base class for all controllers.Do not access this method
* directly, instead use MobiusController.extend({});
*
* @param {object} mobiusProcessingStack provides a synchronous stack.
* @type void
* @public
*/
MobiusController.prototype.init = function(mobiusProcessingStack) {
this.mobiusProcessingStack = mobiusProcessingStack;
},
/**
* Called when a route is hit that matches this controller.
*
* @param {string} action the action within the controller to call.
* @param {object} express the Express DSL object.
* @type void
* @private
*/
MobiusController.prototype.execute = function(controller, action, express) {
this.action = action || 'index';
// Index is a special case.
this.renderAction = this.action;
if (this.renderAction == 'index') {
this.renderAction = controller;
}
this.express = express;
this._loadParams();
this._invokeAction(this.action);
this.mobiusProcessingStack.render({
self : this,
view : this.renderAction + '.html.mejs',
options : {},
}, this._render);
},
/**
* Thin wrapper for the express object. Allows classes that extend
* the MobiusController to call this.render.
*
* @param {string} view the view file to render.
* @param {object} options options for the express object's render function.
* @type void
* @public
*/
MobiusController.prototype.render = function(view, options) {
this.mobiusProcessingStack.render({
self : this,
view : view,
options : options,
}, this._render);
},
/**
* We must ensure that rendering is the last action that takes place
* when calling the mobius controller. For this reason, the render step
* is dispatched to the mobius processing stack and actually performed
* with this callback.
*
* @param {object} params
* @type void
* @private
*/
MobiusController.prototype._render = function(params) {
params['options']['locals'] = params['self']._getLocals();
params['self'].express.render(params['view'], params['options']);
},
/**
* Run an action within this controller.
* a sanity check is performed to make sure the action actually exists.
*
* @param {string} action
* @type void
* @private
*/
MobiusController.prototype._invokeAction = function(action) {
// If an action has hyphens in its name they should be
// removed and converted to camel case.
action = helpers.stringToActionName(action, '-');
if (typeof this[action] == 'function') {
this[action].call(this) // Call the action of this controller.
} else {
this.express.redirect('/public/errors/action-not-found.html');
}
},
/**
* Map instance variables for this class so that they can be accessed from within the template.
*
* @type {object}
* @return All this classes instance variables mapped onto an object.
* @private
*/
MobiusController.prototype._getLocals = function() {
var locals = {};
for (var key in this) {
if (typeof this[key] != 'function') {
locals[key] = this[key];
}
}
return locals;
},
/**
* Merge get and post parameters into the same struct.
* call helper functions to create arrays from magic
* post syntax.
*
* @type void
* @private
*/
MobiusController.prototype._loadParams = function() {
this.params = {};
// Merge get and post parameters into a single struct.
if (this.express.params.get && this.express.params.post) {
// Merge the get and post parameters.
for (var key in this.express.params.post) {
this.express.params.get[key] = this.express.params.post[key];
}
this.params = this.express.params.get;
} else
if (this.express.post) {
this.params = this.express.params.post;
} else
if (this.express.get) {
this.params = this.express.params.get;
}
}