1 | var fs = require('fs');
|
2 | var clc = require('cli-color');
|
3 |
|
4 | var clcError = clc.red;
|
5 | var allFiles = [];
|
6 |
|
7 | exports.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 |
|
19 | exports.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 |
|
58 |
|
59 | return exports;
|
60 | };
|
61 |
|
62 | function 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 |
|
70 | function 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 |
|
83 | function 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 |
|
111 | function getAPI2(args) {
|
112 | var self = this;
|
113 |
|
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 |
|
123 | getAPI2.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 |
|
147 | function 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 | }
|