summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFulup Ar Foll <fulup@iot.bzh>2016-05-29 15:50:40 +0200
committerFulup Ar Foll <fulup@iot.bzh>2016-05-29 15:50:40 +0200
commit96190f9cd583d9182c692c88d3342109bad81157 (patch)
tree5d5b098e64c14b7be1da47961ed6600ce355020b
parent922b183f441a6e68b55592596fa62cc6e1814f74 (diff)
Clean up to prepare new version of API
-rw-r--r--afm-client/README.md41
-rw-r--r--afm-client/app/Backend/RestApis/AfmMainMockApi.js97
-rw-r--r--afm-client/app/Backend/RestApis/PostMockApi.js53
-rw-r--r--afm-client/app/Backend/RestApis/TokenMockApi.js114
-rw-r--r--afm-client/app/Backend/RestApis/_all.js29
-rw-r--r--afm-client/app/Backend/server.js58
-rw-r--r--afm-client/app/Frontend/etc/AppConfig.js35
-rw-r--r--afm-client/app/Frontend/pages/Dashboard/DashboardModule.js26
-rw-r--r--afm-client/app/Frontend/widgets/ActionButtons/AppliButton.js40
-rw-r--r--afm-client/app/Frontend/widgets/Notifications/TokenRefreshSvc.js69
-rw-r--r--afm-client/bower_components/angular/angular.js2
-rw-r--r--afm-client/gulpfile.js51
12 files changed, 126 insertions, 489 deletions
diff --git a/afm-client/README.md b/afm-client/README.md
index 0ed9d45..3bb94a2 100644
--- a/afm-client/README.md
+++ b/afm-client/README.md
@@ -1,3 +1,8 @@
+### Sample client application for Application Framework Binder
+
+![AFB-Client screenshot](http://iot.bzh/images/afm-client.jpg)
+
+_(Application Framework Binder can be found on https://github.com/iotbzh/afb-daemon)_
## Installation
@@ -14,57 +19,54 @@ Install HTML5 development toolchain on your host
npm install # this install all development tool chain dependencies
sudo npm install --global gulp # this is not mandatory but it will make your live simpler
- 4. For livereload functionality [automatic refresh of HTML/CSS]
- install [livereload Chrome extension](https://chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei)
-
### Overload ./app/etc/AppDefaults.js with '.noderc.js'
var config= {
APPNAME : 'AFBclient', // AppName is use as main Angular Module name
FRONTEND: "Frontend", // HTML5 frontend [no leading ./]
- BACKEND : "Backend", // NodeJS Rest API [no leading ./]
URLBASE : '/opa/', // HTML basedir when running in production [should end with a /]
APIBASE : '/api/', // Api url base dir [should end with a /]
- DEBUG : 5003, // Node Debug Port [for mock API debug only]
- DBG_LVL : 5, // Debug Trace Level 0=no trace.
};
module.exports = config;
- WARNING: in current version Frontend/services/AppConfig.js is not updated automatically
- you should make sure than your backend config fit with your frontend config.
- Note: FCS version should have AppConfig.js configurated automatically from GULP, but this is for "tomorrow"
+ WARNING: in current development version Frontend/services/AppConfig.js is not updated automatically
+ you should manually assert that backend config is in sync with frontend config.
### Build project
gulp help
gulp build-app-dev
- gulp watch-dev
- http://localhost:4003/opa /* debug mock api base on Backend/RestApi */
+ rsync -az dist.dev xxxx@agl-target:afm-client
-### Test with Application server binder
+### Test with Application
# Start AppFramework Binder
export MYWORKSPACE=$HOME/Workspace
$MYWORKSPACE/afb-daemon/build/afb-daemon --port=1234 --verbose --token=123456789 --rootdir=$MYWORKSPACE/afm-client/dist.dev
- Point your browser onto: http://localhost:1234/opa
+ Point your browser onto: http://agl-target:1234/opa
Note:
- do not forget '/opa' that should match with your config.URLBASE
- if you change --token=xxxx do not forget to update ./Frontend/pages/HomeModules.js
- Force HTML/OPA reload with F5 after each HTML5/OPA update or new pages may not be loaded.
- - When reloading HTML/OPA with F5 do not forget that your initial token wont be accepted anymore. You should either restart to clean existing session or cleanup afb-session cookie.
+ - When reloading HTML/OPA with F5 do not forget that your initial token wont be accepted anymore. You should either:
+ + restart to clean existing session
+ + cleanup AJB_session cookie
+ + start an anonymous web page to get a fresh and clean environment.
### Move to Target
cd $MYWORKSPACE/afm-client
gulp build-app-prod
- scp -r ./dist.prod/* user@mytarget:/rootdir/apfDaemon
+ scp -r ./dist.prod/* user@mytarget:/rootdir/afm-client
+ ssh user@mytarget "afb-daemon --port=3001 --token='' --rootdir=/rootdir/afm-client"
+ http://mytarget:3001/opa
+### Directory structure
/AppClient
|
|---- package.json
|---- bower.json
|---- gulpfile.js
- |---- .noderc.js [Warning: contains private keys should not uploaded in Github]
|
|---- /Frontend
| |
@@ -86,13 +88,6 @@ Install HTML5 development toolchain on your host
| |...
|
|
- |---- /Backend
- | |-- server.js // launcher
- | |----/ models // mogoose database schemas
- | |----/ providers // authentication services
- | |----/ restapis // application APIs
- |
|---- (/dist.dev)
|---- (/dist.prod)
-
diff --git a/afm-client/app/Backend/RestApis/AfmMainMockApi.js b/afm-client/app/Backend/RestApis/AfmMainMockApi.js
deleted file mode 100644
index 9469eef..0000000
--- a/afm-client/app/Backend/RestApis/AfmMainMockApi.js
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * 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 &runid="xxxx"
- * /api/afm-main/stop &runid="xxxx"
- * /api/afm-main/continue &runid="xxxx"
- * /api/afm-main/runners // no params
- * /api/afm-main/state &runid="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: "afb-reply",
- request: { "prefix": "afm-main", "api": "runnables", "uuid": "e4ef5e66-xxxx", "token": "123456789-xxxxx", "status": "processed" },
- response: {runnables: [
- {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>" }
- ]}};
-
- /* "jtype":"afb-reply","request":{"prefix":"afm-main","api":"runnables","status":"processed"},"response":{"runnables":[{"id":"webapps-annex@0.0","version":"0.0.10","width":0,"height":0,"name":"Annex","description":"Reversi/Othello","shortname":"","author":"Todd Brandt <todd.e.brandt@intel.com>"},{"id":"webapps-rabbit@0.0","version":"0.0.8","width":0,"height":0,"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>"}]}}*/
-
- res.send(Response);
- });
-
- handle.app.get (prefix +'/detail', function (req, res) {
- var apps = {
- "webapps-rabbit@0.0": {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>" },
- "webapps-annex@0.0": {id: "webapps-annex@0.0", version: "0.0.10", name: "Annex", description: "Reversi/Othello", shortname: "", author: "Todd Brandt <todd.e.brandt@intel.com>" },
- "webapps-memory-match@1.1": {id: "webapps-memory-match@1.1", version: "1.1.7", name: "MemoryMatch", description: "Memory match", shortname: "", author: "Todd Brandt <todd.e.brandt@intel.com>" }
- };
-
- var Response= { jtype: "afb-reply",
- request: { "prefix": "afm-main", "api": "detail", "uuid": "e4ef5e66-xxxx", "token": "123456789-xxxxx", "status": "processed" },
- response: apps[req.query.id]
- };
-
- /* "jtype":"afb-reply","request":{"prefix":"afm-main","api":"runnables","status":"processed"},"response":{"runnables":[{"id":"webapps-annex@0.0","version":"0.0.10","width":0,"height":0,"name":"Annex","description":"Reversi/Othello","shortname":"","author":"Todd Brandt <todd.e.brandt@intel.com>"},{"id":"webapps-rabbit@0.0","version":"0.0.8","width":0,"height":0,"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>"}]}}*/
-
- res.send(Response);
- });
-
- handle.app.get (prefix +'/start', function (req, res) {
- var apps = { "runid": 2, "uri": "/opa/images/avatars/tux-bzh.png"};
-
- var Response= { jtype: "afb-reply",
- request: { "prefix": "afm-main", "api": "start", "uuid": "e4ef5e66-xxxx", "token": "123456789-xxxxx", "status": "processed" },
- response: apps
- };
-
- /* "jtype":"afb-reply","request":{"prefix":"afm-main","api":"runnables","status":"processed"},"response":{"runnables":[{"id":"webapps-annex@0.0","version":"0.0.10","width":0,"height":0,"name":"Annex","description":"Reversi/Othello","shortname":"","author":"Todd Brandt <todd.e.brandt@intel.com>"},{"id":"webapps-rabbit@0.0","version":"0.0.8","width":0,"height":0,"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>"}]}}*/
-
- res.send(Response);
- });
-
- handle.app.get (prefix +'/terminate', function (req, res) {
- var apps = {};
-
- var Response= { jtype: "afb-reply",
- request: { "prefix": "afm-main", "api": "terminate", "uuid": "e4ef5e66-xxxx", "token": "123456789-xxxxx", "status": "processed" },
- response: apps
- };
-
- /* "jtype":"afb-reply","request":{"prefix":"afm-main","api":"runnables","status":"processed"},"response":{"runnables":[{"id":"webapps-annex@0.0","version":"0.0.10","width":0,"height":0,"name":"Annex","description":"Reversi/Othello","shortname":"","author":"Todd Brandt <todd.e.brandt@intel.com>"},{"id":"webapps-rabbit@0.0","version":"0.0.8","width":0,"height":0,"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>"}]}}*/
-
- 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
deleted file mode 100644
index 7bc71f7..0000000
--- a/afm-client/app/Backend/RestApis/PostMockApi.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.any(), function (req, res) {
-
- handle.trace (scope, 1, "%s/upload file=%s dest=%s/%s", prefix, req.files[0].originalname, req.files[0].destination, req.files[0].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.any(), function (req, res) {
-
- handle.trace (scope, 1, "%s/upload file=%s dest=%s/%s", prefix, req.files[0].originalname, req.files[0].destination, req.files[0].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.any(), function (req, res) {
-
- handle.trace (scope, 1, "%s/upload file=%s dest=%s/%s", prefix, req.files[0].originalname, req.files[0].destination, req.files[0].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
deleted file mode 100644
index 073f1df..0000000
--- a/afm-client/app/Backend/RestApis/TokenMockApi.js
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * 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": "afb-reply"' +
- ', "request": { "prefix": "afbs", "api": "create", "uuid": "e4ef5e66-xxxx", "token": "123456789-xxxxx", "status": "processed" }'+
- ', "response": { "token": "Token was refreshed" }'+
- '}';
-
- var fxResponse= '{ "jtype": "afb-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":"afb-reply"'+
- ',"request":{"prefix":"afbs","api":"check", "status":"processed"}'+
- ',"response":{"isvalid":true}'+
- '}';
-
- var fxResponse= '{"jtype":"afb-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":"afb-reply"'+
- ',"request":{"prefix":"afbs","api":"refresh","uuid": "e4ef5e66-xxxx", "token": "123456789-xxxxx","status":"processed"}'+
- ',"response":{"isvalid":true}'+
- '}';
-
- var fxResponse= '{"jtype":"afb-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":"afb-reply"'+
- ',"request":{"prefix":"afbs","api":"reset","uuid": "e4ef5e66-xxxx","status":"processed"}'+
- ',"response":{"uuid":"b028b883-8b47-4c6d-9c6e-e79b9e2b81b9"}'+
- '}';
-
- var fxResponse= '{"jtype":"afb-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
deleted file mode 100644
index 8fab76a..0000000
--- a/afm-client/app/Backend/RestApis/_all.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 11c5486..0000000
--- a/afm-client/app/Backend/server.js
+++ /dev/null
@@ -1,58 +0,0 @@
-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
diff --git a/afm-client/app/Frontend/etc/AppConfig.js b/afm-client/app/Frontend/etc/AppConfig.js
index be5a107..d24a626 100644
--- a/afm-client/app/Frontend/etc/AppConfig.js
+++ b/afm-client/app/Frontend/etc/AppConfig.js
@@ -31,17 +31,40 @@
return myConfig;
})
- // Factory is a singleton and share its context within all instances.
+ // Factory is a singleton and share its context within all instances.
.factory('AppCall', function ($http, AppConfig, $log) {
+
var myCalls = {
- get : function(plugin, action, query, callback) {
+ get : function(plugin, action, query, cbresponse, cberror) {
+
+ var onerror = function(response) {
+ if (cberror) cberror(response.data, response.status, response.config);
+ else cbresponse(response.data, response.status, response.config);
+ };
+
+ var onsuccess =function(response) {
+ if (!response.data || !response.data.request) {
+ onerror (response);
+ return;
+ }
+
+ var request=response.data.request;
+
+ // if token was updated keep it within application cache
+ if (request.token) AppConfig.session.token = request.token;
+ if (request.uuid) AppConfig.session.uuid = request.uuid;
+ if (request.timeout) AppConfig.session.timeout = request.timeout;
+
+ cbresponse(response.data, response.status, response.config);
+ };
+
+
if (!query.token) query.token = AppConfig.session.token; // add token to provided query
- $http.get('/api/' + plugin + '/' + action , {params: query}).then (callback, callback);
+ if (!query.reqid) query.reqid = action; // use action as default requestID
+ var handle= $http.get('/api/' + plugin + '/' + action , {params: query}).then(onsuccess, onerror);
+
}
-
};
return myCalls;
});
-
-
})();
diff --git a/afm-client/app/Frontend/pages/Dashboard/DashboardModule.js b/afm-client/app/Frontend/pages/Dashboard/DashboardModule.js
index dff21ed..3bde5a9 100644
--- a/afm-client/app/Frontend/pages/Dashboard/DashboardModule.js
+++ b/afm-client/app/Frontend/pages/Dashboard/DashboardModule.js
@@ -29,27 +29,29 @@ angular.module('DashboardModule', ['SubmitButton', 'TokenRefresh', 'AppliButton'
scope.GetRunnables = function() {
console.log ("Dashboard GetRunnables");
- AppCall.get ("afm-main", "runnables", {/*query*/}, function(response) {
+ AppCall.get ("afm-main", "runnables", {/*query*/}, function(jresp, errcode) {
// update debug UI zone
scope.request = "/api/afm-main/runnable";
- scope.response = response.data;
- scope.errcode = response.status;
-
- if (response.status !== 200) {
- console.log ("Hoop GetRunnable failed");
- return;
- }
-
- // Check this is a valid response from Binder
- if (response.data.jtype != "afb-reply") {
+ scope.response = jresp.response;
+ scope.errcode = jresp.request.status;
+
+ // Check if this is a response from AGL application framework binder
+ if (jresp.jtype !== "afb-reply") {
Notification.error ({message: "Invalid Respond to /opa/afm-main/runnable response.data="+response.data, delay: 5000});
return;
}
+
+ // Check for success
+ if (jresp.request.status !== "success") {
+ Notification.error ({message: "afm-main/runnable" + jresp.request.info, delay: 5000});
+ return;
+ }
+
// loop on runnable application to prepare for display
var appliIDs=[];
- var runnables = response.data.response.runnables;
+ var runnables = jresp.response.runnables;
for (var idx=0; idx < runnables.length; idx ++) {
appliIDs[idx] = runnables [idx].id;
scope.appliStore [runnables [idx].id] = runnables [idx];
diff --git a/afm-client/app/Frontend/widgets/ActionButtons/AppliButton.js b/afm-client/app/Frontend/widgets/ActionButtons/AppliButton.js
index 269ee81..a10030c 100644
--- a/afm-client/app/Frontend/widgets/ActionButtons/AppliButton.js
+++ b/afm-client/app/Frontend/widgets/ActionButtons/AppliButton.js
@@ -57,17 +57,17 @@
scope.runmode = urlquery.runmode || "auto";
scope.clicked = function () {
- var notifyError = function(action, response) {
+ var notifyError = function(action, jresp) {
Notification.error ({message: "Fail /api/afm-main" + action + "=" + scope.label + " RunID="+ scope.appID, delay: 5000});
elem.addClass ("fail");
elem.removeClass ("success");
- scope.callback (scope.appID, action, response);
+ scope.callback (scope.appID, action, jresp);
};
- var notifySuccess = function (action, response) {
+ var notifySuccess = function (action, jresp) {
elem.removeClass ("fail");
- scope.runID = response.data.response.runid;
- scope.callback (scope.appID, action, response);
+ scope.runID = jresp.response.runid;
+ scope.callback (scope.appID, action, jresp);
};
var closeModApp = function() {
@@ -86,13 +86,13 @@
case "start":
if (scope.runstatus !== "stop") return;
- AppCall.get ("afm-main", "start", {id: scope.appID, mode: scope.runmode}, function(response) {
- if (response.status !== 200 || response.data.jtype !== "afb-reply") {
- notifyError ("start", response);
+ AppCall.get ("afm-main", "start", {id: scope.appID, mode: scope.runmode}, function(jresp, errcode) {
+ if (errcode !== 200 || jresp.jtype !== "afb-reply") {
+ notifyError ("start", jresp);
return;
}
scope.runstatus="start";
- notifySuccess (action, response);
+ notifySuccess (action, jresp);
if(response.data.response.uri)
scope.winapp= $window.open(response.data.response.uri.replace("%h", $location.host()));
});
@@ -101,9 +101,9 @@
case "stop":
if (scope.runstatus !== "start") return;
- AppCall.get ("afm-main", "terminate", {runid: scope.runID}, function(response) {
- if (response.status !== 200 || response.data.jtype !== "afb-reply") {
- notifyError ("stop", response);
+ AppCall.get ("afm-main", "terminate", {runid: scope.runID}, function(jresp, errcode) {
+ if (errcode !== 200 || jresp.jtype !== "afb-reply") {
+ notifyError ("stop", jresp);
return;
}
scope.runstatus="stop";
@@ -114,14 +114,14 @@
scope.winapp.close();
scope.winapp=false;
}
- notifySuccess (action, response);
+ notifySuccess (action, jresp);
});
break;
case "info":
- AppCall.get ("afm-main", "detail", {id: scope.appID}, function(response) {
- if (response.status !== 200 || response.data.jtype !== "afb-reply") {
- notifyError ("detail", response);
+ AppCall.get ("afm-main", "detail", {id: scope.appID}, function(jresp, errcode) {
+ if (errcode !== 200 || jresp.jtype !== "afb-reply") {
+ notifyError ("detail", jresp);
return;
}
@@ -144,13 +144,13 @@
case "uninstall":
if (scope.runstatus !== "stop") return;
- AppCall.get ("afm-main", "uninstall", {id: scope.appID}, function(response) {
- if (response.status !== 200 || response.data.jtype !== "afb-reply") {
- notifyError ("uninstall", response);
+ AppCall.get ("afm-main", "uninstall", {id: scope.appID}, function(jresp, errcode) {
+ if (errcode !== 200 || jresp.jtype !== "afb-reply") {
+ notifyError ("uninstall", jresp);
return;
}
- notifySuccess (action, response);
+ notifySuccess (action, jresp);
});
break;
diff --git a/afm-client/app/Frontend/widgets/Notifications/TokenRefreshSvc.js b/afm-client/app/Frontend/widgets/Notifications/TokenRefreshSvc.js
index 4d7aed6..3ddd270 100644
--- a/afm-client/app/Frontend/widgets/Notifications/TokenRefreshSvc.js
+++ b/afm-client/app/Frontend/widgets/Notifications/TokenRefreshSvc.js
@@ -25,7 +25,7 @@
'use strict';
var template =
- '<div class="afb-monitor" ng-click="getping()">' +
+ '<div class="afb-monitor" ng-click="getping()">' +
'<span class="afb-refresh-token" >afb://{{hostname}}:{{httpdport}}</span>' +
'<i class="{{icon}}"></i>' +
'</div>';
@@ -65,60 +65,74 @@ angular.module('TokenRefresh', ['AppConfig', 'ModalNotification'])
scope.status = 0;
};
- scope.onsuccess = function(jresp) {
- if (jresp.request.token) AppConfig.session.token = jresp.request.token;
- if (jresp.request.uuid) AppConfig.session.uuid = jresp.request.uuid;
- if (jresp.request.timeout) AppConfig.session.timeout = jresp.request.timeout;
+ scope.onsuccess = function(jresp, errcode) {
+
+ if (errcode !== 200 || jresp.request.status !== "success") {
+ Notification.warning ({message: "auto-connect :" + jresp.request.info, delay: 10000});
+ scope.offline();
+ return false;
+ }
if (scope.logged !== true) {
- Notification.success ({message: "AppFramework Binder Back to Live", delay: 3000});
+ Notification.success ({message: "AppFramework Binder Connected", delay: 3000});
scope.online();
if (scope.callback) scope.callback(jresp);
}
- scope.status = 1;
+
+ scope.status = 1;
+ return true;
};
// Check Binder status
scope.getping = function() {
- AppCall.get ("token", "ping", {/*query*/},function(result) {
- if (result.status === 200) scope.onsuccess (result.data);
- else scope.onerror();
+ AppCall.get (scope.plugin, "ping", {/*query*/},function(jresp, errcode) {
+ if (errcode !== 200 || jresp.request.status !== "success") {
+ Notification.warning ({message: jresp.request.info, delay: 5000});
+ scope.offline();
+ return;
+ }
// restart a new timer for next ping
$timeout (scope.getping, AppConfig.session.pingrate*1000);
- });
+ }, scope.onerror);
};
// Check Binder status
scope.refresh = function() {
- AppCall.get ("token", "refresh", {/*query*/},function(result) {
- if (result.status === 200) scope.onsuccess (result.data);
- else scope.onerror();
+ AppCall.get (scope.plugin, "refresh", {/*query*/}, function(jresp, errcode) {
+
+ scope.onsuccess (jresp, errcode);
+
// restart a new timer for next refresh
$timeout (scope.refresh, AppConfig.session.timeout *250);
- });
+ }, scope.onerror);
};
// Initial connection
- scope.tkcreate = function() {
-
- AppCall.get ("token", "create", {token: AppConfig.session.initial},function(result) {
- if (result.status === 200) scope.onsuccess (result.data);
- else scope.onerror();
- });
- };
+ scope.loggin = function() {
+ AppCall.get (scope.plugin, "connect", {token: AppConfig.session.initial}, function(jresp, errcode) {
+
+ if (!scope.onsuccess (jresp, errcode)) return;
+
+ // Intial token was accepted let's start ping & refresh
+ $timeout (scope.getping, AppConfig.session.pingrate*1000);
+ $timeout (scope.refresh, AppConfig.session.timeout *250);
+ }, scope.onerror);
+ };
+
+
+ // Parse Widget Parameters
+ scope.plugin = attrs.plugin || "auth";
scope.icon = attrs.icon || "fi-lightbulb";
scope.hostname = $location.host();
scope.httpdport = $location.port();
scope.autolog = JSON.parse(attrs.autolog || false);
- if (scope.autolog) scope.tkcreate();
-
- // Init ping and refresh process
- $timeout (scope.getping, AppConfig.session.pingrate*1000);
- $timeout (scope.refresh, AppConfig.session.timeout *250);
+ // autostart log if requested
+ if (scope.autolog) scope.loggin();
+
}
return {
@@ -133,4 +147,3 @@ angular.module('TokenRefresh', ['AppConfig', 'ModalNotification'])
})();
console.log ("Token Refresh Loaded");
-
diff --git a/afm-client/bower_components/angular/angular.js b/afm-client/bower_components/angular/angular.js
index 2445ab5..72dff70 100644
--- a/afm-client/bower_components/angular/angular.js
+++ b/afm-client/bower_components/angular/angular.js
@@ -26448,4 +26448,4 @@ var minlengthDirective = function() {
})(window, document);
-!window.angular.$$csp() && window.angular.element(document.head).prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}</style>'); \ No newline at end of file
+!window.angular.$$csp() && window.angular.element(document.head).prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}</style>');
diff --git a/afm-client/gulpfile.js b/afm-client/gulpfile.js
index 3ec8774..a79835a 100644
--- a/afm-client/gulpfile.js
+++ b/afm-client/gulpfile.js
@@ -23,7 +23,6 @@ config=require (appdir + "etc/_Config"); // upload user local preferences if any
// Run node in debug mode in developpement mode ?
var nodeopts = config.DEBUG !== undefined ? '--debug='+config.DEBUG : '';
var frontend= appdir + config.FRONTEND;
-var backend = appdir + config.BACKEND;
var paths = {
application : frontend,
@@ -35,7 +34,6 @@ var paths = {
partials : [frontend + '/**/*.html', '!' + frontend +'/index.html'],
distDev : './dist.dev',
distProd : './dist.prod',
- scriptsDevServer: backend + '/**/*.js',
sass: [frontend+'/styles', 'bower_components/foundation-apps/scss','bower_components/foundation-icon-fonts'],
fonts: ['bower_components/**/*.woff'],
favicon: frontend+'/favicon.ico'
@@ -103,11 +101,6 @@ pipes.builtVendorScriptsProd = function() {
.pipe(gulp.dest(paths.distProd+ '/bower_components'));
};
-pipes.validatedDevServerScripts = function() {
- return gulp.src(paths.scriptsDevServer)
- .pipe(plugins.jshint())
- .pipe(plugins.jshint.reporter('jshint-stylish'));
-};
pipes.validatedPartials = function() {
return gulp.src(paths.partials)
@@ -279,16 +272,7 @@ pipes.builtAppProd = function() {
gulp.task('help', taskListing.withFilters(/-/));
// clean, build of production environement
-gulp.task('build', ['clean-build-app-prod', 'validate-devserver-scripts']);
-
-gulp.task('run', function() {
- // start nodemon to auto-reload the dev server
- plugins.nodemon({ script: 'server.js', ext: 'js', watch: ['devServer/']})
- .on('change', ['validate-devserver-scripts'])
- .on('restart', function () {
- console.log('[nodemon] restarted dev server');
- });
-});
+gulp.task('build', ['clean-build-app-prod']);
// removes all compiled dev files
gulp.task('clean-dev', function() {
@@ -320,9 +304,6 @@ gulp.task('build-partials-dev', pipes.builtPartialsDev);
// converts partials to javascript using html2js
gulp.task('convert-partials-to-js', pipes.scriptedPartials);
-// runs jshint on the dev server scripts
-gulp.task('validate-devserver-scripts', pipes.validatedDevServerScripts);
-
// runs jshint on the app scripts
gulp.task('validate-app-scripts', pipes.validatedAppScripts);
@@ -363,23 +344,7 @@ gulp.task('clean-build-app-dev', ['clean-dev'], pipes.builtAppDev);
gulp.task('clean-build-app-prod', ['clean-prod'], pipes.builtAppProd);
// clean, build, and watch live changes to the dev environment
-gulp.task('watch-dev', ['clean-build-app-dev', 'validate-devserver-scripts'], function() {
-
- // start nodemon to auto-reload the dev server
- plugins.nodemon({ exec: 'node ' + nodeopts, script: backend+'/server.js', ext: 'js', watch: [backend], env: {NODE_ENV : 'dev'} })
- .on('change', ['validate-devserver-scripts'])
- .on('restart', function () {
- console.log('[nodemon] restarted dev server');
- });
-
- // start live-reload server
- plugins.livereload.listen({ start: true });
-
- // watch index
- gulp.watch(paths.index, function() {
- return pipes.builtIndexDev()
- .pipe(plugins.livereload());
- });
+gulp.task('watch-dev', ['clean-build-app-dev'], function() {
// watch app scripts
gulp.watch(paths.scripts, function() {
@@ -408,17 +373,7 @@ gulp.task('watch-dev', ['clean-build-app-dev', 'validate-devserver-scripts'], fu
});
// clean, build, and watch live changes to the prod environment
-gulp.task('watch-prod', ['clean-build-app-prod', 'validate-devserver-scripts'], function() {
-
- // start nodemon to auto-reload the dev server
- plugins.nodemon({ script: backend +'/server.js', ext: 'js', watch: [backend], env: {MODE : 'prod'} })
- .on('change', ['validate-devserver-scripts'])
- .on('restart', function () {
- console.log('[nodemon] restarted dev server');
- });
-
- // start live-reload server
- plugins.livereload.listen({start: true});
+gulp.task('watch-prod', ['clean-build-app-prod'], function() {
// watch index
gulp.watch(paths.index, function() {