Clean up to prepare new version of API
authorFulup Ar Foll <fulup@iot.bzh>
Sun, 29 May 2016 13:50:40 +0000 (15:50 +0200)
committerFulup Ar Foll <fulup@iot.bzh>
Sun, 29 May 2016 13:50:40 +0000 (15:50 +0200)
12 files changed:
afm-client/README.md
afm-client/app/Backend/RestApis/AfmMainMockApi.js [deleted file]
afm-client/app/Backend/RestApis/PostMockApi.js [deleted file]
afm-client/app/Backend/RestApis/TokenMockApi.js [deleted file]
afm-client/app/Backend/RestApis/_all.js [deleted file]
afm-client/app/Backend/server.js [deleted file]
afm-client/app/Frontend/etc/AppConfig.js
afm-client/app/Frontend/pages/Dashboard/DashboardModule.js
afm-client/app/Frontend/widgets/ActionButtons/AppliButton.js
afm-client/app/Frontend/widgets/Notifications/TokenRefreshSvc.js
afm-client/bower_components/angular/angular.js
afm-client/gulpfile.js

index 0ed9d45..3bb94a2 100644 (file)
@@ -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
 
 
 ## 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
 
        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 ./]
 
 ### 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 /]
         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;
 
     };
     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
 
 ### 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
 
 
     # 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. 
 
     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
 
 ### 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
     /AppClient
     |
     |---- package.json
     |---- bower.json
     |---- gulpfile.js
-    |---- .noderc.js  [Warning: contains private keys should not uploaded in Github]
     |
     |---- /Frontend
     |     |
     |
     |---- /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)
 
     |---- (/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 (file)
index 9469eef..0000000
+++ /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 (file)
index 7bc71f7..0000000
+++ /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 (file)
index 073f1df..0000000
+++ /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 (file)
index 8fab76a..0000000
+++ /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 (file)
index 11c5486..0000000
+++ /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
index be5a107..d24a626 100644 (file)
                 return myConfig;
             })
 
                 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) {
             .factory('AppCall', function ($http, AppConfig, $log) {
+                
                 var myCalls = {
                 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
                         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;
             });
                 };
                 return myCalls;
             });
-    
 })();
 })();
index dff21ed..3bde5a9 100644 (file)
@@ -29,27 +29,29 @@ angular.module('DashboardModule', ['SubmitButton', 'TokenRefresh', 'AppliButton'
         scope.GetRunnables = function() {
             console.log ("Dashboard GetRunnables");
             
         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"; 
                 
                 // 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;
                 }
                   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=[];
                 
                 // 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];
                 for (var idx=0; idx < runnables.length; idx ++) {
                     appliIDs[idx] = runnables [idx].id;
                     scope.appliStore [runnables [idx].id] =  runnables [idx];
index 269ee81..a10030c 100644 (file)
                     scope.runmode   = urlquery.runmode || "auto";
                     scope.clicked = function () {
 
                     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");
                             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");
                             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() {
                         };
                         
                         var closeModApp = function() {
                                 
                                 case "start":
                                     if (scope.runstatus !== "stop") return;
                                 
                                 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";
                                             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()));                                            
                                     });
                                        if(response.data.response.uri)
                                             scope.winapp= $window.open(response.data.response.uri.replace("%h", $location.host()));                                            
                                     });
                                 case "stop":
                                     if (scope.runstatus !== "start") return;
                                     
                                 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";
                                             return;
                                         }
                                         scope.runstatus="stop";
                                            scope.winapp.close();
                                            scope.winapp=false;
                                         }
                                            scope.winapp.close();
                                            scope.winapp=false;
                                         }
-                                        notifySuccess (action, response);
+                                        notifySuccess (action, jresp);
                                     });
                                     break;
                                         
                                 case "info":
                                     });
                                     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;
                                         }
                                                                                
                                             return;
                                         }
                                                                                
 
                                 case "uninstall":
                                     if (scope.runstatus !== "stop") return;
 
                                 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;
                                         }
                                         
                                             return;
                                         }
                                         
-                                        notifySuccess (action, response);
+                                        notifySuccess (action, jresp);
                                     });
                                     break;
 
                                     });
                                     break;
 
index 4d7aed6..3ddd270 100644 (file)
@@ -25,7 +25,7 @@
     'use strict';
 
     var template =
     '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>';
          '<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.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)  {
             
             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.online();
                 if (scope.callback) scope.callback(jresp);
             }
-            scope.status = 1;
+            
+            scope.status = 1;            
+            return true;
         };
 
         // Check Binder status
         scope.getping = function() {
             
         };
 
         // 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);
                 // restart a new timer for next ping
                 $timeout (scope.getping, AppConfig.session.pingrate*1000);
-            });
+            }, scope.onerror);
         };
         
         // Check Binder status
         scope.refresh = function() {
             
         };
         
         // 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);
                 // restart a new timer for next refresh
                 $timeout (scope.refresh, AppConfig.session.timeout *250);
-            });            
+            }, scope.onerror);            
         };
         
         // Initial connection
         };
         
         // 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);
         
         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 {
     }
 
     return {
@@ -133,4 +147,3 @@ angular.module('TokenRefresh', ['AppConfig', 'ModalNotification'])
 
 })();
 console.log ("Token Refresh Loaded");
 
 })();
 console.log ("Token Refresh Loaded");
-
index 2445ab5..72dff70 100644 (file)
@@ -26448,4 +26448,4 @@ var minlengthDirective = function() {
 
 })(window, document);
 
 
 })(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>');
index 3ec8774..a79835a 100644 (file)
@@ -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;
 // 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,
 
 var paths = {
     application : frontend,
@@ -35,7 +34,6 @@ var paths = {
     partials    : [frontend + '/**/*.html', '!' + frontend +'/index.html'],
     distDev     : './dist.dev',
     distProd    : './dist.prod',
     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'
     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'));
 };
 
         .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)
 
 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('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() {
 
 // 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);
 
 // 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);
 
 // 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('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() {
 
     // 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
 });
 
 // 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() {
 
     // watch index
     gulp.watch(paths.index, function() {