UNPKG

4.37 kBJavaScriptView Raw
1var fs = require('fs');
2var clc = require('cli-color');
3
4var clcError = clc.red;
5var allFiles = [];
6
7exports.makeGlobal = function(config, mongoose, io) {
8 GLOBAL.mongoose = mongoose;
9 GLOBAL.io = io;
10 GLOBAL.Schema = mongoose.schema;
11 for (var i in Schema) {
12 GLOBAL[i] = Schema[i];
13 }
14 GLOBAL.servers = config.servers;
15 GLOBAL.ObjectId = mongoose.Types.ObjectId;
16 return exports;
17}
18
19exports.attachAPI = function() {
20
21 GLOBAL.API2 = function() {
22 return new getAPI2(arguments);
23 };
24
25 GLOBAL.API = function(route) {
26 var originalRoute = route;
27 if (!route) {
28 return {};
29 }
30 route = GLOBAL.API.version + route;
31 var api;
32 var methods;
33 try {
34 methods = API[route];
35 } catch (err) {
36 console.log(clcError('Error on API usage::', err));
37 var err = 'Either this API does not exist, or you are requiring this API from a file that might currently being using this API';
38 throw new Error(err);
39 }
40 if (!methods) {
41 try {
42 methods = projRequire(serverConfig.api.location + route + '.js');
43 } catch (err) {
44 console.log(clcError('Error on API usage::', err));
45 var err = 'Either this API does not exist, or you are requiring this API from a file that might currently being using this API';
46 throw new Error(err);
47 }
48 }
49 return methods;
50 };
51
52 API.version = getCurrentVersion() || '';
53 if (API.version) {
54 API.version = 'v' + API.version + '/';
55 }
56 initializeAPI();
57 // see if they are using versioning
58 // end versioning
59 return exports;
60};
61
62function initializeAPI() {
63 var files = getAllFilesFromDirectory(serverConfig.api.location);
64 for (var i in files) {
65 var file = files[i];
66 initializeFilesAPIS(file);
67 }
68}
69
70function initializeFilesAPIS(file, ext) {
71 if (file.indexOf('.js') == -1) {
72 return;
73 }
74 var fileName = file.replace(rootUrl + '/' + serverConfig.api.location, '').replace(serverConfig.api.location, '').replace('.js', '');
75 var fns = require(file);
76 API[fileName] = {};
77 for (var k in fns) {
78 var fn = fns[k];
79 API[fileName][k] = fn;
80 }
81}
82
83function getCurrentVersion() {
84 if (serverConfig.api.version) {
85 return serverConfig.api.version;
86 }
87 var dir = rootUrl + '/' + serverConfig.api.location;
88 var files = fs.readdirSync(dir);
89 var dirs = [];
90 var regex = /^[0-9]+$/;
91 var currentVersion;
92 for (var i in files) {
93 var file = files[i];
94 var version = file.slice(1, file.length);
95 if (file[0] != '.' && file[0] == 'v' && regex.test(version)) {
96 var filePath = dir + file;
97 stat = fs.statSync(filePath);
98 if (stat.isDirectory()) {
99 if (!currentVersion) {
100 currentVersion = 0;
101 }
102 if (version > currentVersion) {
103 currentVersion = version;
104 }
105 }
106 }
107 }
108 return currentVersion;
109}
110
111function getAPI2(args) {
112 var self = this;
113 // args are the supplied functions
114 function API_CONSTRUCTOR(data, fn, session, extras) {
115 self.middleWare(args, 0, data, fn, session, extras);
116 };
117 API_CONSTRUCTOR.after = function(afterFunctions) {
118 self.afterFunctions = afterFunctions;
119 };
120 return API_CONSTRUCTOR;
121}
122
123getAPI2.prototype.middleWare = function(args, count, data, fn, session, extras) {
124 var self = this;
125 if (typeof extras != 'object') {
126 extras = {
127 connectionType: 'internal'
128 };
129 }
130 if (count + 1 != args.length) {
131 args[count](data, fn, session, extras, function(opts) {
132 if (typeof opts === 'object' && opts.finish === true) {
133 args[args.length - 1](data, fn, session, extras);
134 } else {
135 self.middleWare(args, count + 1, data, fn, session, extras);
136 }
137 }, fn);
138 } else {
139 args[count](data, function(err, res) {
140 if (self.afterFunctions) {
141 self.afterFunctions(err, res, data, session, extras);
142 }
143 }, session, extras);
144 }
145};
146
147function getAllFilesFromDirectory(dir) {
148 var fs = require('fs');
149 var results = [];
150 if (dir.indexOf(rootUrl) != 0) {
151 dir = rootUrl + '/' + dir;
152 }
153 fs.readdirSync(dir).forEach(function(file) {
154 if (dir[dir.length - 1] !== '/') {
155 file = dir + '/' + file;
156 } else {
157 file = dir + file;
158 }
159 var stat = fs.statSync(file);
160 if (stat && stat.isDirectory()) {
161 results = results.concat(getAllFilesFromDirectory(file))
162 } else results.push(file);
163 });
164 return results
165}