diff --git a/coffee/http_listener.coffee b/coffee/http_listener.coffee
index 9b1815e..d209794 100644
--- a/coffee/http_listener.coffee
+++ b/coffee/http_listener.coffee
@@ -61,19 +61,28 @@ exports.addHandlers = ( fShutDown ) ->
log.print 'HL', 'no session backbone'
# **Accepted requests to paths:**
-
+
+ # GET Requests
+
# - **`GET` to _"/"_:** Static redirect to the _"webpages/public"_ directory
app.use '/', express.static path.resolve __dirname, '..', 'webpages', 'public'
- # - **`POST` to _"/event"_:** Events coming from remote systems are passed to the engine
- app.post '/event', requestHandler.handleEvent
- # - **`GET` to _"/user"_:** User requests are possible for all users with an account
- app.get '/user', requestHandler.handleUser
# - **`GET` to _"/admin"_:** Only admins can issue requests to this handler
app.get '/admin', requestHandler.handleAdmin
+ # - **`GET` to _"/forge\_modules"_:** Webpages that lets the user to create modules
+ app.get '/forge_modules', requestHandler.handleForgeModules
+ # - **`GET` to _"/invoke\_event"_:** Webpage that lets the user invoke events
+ app.get '/invoke_event', requestHandler.handleInvokeEvent
+
+ # POST Requests
+
+ # - **`POST` to _"/event"_:** Events coming from remote systems are passed to the engine
+ app.post '/event', requestHandler.handleEvent
# - **`POST` to _"/login"_:** Credentials will be verified
app.post '/login', requestHandler.handleLogin
# - **`POST` to _"/logout"_:** User will be logged out
app.post '/logout', requestHandler.handleLogout
+ # - **`POST` to _"/user"_:** User requests are possible for all users with an account
+ app.post '/usercommand', requestHandler.handleUserCommand
try
http_port = config.getHttpPort()
if http_port
diff --git a/coffee/request_handler.coffee b/coffee/request_handler.coffee
index e402e59..12e2b0d 100644
--- a/coffee/request_handler.coffee
+++ b/coffee/request_handler.coffee
@@ -29,13 +29,19 @@ qs = require 'querystring'
mustache = require 'mustache'
crypto = require 'crypto-js'
-# Prepare the admin command handlers that are invoked via HTTP requests.
+# Prepare the admin command handlers which are invoked via HTTP requests.
objAdminCmds =
'loadrules': mm.loadRulesFromFS,
'loadaction': mm.loadActionModuleFromFS,
'loadactions': mm.loadActionModulesFromFS,
'loadevent': mm.loadEventModuleFromFS,
'loadevents': mm.loadEventModulesFromFS
+
+# Prepare the user command handlers which are invoked via HTTP requests.
+objUserCmds =
+ 'store_action': mm.storeActionModule
+ 'store_event': mm.storeEventModule
+ 'store_rule': mm.storeRule
exports = module.exports = ( args ) ->
@@ -79,7 +85,7 @@ exports.handleEvent = ( req, resp ) =>
obj = qs.parse body
# If required event properties are present we process the event #
if obj and obj.event and obj.eventid
- resp.send 'Thank you for the event (' + obj.event + '[' + obj.eventid + '])!'
+ resp.send 'Thank you for the event: ' + obj.event + ' (' + obj.eventid + ')!'
db.pushEvent obj
else
resp.writeHead 400, { "Content-Type": "text/plain" }
@@ -152,6 +158,41 @@ getHandlerFileAsString = ( name ) ->
fs.readFileSync getHandlerPath( name ), 'utf8'
###
+Renders a page depending on the user session and returns it.
+
+@private renderPage( *name, sess* )
+@param {String} name
+@param {Object} sess
+###
+renderPage = ( name, sess ) ->
+ template = getHandlerFileAsString name
+ menubar = getHandlerFileAsString 'menubar'
+ view =
+ user: sess.user,
+ div_menubar: menubar
+ mustache.render template, view
+
+###
+Sends the desired page or the login to the user.
+
+*Requires
+the [request](http://nodejs.org/api/http.html#http_class_http_clientrequest)
+and [response](http://nodejs.org/api/http.html#http_class_http_serverresponse)
+objects.*
+
+@public renderPageOrLogin( *req, resp, pagename* )
+@param {String} pagename
+###
+sendLoginOrPage = ( pagename, req, resp ) ->
+ if req.session and req.session.user
+ resp.send renderPage pagename, req.session
+ else
+ resp.sendfile getHandlerPath 'login'
+
+
+###
+Handles the user command requests.
+
*Requires
the [request](http://nodejs.org/api/http.html#http_class_http_clientrequest)
and [response](http://nodejs.org/api/http.html#http_class_http_serverresponse)
@@ -159,19 +200,50 @@ objects.*
@public handleUser( *req, resp* )
###
-exports.handleUser = ( req, resp ) ->
- if req.session and req.session.user
- welcome = getHandlerFileAsString 'welcome'
- menubar = getHandlerFileAsString 'menubar'
- view = {
- user: req.session.user,
- div_menubar: menubar
- }
- resp.send mustache.render welcome, view
+exports.handleUserCommand = ( req, resp ) ->
+ if not req.session or not req.session.user
+ resp.send 401, 'Login first!'
else
- resp.sendfile getHandlerPath 'login'
+ body = ''
+ req.on 'data', ( data ) ->
+ body += data
+ req.on 'end', ->
+ obj = qs.parse body
+ if objUserCmds[obj.command] is 'function'
+ resp.send 'Command accepted!'
+ objUserCmds[obj.command] req.session.user, obj
+ else
+ resp.send 404, 'Command unknown!'
###
+Present the module forge to the user.
+
+*Requires
+the [request](http://nodejs.org/api/http.html#http_class_http_clientrequest)
+and [response](http://nodejs.org/api/http.html#http_class_http_serverresponse)
+objects.*
+
+@public handleForgeModules( *req, resp* )
+###
+exports.handleForgeModules = ( req, resp ) ->
+ sendLoginOrPage 'forge_modules', req, resp
+
+###
+Present the event invoke page to the user.
+
+*Requires
+the [request](http://nodejs.org/api/http.html#http_class_http_clientrequest)
+and [response](http://nodejs.org/api/http.html#http_class_http_serverresponse)
+objects.*
+
+@public handleInvokeEvent( *req, resp* )
+###
+exports.handleInvokeEvent = ( req, resp ) ->
+ sendLoginOrPage 'push_event', req, resp
+
+
+###
+Handles the admin command requests.
*Requires
the [request](http://nodejs.org/api/http.html#http_class_http_clientrequest)
@@ -183,19 +255,9 @@ objects.*
exports.handleAdmin = ( req, resp ) ->
if req.session and req.session.user
if req.session.user.isAdmin is "true"
- welcome = getHandlerFileAsString 'welcome'
- menubar = getHandlerFileAsString 'menubar'
- view =
- user: req.session.user,
- div_menubar: menubar
- resp.send mustache.render welcome, view
+ resp.send renderPage 'welcome', req.session
else
- unauthorized = getHandlerFileAsString 'unauthorized'
- menubar = getHandlerFileAsString 'menubar'
- view =
- user: req.session.user,
- div_menubar: menubar
- resp.send mustache.render unauthorized, view
+ resp.send renderPage 'unauthorized', req.session
else
resp.sendfile getHandlerPath 'login'
diff --git a/js-coffee/engine.js b/js-coffee/engine.js
index c556a41..7e48da8 100644
--- a/js-coffee/engine.js
+++ b/js-coffee/engine.js
@@ -29,8 +29,6 @@ exports = module.exports = function(args) {
*/
exports.addDBLinkAndLoadActionsAndRules = function(db_link) {
db = db_link;
- if(!db) log.error('EN', 'No DB!');
- console.log(db);
if(ml && db) db.getActionModules(function(err, obj) {
if(err) log.error('EN', 'retrieving Action Modules from DB!');
else {
@@ -109,10 +107,6 @@ function pollQueue() {
}
setTimeout(pollQueue, 50); //TODO adapt to load
});
- // var evt = qEvents.dequeue();
- // if(evt) {
- // processEvent(evt);
- // }
}
}
@@ -173,6 +167,7 @@ function invokeAction(evt, action) {
var srvc = listActionModules[arrModule[0]];
if(srvc && srvc[arrModule[1]]) {
//FIXME preprocessing not only on data
+ //FIXME no preprocessing at all, why don't we just pass the whole event to the action?'
preprocessActionArguments(evt.payload, action.arguments, actionargs);
try {
if(srvc[arrModule[1]]) srvc[arrModule[1]](actionargs);
diff --git a/js-coffee/http_listener.js b/js-coffee/http_listener.js
index df63510..3399afa 100644
--- a/js-coffee/http_listener.js
+++ b/js-coffee/http_listener.js
@@ -57,11 +57,13 @@ HTTP Listener
}));
log.print('HL', 'no session backbone');
app.use('/', express["static"](path.resolve(__dirname, '..', 'webpages', 'public')));
- app.post('/event', requestHandler.handleEvent);
- app.get('/user', requestHandler.handleUser);
app.get('/admin', requestHandler.handleAdmin);
+ app.get('/forge_modules', requestHandler.handleForgeModules);
+ app.get('/invoke_event', requestHandler.handleInvokeEvent);
+ app.post('/event', requestHandler.handleEvent);
app.post('/login', requestHandler.handleLogin);
app.post('/logout', requestHandler.handleLogout);
+ app.post('/usercommand', requestHandler.handleUserCommand);
try {
http_port = config.getHttpPort();
if (http_port) {
diff --git a/js-coffee/module_manager.js b/js-coffee/module_manager.js
index ecac592..bf46969 100644
--- a/js-coffee/module_manager.js
+++ b/js-coffee/module_manager.js
@@ -27,6 +27,24 @@ exports.addDBLink = function(db_link) {
// funcLoadRule = fLoadRule;
};
+exports.storeEventModule = function (user, obj) {
+ log.print('MM', 'implement storeEventModule');
+};
+
+exports.storeActionModule = function (user, obj) {
+ log.print('MM', 'implement storeActionModule');
+};
+
+exports.storeRule = function (user, obj) {
+ log.print('MM', 'implement storeRule');
+};
+
+
+/*
+ * Legacy file system loaders
+ */
+
+
/*
* Load Rules from fs
* ------------------
diff --git a/js-coffee/request_handler.js b/js-coffee/request_handler.js
index 55cbb83..6d542f5 100644
--- a/js-coffee/request_handler.js
+++ b/js-coffee/request_handler.js
@@ -8,7 +8,7 @@ Request Handler
(function() {
- var crypto, db, exports, fAdminCommands, fs, getHandlerFileAsString, getHandlerPath, log, mm, mustache, objAdminCmds, onAdminCommand, path, qs,
+ var crypto, db, exports, fAdminCommands, fs, getHandlerFileAsString, getHandlerPath, log, mm, mustache, objAdminCmds, objUserCmds, onAdminCommand, path, qs, renderPage, sendLoginOrPage,
_this = this;
log = require('./logging');
@@ -35,6 +35,12 @@ Request Handler
'loadevents': mm.loadEventModulesFromFS
};
+ objUserCmds = {
+ 'store_action': mm.storeActionModule,
+ 'store_event': mm.storeEventModule,
+ 'store_rule': mm.storeRule
+ };
+
exports = module.exports = function(args) {
var user, users, _i, _len;
args = args != null ? args : {};
@@ -87,7 +93,7 @@ Request Handler
var obj;
obj = qs.parse(body);
if (obj && obj.event && obj.eventid) {
- resp.send('Thank you for the event (' + obj.event + '[' + obj.eventid + '])!');
+ resp.send('Thank you for the event: ' + obj.event + ' (' + obj.eventid + ')!');
return db.pushEvent(obj);
} else {
resp.writeHead(400, {
@@ -182,6 +188,49 @@ Request Handler
};
/*
+ Renders a page depending on the user session and returns it.
+
+ @private renderPage( *name, sess* )
+ @param {String} name
+ @param {Object} sess
+ */
+
+
+ renderPage = function(name, sess) {
+ var menubar, template, view;
+ template = getHandlerFileAsString(name);
+ menubar = getHandlerFileAsString('menubar');
+ view = {
+ user: sess.user,
+ div_menubar: menubar
+ };
+ return mustache.render(template, view);
+ };
+
+ /*
+ Sends the desired page or the login to the user.
+
+ *Requires
+ the [request](http://nodejs.org/api/http.html#http_class_http_clientrequest)
+ and [response](http://nodejs.org/api/http.html#http_class_http_serverresponse)
+ objects.*
+
+ @public renderPageOrLogin( *req, resp, pagename* )
+ @param {String} pagename
+ */
+
+
+ sendLoginOrPage = function(pagename, req, resp) {
+ if (req.session && req.session.user) {
+ return resp.send(renderPage(pagename, req.session));
+ } else {
+ return resp.sendfile(getHandlerPath('login'));
+ }
+ };
+
+ /*
+ Handles the user command requests.
+
*Requires
the [request](http://nodejs.org/api/http.html#http_class_http_clientrequest)
and [response](http://nodejs.org/api/http.html#http_class_http_serverresponse)
@@ -191,22 +240,62 @@ Request Handler
*/
- exports.handleUser = function(req, resp) {
- var menubar, view, welcome;
- if (req.session && req.session.user) {
- welcome = getHandlerFileAsString('welcome');
- menubar = getHandlerFileAsString('menubar');
- view = {
- user: req.session.user,
- div_menubar: menubar
- };
- return resp.send(mustache.render(welcome, view));
+ exports.handleUserCommand = function(req, resp) {
+ var body;
+ if (!req.session || !req.session.user) {
+ return resp.send(401, 'Login first!');
} else {
- return resp.sendfile(getHandlerPath('login'));
+ body = '';
+ req.on('data', function(data) {
+ return body += data;
+ });
+ return req.on('end', function() {
+ var obj;
+ obj = qs.parse(body);
+ if (objUserCmds[obj.command] === 'function') {
+ resp.send('Command accepted!');
+ return objUserCmds[obj.command](req.session.user, obj);
+ } else {
+ return resp.send(404, 'Command unknown!');
+ }
+ });
}
};
/*
+ Present the module forge to the user.
+
+ *Requires
+ the [request](http://nodejs.org/api/http.html#http_class_http_clientrequest)
+ and [response](http://nodejs.org/api/http.html#http_class_http_serverresponse)
+ objects.*
+
+ @public handleForgeModules( *req, resp* )
+ */
+
+
+ exports.handleForgeModules = function(req, resp) {
+ return sendLoginOrPage('forge_modules', req, resp);
+ };
+
+ /*
+ Present the event invoke page to the user.
+
+ *Requires
+ the [request](http://nodejs.org/api/http.html#http_class_http_clientrequest)
+ and [response](http://nodejs.org/api/http.html#http_class_http_serverresponse)
+ objects.*
+
+ @public handleInvokeEvent( *req, resp* )
+ */
+
+
+ exports.handleInvokeEvent = function(req, resp) {
+ return sendLoginOrPage('push_event', req, resp);
+ };
+
+ /*
+ Handles the admin command requests.
*Requires
the [request](http://nodejs.org/api/http.html#http_class_http_clientrequest)
@@ -218,24 +307,11 @@ Request Handler
exports.handleAdmin = function(req, resp) {
- var menubar, unauthorized, view, welcome;
if (req.session && req.session.user) {
if (req.session.user.isAdmin === "true") {
- welcome = getHandlerFileAsString('welcome');
- menubar = getHandlerFileAsString('menubar');
- view = {
- user: req.session.user,
- div_menubar: menubar
- };
- return resp.send(mustache.render(welcome, view));
+ return resp.send(renderPage('welcome', req.session));
} else {
- unauthorized = getHandlerFileAsString('unauthorized');
- menubar = getHandlerFileAsString('menubar');
- view = {
- user: req.session.user,
- div_menubar: menubar
- };
- return resp.send(mustache.render(unauthorized, view));
+ return resp.send(renderPage('unauthorized', req.session));
}
} else {
return resp.sendfile(getHandlerPath('login'));
diff --git a/webpages/handlers/command_answer.html b/webpages/handlers/command_answer.html
index eccef13..42a06ba 100644
--- a/webpages/handlers/command_answer.html
+++ b/webpages/handlers/command_answer.html
@@ -8,7 +8,7 @@
{{{div_menubar}}}
-
{{user.username}} unauthorized!
+
Hi {{user.username}}, that was unauthorized!
Sorry this roles is missing for you.
You only have these privileges: {{user.roles}}
diff --git a/webpages/handlers/forge_modules.html b/webpages/handlers/forge_modules.html
new file mode 100644
index 0000000..387268b
--- /dev/null
+++ b/webpages/handlers/forge_modules.html
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/webpages/public/push_event.html b/webpages/handlers/push_event.html
similarity index 81%
rename from webpages/public/push_event.html
rename to webpages/handlers/push_event.html
index e91eeef..66fae33 100644
--- a/webpages/public/push_event.html
+++ b/webpages/handlers/push_event.html
@@ -6,8 +6,9 @@
+ {{{div_menubar}}}
Sorry this roles is missing for you.
You only have these privileges: {{user.roles}}
diff --git a/webpages/handlers/welcome.html b/webpages/handlers/welcome.html
index ef796aa..7a205b4 100644
--- a/webpages/handlers/welcome.html
+++ b/webpages/handlers/welcome.html
@@ -1,14 +1,14 @@