@blaasvaer/frmwrk 0.2.0 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/connections.js +6 -11
- package/handle-request.js +31 -19
- package/index.js +11 -1
- package/package.json +1 -1
- package/router.js +29 -45
- package/utils.js +9 -0
- package/package 2.json +0 -30
package/connections.js
CHANGED
|
@@ -4,7 +4,7 @@ const utils = require('./utils');
|
|
|
4
4
|
* Install connections
|
|
5
5
|
*/
|
|
6
6
|
function installconnections ( config ) {
|
|
7
|
-
FW.
|
|
7
|
+
FW.databases = {};
|
|
8
8
|
|
|
9
9
|
let connections_dir = config.root + '/connections/';
|
|
10
10
|
|
|
@@ -14,6 +14,8 @@ function installconnections ( config ) {
|
|
|
14
14
|
const connection_files = [];
|
|
15
15
|
|
|
16
16
|
files.forEach( file => {
|
|
17
|
+
let connection_name = file.split('.')[0];
|
|
18
|
+
|
|
17
19
|
// Skip file if name start with an underscore
|
|
18
20
|
if ( file.charAt(0) === '_' )
|
|
19
21
|
return;
|
|
@@ -23,20 +25,13 @@ function installconnections ( config ) {
|
|
|
23
25
|
let connection = require( connections_dir + file );
|
|
24
26
|
|
|
25
27
|
if ( connection ) {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
// Check for config connection type
|
|
30
|
-
if ( config.connection && FW.connections[ config.connection ] ) {
|
|
31
|
-
FW.database = FW.connections[ config.connection ];
|
|
32
|
-
}
|
|
33
|
-
|
|
28
|
+
FW.databases[ connection_name ] = connection;
|
|
29
|
+
|
|
34
30
|
resolve( file );
|
|
35
31
|
} else {
|
|
36
32
|
reject( "Loading of connection: " + file + " failed!" );
|
|
37
33
|
}
|
|
38
|
-
});
|
|
39
|
-
|
|
34
|
+
});
|
|
40
35
|
connection_files.push( promise );
|
|
41
36
|
});
|
|
42
37
|
|
package/handle-request.js
CHANGED
|
@@ -49,8 +49,7 @@ async function handleRequest( req, res ) {
|
|
|
49
49
|
* Find route in Router based on url
|
|
50
50
|
*/
|
|
51
51
|
const route = findRoute( request_url );
|
|
52
|
-
|
|
53
|
-
// console.log("route", route);
|
|
52
|
+
|
|
54
53
|
/**
|
|
55
54
|
* Check for complete route
|
|
56
55
|
* @param {[type]} route [description]
|
|
@@ -62,26 +61,39 @@ async function handleRequest( req, res ) {
|
|
|
62
61
|
*/
|
|
63
62
|
const controller = new Controller( route, req, res, request_url );
|
|
64
63
|
|
|
65
|
-
|
|
66
|
-
* AUTHORIZATION
|
|
67
|
-
* Check for authorization parameters.
|
|
68
|
-
*/
|
|
69
|
-
if ( route?.params !== null ) {
|
|
70
|
-
// console.log("Params not null", route.params);
|
|
71
|
-
let _redirect = (route.params?.redirect) ? route.params.redirect : '/login';
|
|
72
|
-
|
|
73
|
-
if ( route?.params?.authorize === true ) {
|
|
74
|
-
console.log("This route should be authorized!");
|
|
75
|
-
res.writeHead(301, { "Location": "http://" + req.headers['host'] + _redirect });
|
|
76
|
-
return res.end();
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
let response_output = `Nothing here …`;
|
|
64
|
+
let response_output = 'Nothing here …';
|
|
81
65
|
|
|
82
66
|
switch ( method ) {
|
|
83
67
|
case 'GET':
|
|
84
|
-
|
|
68
|
+
if ( ! controller.route.params ) {
|
|
69
|
+
/**
|
|
70
|
+
* If the route has no parameters, then just run the route method and serve whatever it may …
|
|
71
|
+
*/
|
|
72
|
+
response_output = await controller.view();
|
|
73
|
+
} else {
|
|
74
|
+
/**
|
|
75
|
+
* Authorization
|
|
76
|
+
*/
|
|
77
|
+
if ( Authorize( controller.route ) ) {
|
|
78
|
+
response_output = await controller.view();
|
|
79
|
+
} else {
|
|
80
|
+
/**
|
|
81
|
+
* Redirect the user to login if auth fails
|
|
82
|
+
*/
|
|
83
|
+
if ( controller.route.params.access.redirect ) {
|
|
84
|
+
status_code = 302;
|
|
85
|
+
res.setHeader( 'Location', controller.route.params.access.redirect );
|
|
86
|
+
}
|
|
87
|
+
// console.log("NO USER", controller.route.params.redirect);
|
|
88
|
+
// response_output = redirect.action.call();
|
|
89
|
+
// route.params.redirect.call();
|
|
90
|
+
// response_output = 'Access denied';
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if ( controller.route.params.type ) {
|
|
94
|
+
content_type = controller.route.params.type;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
85
97
|
|
|
86
98
|
res.statusCode = status_code;
|
|
87
99
|
res.setHeader( 'Content-Type', content_types[content_type] );
|
package/index.js
CHANGED
|
@@ -92,6 +92,16 @@ FW = function ( config ) {
|
|
|
92
92
|
return output;
|
|
93
93
|
}
|
|
94
94
|
|
|
95
|
+
/**
|
|
96
|
+
* Check for authorization parameters.
|
|
97
|
+
*/
|
|
98
|
+
if ( route.params !== null ) {
|
|
99
|
+
// console.log("Params not null", route.params);
|
|
100
|
+
if ( route.params.access !== undefined ) {
|
|
101
|
+
console.log("This route should be authorized!");
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
95
105
|
return this;
|
|
96
106
|
}
|
|
97
107
|
|
|
@@ -111,7 +121,7 @@ FW = function ( config ) {
|
|
|
111
121
|
/**
|
|
112
122
|
* Run post install processes here …
|
|
113
123
|
*/
|
|
114
|
-
|
|
124
|
+
|
|
115
125
|
})
|
|
116
126
|
.catch(function( err ) {
|
|
117
127
|
console.log("Install Error:", err);
|
package/package.json
CHANGED
package/router.js
CHANGED
|
@@ -10,63 +10,37 @@ const url = require('url');
|
|
|
10
10
|
global.routes = [];
|
|
11
11
|
|
|
12
12
|
global.ROUTE = function ( route, action, params = null ) {
|
|
13
|
+
let _route = route.split('/');
|
|
14
|
+
|
|
13
15
|
let r = {
|
|
14
|
-
"controller":
|
|
15
|
-
"resource":
|
|
16
|
-
"resource_id":
|
|
16
|
+
"controller": _route[1] == '' ? 'index' : _route[1],
|
|
17
|
+
"resource": _route[2] == '' ? '' : _route[2],
|
|
18
|
+
"resource_id": _route[3] == '' ? '' : _route[3],
|
|
17
19
|
"route": route,
|
|
18
20
|
"action": action,
|
|
19
21
|
"params": params,
|
|
20
22
|
}
|
|
21
|
-
|
|
22
|
-
// console.log("----------------------");
|
|
23
|
-
// console.log("Router route:", route);
|
|
24
|
-
// console.log("Router controller:", r.controller);
|
|
25
|
-
// console.log("Router resource:", r.resource);
|
|
26
|
-
// console.log("Router resource_id:", r.resource_id);
|
|
27
|
-
// console.log("Router route:", r.route);
|
|
28
|
-
// console.log("Router action:", r.action);
|
|
29
|
-
// console.log("Router params:", r.params);
|
|
23
|
+
|
|
30
24
|
global.routes.push( r );
|
|
31
25
|
};
|
|
32
26
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
// // Set controller, resource, resource_id, search, searchParams
|
|
43
|
-
// this.controller = url_array[0];
|
|
44
|
-
// this.resource = url_array[1];
|
|
45
|
-
// this.resource_id = url_array[2];
|
|
46
|
-
// this.search = url_array[3];
|
|
47
|
-
// this.searchParams = url_array[4];
|
|
48
|
-
|
|
49
|
-
// // console.log("referer", referer);
|
|
50
|
-
// // console.log("url", url);
|
|
51
|
-
// // console.log("this.controller", this.controller);
|
|
52
|
-
// // console.log("this.resource", this.resource);
|
|
53
|
-
// // console.log("this.resource_id", this.resource_id);
|
|
54
|
-
// // console.log("this.search", this.search);
|
|
55
|
-
// // console.log("this.searchParams", this.searchParams);
|
|
56
|
-
|
|
57
|
-
// return this;
|
|
58
|
-
// };
|
|
59
|
-
|
|
27
|
+
/**
|
|
28
|
+
* A route can be either static or dynamic.
|
|
29
|
+
* A static route is defined in the controllers and dynamic routes will be resolved automatically.
|
|
30
|
+
* In order to figure out if we have a static route, we check the pathname and match it against the global.routes object.
|
|
31
|
+
* If we do not find any match we asume the route is dynamic and therefore pass '/api/:resource' on.
|
|
32
|
+
* @param {string} url The url to find
|
|
33
|
+
* @returns object
|
|
34
|
+
*/
|
|
60
35
|
function findRoute ( url ) {
|
|
61
|
-
let pathname = url.pathname
|
|
36
|
+
let pathname = url.pathname,
|
|
37
|
+
url_array = pathname.split('/').filter( e => e );
|
|
62
38
|
|
|
63
39
|
let route = global.routes.find( ( obj ) => obj.route === FW.utils.removeTrailingSlashes( pathname ) );
|
|
64
40
|
|
|
65
41
|
if ( route ) {
|
|
66
42
|
return route;
|
|
67
43
|
} else {
|
|
68
|
-
const url_array = pathname.split('/').filter( e => e );
|
|
69
|
-
|
|
70
44
|
// Check if route is an API call
|
|
71
45
|
let isAPICall = pathname.split('/')[1] === 'api' ? true : false;
|
|
72
46
|
|
|
@@ -93,8 +67,19 @@ function findRoute ( url ) {
|
|
|
93
67
|
route = global.routes.find( ( obj ) => obj.route === '/api/:resources' );
|
|
94
68
|
break;
|
|
95
69
|
case 3:
|
|
96
|
-
|
|
97
|
-
|
|
70
|
+
// Check for static route with dynamic resource_id
|
|
71
|
+
let static_route_path = '/' + url_array[0] + '/' + url_array[1] + '/:id';
|
|
72
|
+
let static_route = global.routes.find( ( obj ) => obj.route === static_route_path );
|
|
73
|
+
|
|
74
|
+
// If we don't find a static route we pass on a dynamic
|
|
75
|
+
if ( ! static_route ) {
|
|
76
|
+
regex = /api\/(?<resource>[a-z_]+)\/(?<id>[0-9]+)/; // match /api/<resource>/<id>
|
|
77
|
+
route = global.routes.find( ( obj ) => obj.route === '/api/:resources/:id' );
|
|
78
|
+
} else {
|
|
79
|
+
let resource = url_array[1];
|
|
80
|
+
regex = new RegExp(`\/api\/${resource}\/(?<id>[0-9]+)`); // match /api/resource/<id>
|
|
81
|
+
route = global.routes.find( ( obj ) => obj.route === '/api/' + url_array[1] + '/:id' );
|
|
82
|
+
}
|
|
98
83
|
break;
|
|
99
84
|
}
|
|
100
85
|
|
|
@@ -114,6 +99,5 @@ function findRoute ( url ) {
|
|
|
114
99
|
}
|
|
115
100
|
|
|
116
101
|
module.exports = {
|
|
117
|
-
// Router,
|
|
118
102
|
findRoute
|
|
119
103
|
}
|
package/utils.js
CHANGED
|
@@ -71,6 +71,15 @@ class Utils {
|
|
|
71
71
|
removeTrailingSlashes( url ) {
|
|
72
72
|
return url.replace(/\/+$/, '');
|
|
73
73
|
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Removes all starting and trailing slashes from URL
|
|
77
|
+
* @param {string} url
|
|
78
|
+
* @return {string} Return the string without trailing slashes.
|
|
79
|
+
*/
|
|
80
|
+
removeStartingTrailingSlashes( url ) {
|
|
81
|
+
return url.replace(/^\/+|\/+$/g, '')
|
|
82
|
+
}
|
|
74
83
|
}
|
|
75
84
|
|
|
76
85
|
module.exports = new Utils();
|
package/package 2.json
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@blaasvaer/frmwrk",
|
|
3
|
-
"version": "0.1.14",
|
|
4
|
-
"description": "My personal Node framework",
|
|
5
|
-
"main": "index.js",
|
|
6
|
-
"scripts": {
|
|
7
|
-
"test": "echo \"Error: no test specified\" && exit 1",
|
|
8
|
-
"patch": "npm version patch --force && npm publish",
|
|
9
|
-
"major": "npm version major --force && npm publish",
|
|
10
|
-
"minor": "npm version minor --force && npm publish"
|
|
11
|
-
},
|
|
12
|
-
"repository": {
|
|
13
|
-
"type": "git",
|
|
14
|
-
"url": "git+ssh://git@bitbucket.org/blaasvaer/frmwrk.git"
|
|
15
|
-
},
|
|
16
|
-
"keywords": [
|
|
17
|
-
"Node",
|
|
18
|
-
"Framework",
|
|
19
|
-
"Homebrew"
|
|
20
|
-
],
|
|
21
|
-
"author": "Sam Blåsvær",
|
|
22
|
-
"license": "ISC",
|
|
23
|
-
"bugs": {
|
|
24
|
-
"url": "https://bitbucket.org/blaasvaer/frmwrk/issues"
|
|
25
|
-
},
|
|
26
|
-
"homepage": "https://bitbucket.org/blaasvaer/frmwrk#readme",
|
|
27
|
-
"dependencies": {
|
|
28
|
-
"serve-handler": "^6.1.3"
|
|
29
|
-
}
|
|
30
|
-
}
|