UNPKG

8.4 kBJavaScriptView Raw
1/*
2
3 This file is a part of node-on-train project.
4
5 Copyright (C) Thanh D. Dang <thanhdd.it@gmail.com>
6
7 node-on-train is free software: you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11
12 node-on-train is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>.
19
20*/
21
22
23var fs = require('fs');
24var Fiber = require('fibers');
25var RoutePattern = require('route-pattern');
26var colors = require('colors');
27
28var 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
126var 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
272module.exports.newServer = newServer;
273module.exports.initServer = initServer;