diff options
Diffstat (limited to 'afm-client/app/Backend')
-rw-r--r-- | afm-client/app/Backend/RestApis/AfmMainMockApi.js | 52 | ||||
-rw-r--r-- | afm-client/app/Backend/RestApis/PostMockApi.js | 53 | ||||
-rw-r--r-- | afm-client/app/Backend/RestApis/TokenMockApi.js | 114 | ||||
-rw-r--r-- | afm-client/app/Backend/RestApis/_all.js | 29 | ||||
-rw-r--r-- | afm-client/app/Backend/server.js | 58 |
5 files changed, 306 insertions, 0 deletions
diff --git a/afm-client/app/Backend/RestApis/AfmMainMockApi.js b/afm-client/app/Backend/RestApis/AfmMainMockApi.js new file mode 100644 index 0000000..0d8cd87 --- /dev/null +++ b/afm-client/app/Backend/RestApis/AfmMainMockApi.js @@ -0,0 +1,52 @@ +/* + * Copyright (C) 2015 "IoT.bzh" + * Author "Fulup Ar Foll" + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/* ---------------------------------------------------------------------- + * This module simulate Application Framework Binder + * + * /api/afm-main/runnables // no params + * /api/afm-main/details &id="xxxx" + * /api/afm-main/start &id="xxxx" + * /api/afm-main/terminate &id="xxxx" + * /api/afm-main/stop &id="xxxx" + * /api/afm-main/continue &id="xxxx" + * /api/afm-main/runners &id="xxxx" + * /api/afm-main/state &id="xxxx" + * ----------------------------------------------------------------------*/ + + +function NewApi(handle, prefix) { + var scope=this; // I hate JavaScript + scope.connected=false; + + // Simulate Client Context Session Creation + handle.app.get (prefix +'/runnables', function (req, res) { + var Response= { jtype: "AJB_reply", + request: { "prefix": "afm-main", "api": "runnables", "uuid": "e4ef5e66-xxxx", "token": "123456789-xxxxx", "status": "processed" }, + response: [ + {id: "webapps-rabbit@0.0", version: "0.0.8", name: "Rabbit", description: "Fun grid game where the rabbit finds and eats the carrots dodging the foxes.", shortname: "", author: "Todd Brandt <todd.e.brandt@intel.com>" }, + {id: "webapps-annex@0.0", version: "0.0.10", name: "Annex", description: "Reversi/Othello", shortname: "", author: "Todd Brandt <todd.e.brandt@intel.com>" }, + {id: "webapps-memory-match@1.1", version: "1.1.7", name: "MemoryMatch", description: "Memory match", shortname: "", author: "Todd Brandt <todd.e.brandt@intel.com>" } + ]}; + + res.send(Response); + }); +} + +// Export Class +module.exports = NewApi;
\ No newline at end of file diff --git a/afm-client/app/Backend/RestApis/PostMockApi.js b/afm-client/app/Backend/RestApis/PostMockApi.js new file mode 100644 index 0000000..022f774 --- /dev/null +++ b/afm-client/app/Backend/RestApis/PostMockApi.js @@ -0,0 +1,53 @@ +/* + * Copyright (C) 2015 "IoT.bzh" + * Author "Fulup Ar Foll" + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * References: https://github.com/expressjs/multer + */ + +var fs = require('fs'); +var multer = require('multer'); + +function NewApi(handle, prefix) { + var scope=this; // make sure not to loose object context in async callback + + // defined upload directory and check it's a valid one + var upload = multer({ dest: handle.config.UPLOAD_DIR}); + // WARNING: single('avatar') should match with <upload-image name="avatar"> + handle.app.post(prefix +'/upload-image', upload.single('avatar'), function (req, res) { + + handle.trace (scope, 1, "%s/upload file=%s dest=%s/%s", prefix, req.file.originalname, req.file.destination, req.file.filename); + res.send({"jtype": "TEST_message", "status": "success", "info": "done"}); + }); + + // WARNING: single('music') should match with <upload-audio name="music"> + handle.app.post(prefix +'/upload-music', upload.single('music'), function (req, res) { + + handle.trace (scope, 1, "%s/upload file=%s dest=%s/%s", prefix, req.file.originalname, req.file.destination, req.file.filename); + res.send({"jtype": "TEST_message", "status": "success", "info": "done"}); + }); + + // WARNING: single('appli') should match with <upload-audio name="appli"> + handle.app.post(prefix +'/upload-appli', upload.single('appli'), function (req, res) { + + handle.trace (scope, 1, "%s/upload file=%s dest=%s/%s", prefix, req.file.originalname, req.file.destination, req.file.filename); + res.send({"jtype": "TEST_message", "status": "success", "info": "done"}); + }); + +} + +// Export Class +module.exports = NewApi;
\ No newline at end of file diff --git a/afm-client/app/Backend/RestApis/TokenMockApi.js b/afm-client/app/Backend/RestApis/TokenMockApi.js new file mode 100644 index 0000000..5ef1cfa --- /dev/null +++ b/afm-client/app/Backend/RestApis/TokenMockApi.js @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2015 "IoT.bzh" + * Author "Fulup Ar Foll" + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/* ---------------------------------------------------------------------- + * This module simulate Application Framework Binder + * + * /api/afbs/create + * /api/afbs/check?token=123456789 + * /api/afbs/refresh?token=123456789-xxxxx + * /api/afbs/reset?123456789-xxxxx + * + * Note: this MOCK api does not handle any session login. It only returns + * a fake valid or false message depending on call order. + * Its goal is to get a quick way to check you HTML5 client rendering & behaviour. + * + * When you're happy with you HTML5 client OnePageApp check it with afb-daemon + * ----------------------------------------------------------------------*/ + + +function NewApi(handle, prefix) { + var scope=this; // I hate JavaScript + scope.connected=false; + + // Simulate Client Context Session Creation + handle.app.get(prefix +'/create', function (req, res) { + handle.trace (scope, 1, "%s/create", prefix); + var okResponse= '{ "jtype": "AJB_reply"' + + ', "request": { "prefix": "afbs", "api": "create", "uuid": "e4ef5e66-xxxx", "token": "123456789-xxxxx", "status": "processed" }'+ + ', "response": { "token": "Token was refreshed" }'+ + '}'; + + var fxResponse= '{ "jtype": "AJB_reply" ' + + ', "request": { "prefix": "afbs", "api": "create", "status": "fail", "info": "AFB_SESSION_REFRESH Not Initial Token Chain" }'+ + '}'; + + //if (scope.connected) res.status(401).send(fxResponse); + //else { + res.send(okResponse); + scope.connected=true; + //} + }); + + + // Simulate Client Context Check + handle.app.get(prefix +'/check', function (req, res) { + handle.trace (scope, 1, "%s/check query=%s", prefix, req.query.token); + var okResponse= '{"jtype":"AJB_reply"'+ + ',"request":{"prefix":"afbs","api":"check", "status":"processed"}'+ + ',"response":{"isvalid":true}'+ + '}'; + + var fxResponse= '{"jtype":"AJB_reply",'+ + '"request":{"prefix":"afbs","api":"check","status":"empty","info":"AFB_SESSION_CHECK Not a Valid Active Token"}'+ + '}'; + + if (!scope.connected) res.status(401).send(fxResponse); + else res.send(okResponse); + }); + + // Simulate Client Context Check + handle.app.get(prefix +'/refresh', function (req, res) { + handle.trace (scope, 1, "%s/refresh query=%s", prefix, req.query.token); + var okResponse= '{"jtype":"AJB_reply"'+ + ',"request":{"prefix":"afbs","api":"refresh","uuid": "e4ef5e66-xxxx", "token": "123456789-xxxxx","status":"processed"}'+ + ',"response":{"isvalid":true}'+ + '}'; + + var fxResponse= '{"jtype":"AJB_reply",'+ + '"request":{"prefix":"afbs","api":"refresh","status":"empty","info":"AFB_SESSION_REFRESH Not a Valid Active Token"}'+ + '}'; + + if (!scope.connected) res.status(401).send(fxResponse); + else res.send(okResponse); + }); + + // Simulate Client Context Session Closing + handle.app.get(prefix +'/reset', function (req, res) { + handle.trace (scope, 1, "%s/reset query=%s", prefix, req.query.token); + var okResponse= '{"jtype":"AJB_reply"'+ + ',"request":{"prefix":"afbs","api":"reset","uuid": "e4ef5e66-xxxx","status":"processed"}'+ + ',"response":{"uuid":"b028b883-8b47-4c6d-9c6e-e79b9e2b81b9"}'+ + '}'; + + var fxResponse= '{"jtype":"AJB_reply",'+ + '"request":{"prefix":"afbs","api":"reset","status":"empty","info":"AFB_SESSION_CLOSE Not a Valid Access Token"}'+ + '}'; + + if (!scope.connected) res.status(401).send(fxResponse); + else { + res.send(okResponse); + scope.connected=false; + } + }); + + +} + +// Export Class +module.exports = NewApi;
\ No newline at end of file diff --git a/afm-client/app/Backend/RestApis/_all.js b/afm-client/app/Backend/RestApis/_all.js new file mode 100644 index 0000000..8fab76a --- /dev/null +++ b/afm-client/app/Backend/RestApis/_all.js @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2015 "IoT.bzh" + * Author "Fulup Ar Foll" + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + + +// Include here every application APIs routes modules. +function Initialise (handle) { + + new require ('./TokenMockApi') (handle, config.APIBASE + 'token'); + new require ('./PostMockApi') (handle, config.APIBASE + 'post'); + new require ('./AfmMainMockApi') (handle, config.APIBASE + 'afm-main'); +} + +module.exports = Initialise; + diff --git a/afm-client/app/Backend/server.js b/afm-client/app/Backend/server.js new file mode 100644 index 0000000..11c5486 --- /dev/null +++ b/afm-client/app/Backend/server.js @@ -0,0 +1,58 @@ +var config = require('../etc/_Config'); +var trace = require('../etc/_Trace'); +var RestAPI = require('./RestApis/_all'); +var fs = require('fs'); + +var express = require('express'); +var session = require('express-session'); +var bodyParser = require('body-parser'); +var methodOverride = require('method-override'); + +// instanciate express HTTP server +var app = express(); + +// chose dev or prod rootdir +var staticdir = 'dist.dev'; +if (process.env.MODE) staticdir = process.env.MODE === 'prod' ? 'dist.prod' : 'dist.dev'; +else staticdir = config.MODE === 'prod' ? 'dist.prod' : 'dist.dev'; + +var rootdir = __dirname + '/../../' + staticdir; +if (!fs.existsSync(rootdir)) { + console.log("### HOOPS Rootdir not found rootdir=%s\n", rootdir); + process.exit(); +} + +// get all data/stuff of the body (POST) parameters +app.use(bodyParser.json()); // parse application/json +app.use(methodOverride('X-HTTP-Method-Override')); // override with the X-HTTP-Method-Override header in the request. simulate DELETE/PUT + +// This handle should contain enough for application logic +var serverHandle = { + app : app, // Express server + config: config, + trace: config.DBG_LVL > 0 ? trace : function(){/*empty function */} +}; + +// set the static files location /public/img will be /img for users +app.use(express.static(rootdir)); + +// Load Mock APIs +var apirest = new RestAPI(serverHandle); + +app.get(config.URLBASE, function (req, res) { + console.log ("Angular OPA %s", req.originalUrl); + res.sendfile(config.URLBASE +"index.html", {root: rootdir}); +}); + +// rewrite requested URL to include Angular hashPrompt and set session flag for RestAPI +app.get(config.URLBASE + '*', function(req, res) { + // Warning redirect should be under exact "/opa/#!page" or a redirect to home will be done + var redirect=config.URLBASE + '#!' + req.originalUrl.substring(config.URLBASE.length); + res.redirect(redirect); + console.log ("Redirect to: ", redirect); +}); + + +// start app =============================================== +app.listen(config.EXPRESS_PORT, config.EXPRESS_HOST); +console.log('Server Listening http://%s:%d (rootdir=%s)', config.EXPRESS_HOST, config.EXPRESS_PORT, rootdir);
\ No newline at end of file |