1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 | var fs = require('fs');
|
24 | var Fiber = require('fibers');
|
25 | var RoutePattern = require('route-pattern');
|
26 | var colors = require('colors');
|
27 |
|
28 | var initServer = function() {
|
29 | var routes;
|
30 | var controllers = {};
|
31 | var models = [];
|
32 | var listFiles = require('./helpers/list_files.js');
|
33 | var stringHelper = require('./helpers/string_helper.js');
|
34 |
|
35 | ROUTE_PATTERNS = [];
|
36 | ROOT_APP = process.cwd();
|
37 | routes = require(ROOT_APP + '/config/routes.js');
|
38 |
|
39 | CONFIG = { initializers: {} };
|
40 | CONFIG.env = { TRAINJS_ENV: 'development' };
|
41 |
|
42 | if (fs.existsSync(ROOT_APP + '/config/environment.js')) {
|
43 | var env = require(ROOT_APP + '/config/environment.js');
|
44 | for (var k in env) {
|
45 | CONFIG.env[k] = env[k];
|
46 | }
|
47 | }
|
48 |
|
49 | if ( fs.existsSync(ROOT_APP + '/config/database.json') && fs.existsSync(ROOT_APP + '/node_modules/sequelize/lib/sequelize.js') ) {
|
50 | var env_param_index = process.argv.indexOf("-e");
|
51 | if ( env_param_index > -1 && process.argv[ env_param_index + 1 ] ) {
|
52 | CONFIG.env.TRAINJS_ENV = process.argv[ env_param_index + 1 ];
|
53 | }
|
54 | var config = require(ROOT_APP + '/config/database.json')[CONFIG.env.TRAINJS_ENV];
|
55 | var Sequelize = require(ROOT_APP + '/node_modules/sequelize/lib/sequelize.js');
|
56 | CONFIG.database = new Sequelize(config.database, config.username, config.password, config);
|
57 | }
|
58 |
|
59 | ModelSync = function(promise) {
|
60 | var fiber = Fiber.current;
|
61 | promise.then(function (result) {
|
62 | fiber.run(result);
|
63 | }).catch(function(err) {
|
64 | fiber.run(err);
|
65 | });
|
66 | return Fiber.yield();
|
67 | };
|
68 |
|
69 | var initializers_files = listFiles(ROOT_APP + '/config/initializers');
|
70 | for (var f_i = 0; f_i < initializers_files.length; f_i++) {
|
71 | var info = initializers_files[f_i].split(' ');
|
72 | if (info[0] == 'f') {
|
73 | var file_path = info[1];
|
74 | var path = file_path.split('/');
|
75 | var initializer_name = path[ path.length - 1 ];
|
76 | var initializer = initializer_name.split('.js')[0];
|
77 | CONFIG.initializers[initializer] = require(file_path);
|
78 | }
|
79 | }
|
80 |
|
81 | var controller_files = listFiles(ROOT_APP + '/app/controllers');
|
82 | for (var f_i = 0; f_i < controller_files.length; f_i++) {
|
83 | var info = controller_files[f_i].split(' ');
|
84 | if (info[0] == 'f') {
|
85 | var file_path = info[1];
|
86 | var path = file_path.split('/');
|
87 | var controller_name = path[ path.length - 1 ];
|
88 | var resource = controller_name.split('_controller')[0];
|
89 | controllers[resource] = require(file_path);
|
90 | }
|
91 | }
|
92 |
|
93 | for (var c in controllers) {
|
94 | if (c != 'application') {
|
95 | controllers[c].prototype = new controllers['application']();
|
96 | controllers[c].prototype.constructor = controllers[c];
|
97 | }
|
98 | }
|
99 |
|
100 | var model_files = listFiles(ROOT_APP + '/app/models');
|
101 | for (var f_i = 0; f_i < model_files.length; f_i++) {
|
102 | var info = model_files[f_i].split(' ');
|
103 | if (info[0] == 'f') {
|
104 | var file_path = info[1];
|
105 | var path = file_path.split('/');
|
106 | var model_name = path[ path.length - 1 ];
|
107 | var model = stringHelper.toTitleCase( model_name.split('.js')[0] );
|
108 | model = stringHelper.Underscore2CamelCase( model );
|
109 | global[model] = require(file_path);
|
110 | models[model] = global[model];
|
111 | }
|
112 | }
|
113 |
|
114 | for (var m_i in models) {
|
115 | if (models[m_i].associate) {
|
116 | models[m_i].associate(models);
|
117 | }
|
118 | }
|
119 |
|
120 | return {
|
121 | routes: routes,
|
122 | controllers: controllers
|
123 | }
|
124 | };
|
125 |
|
126 | var newServer = function(app, global_v) {
|
127 | var routes = global_v.routes;
|
128 |
|
129 | for (var k in routes) {
|
130 | if (routes[k]['resources']) {
|
131 | if (routes[k]['only'] && routes[k]['only'].length) {
|
132 | for (var a = 0; a < routes[k]['only'].length; a++) {
|
133 | var action = routes[k]['only'][a];
|
134 | var method = 'get';
|
135 | var pattern = RoutePattern.fromString('/' + routes[k]['resources']);
|
136 | if (action == 'create') {
|
137 | method = 'post';
|
138 | } else if (action == 'show') {
|
139 | pattern = RoutePattern.fromString('/' + routes[k]['resources'] + '/:id');
|
140 | } else if (action == 'update') {
|
141 | method = 'put';
|
142 | pattern = RoutePattern.fromString('/' + routes[k]['resources'] + '/:id');
|
143 | } else if (action == 'destroy') {
|
144 | method = 'delete';
|
145 | pattern = RoutePattern.fromString('/' + routes[k]['resources'] + '/:id');
|
146 | }
|
147 |
|
148 | ROUTE_PATTERNS.push({
|
149 | method: method,
|
150 | pattern: pattern,
|
151 | resource: routes[k]['resources'],
|
152 | action: action
|
153 | });
|
154 | }
|
155 | } else {
|
156 | ROUTE_PATTERNS.push({
|
157 | method: 'get',
|
158 | pattern: RoutePattern.fromString('/' + routes[k]['resources']),
|
159 | resource: routes[k]['resources'],
|
160 | action: 'index'
|
161 | });
|
162 | ROUTE_PATTERNS.push({
|
163 | method: 'post',
|
164 | pattern: RoutePattern.fromString('/' + routes[k]['resources']),
|
165 | resource: routes[k]['resources'],
|
166 | action: 'create'
|
167 | });
|
168 | ROUTE_PATTERNS.push({
|
169 | method: 'get',
|
170 | pattern: RoutePattern.fromString('/' + routes[k]['resources'] + '/:id'),
|
171 | resource: routes[k]['resources'],
|
172 | action: 'show'
|
173 | });
|
174 | ROUTE_PATTERNS.push({
|
175 | method: 'put',
|
176 | pattern: RoutePattern.fromString('/' + routes[k]['resources'] + '/:id'),
|
177 | resource: routes[k]['resources'],
|
178 | action: 'update'
|
179 | });
|
180 | ROUTE_PATTERNS.push({
|
181 | method: 'delete',
|
182 | pattern: RoutePattern.fromString('/' + routes[k]['resources'] + '/:id'),
|
183 | resource: routes[k]['resources'],
|
184 | action: 'destroy'
|
185 | });
|
186 | }
|
187 |
|
188 | if (routes[k]['member'] && routes[k]['member'].length) {
|
189 | for (var m = 0; m < routes[k]['member'].length; m++) {
|
190 | var member = routes[k]['member'][m];
|
191 | if (member['get']) {
|
192 | ROUTE_PATTERNS.push({
|
193 | method: 'get',
|
194 | pattern: RoutePattern.fromString('/' + routes[k]['resources'] + '/:id/' + member['get']),
|
195 | resource: routes[k]['resources'],
|
196 | action: member['get']
|
197 | });
|
198 | } else if (member['post']) {
|
199 | ROUTE_PATTERNS.push({
|
200 | method: 'post',
|
201 | pattern: RoutePattern.fromString('/' + routes[k]['resources'] + '/:id/' + member['post']),
|
202 | resource: routes[k]['resources'],
|
203 | action: member['post']
|
204 | });
|
205 | } else if (member['put']) {
|
206 | ROUTE_PATTERNS.push({
|
207 | method: 'put',
|
208 | pattern: RoutePattern.fromString('/' + routes[k]['resources'] + '/:id/' + member['put'] + '/:id'),
|
209 | resource: routes[k]['resources'],
|
210 | action: member['put']
|
211 | });
|
212 | } else if (member['delete']) {
|
213 | ROUTE_PATTERNS.push({
|
214 | method: 'delete',
|
215 | pattern: RoutePattern.fromString('/' + routes[k]['resources'] + '/:id/' + member['delete'] + '/:id'),
|
216 | resource: routes[k]['resources'],
|
217 | action: member['delete']
|
218 | });
|
219 | }
|
220 | }
|
221 | }
|
222 | } else {
|
223 | var method = 'get';
|
224 | var url = '/';
|
225 |
|
226 | if (routes[k]['method'] && routes[k]['url']) {
|
227 | method = routes[k]['method'].toLowerCase();
|
228 | url = routes[k]['url'];
|
229 | } else {
|
230 | if (routes[k]['get']) {
|
231 | method = 'get';
|
232 | } else if (routes[k]['post']) {
|
233 | method = 'post';
|
234 | } else if (routes[k]['put']) {
|
235 | method = 'put';
|
236 | } else if (routes[k]['delete']) {
|
237 | method = 'delete';
|
238 | } else if (routes[k]['options']) {
|
239 | method = 'options';
|
240 | }
|
241 | url = routes[k][method];
|
242 | }
|
243 |
|
244 | var url_path = url.split('/');
|
245 | var resource = routes[k]['controller'] ? routes[k]['controller'] : url_path[1];
|
246 | var action = routes[k]['action'];
|
247 |
|
248 | if (!routes[k]['action'] && url_path.length > 2) {
|
249 | action = url_path[2];
|
250 | if (method == 'get')
|
251 | action = 'show';
|
252 | else if (method == 'put')
|
253 | action = 'update';
|
254 | else if (method == 'delete')
|
255 | action = 'destroy';
|
256 | } else if (!routes[k]['action'] && url_path.length > 1) {
|
257 | action = 'index';
|
258 | if (method == 'post')
|
259 | action = 'create';
|
260 | }
|
261 |
|
262 | ROUTE_PATTERNS.push({
|
263 | method: method,
|
264 | pattern: RoutePattern.fromString(url),
|
265 | resource: resource,
|
266 | action: action
|
267 | });
|
268 | }
|
269 | }
|
270 | };
|
271 |
|
272 | module.exports.newServer = newServer;
|
273 | module.exports.initServer = initServer;
|