Merge "[CORD-772] Onboarding GUI Extensions and persisting them in xos-core"
diff --git a/conf/app/app.config.production.js b/conf/app/app.config.production.js
index 8f5bd5a..cf92947 100644
--- a/conf/app/app.config.production.js
+++ b/conf/app/app.config.production.js
@@ -1,5 +1,5 @@
 angular.module('app')
   .constant('AppConfig', {
-    apiEndpoint: '/spa/api',
+    apiEndpoint: '/xosapi/v1',
     websocketClient: '/'
   });
diff --git a/conf/browsersync-dist.conf.js b/conf/browsersync-dist.conf.js
index cbefe1d..d80f1ef 100644
--- a/conf/browsersync-dist.conf.js
+++ b/conf/browsersync-dist.conf.js
@@ -1,4 +1,5 @@
 const conf = require('./gulp.conf');
+const proxy = require('./proxy');
 
 module.exports = function () {
   return {
@@ -6,10 +7,18 @@
       baseDir: [
         conf.paths.dist
       ],
+      middleware: function(req, res, next){
+        if (req.url.indexOf('xosapi') !== -1) {
+          proxy.web(req, res);
+        }
+        else{
+          next();
+        }
+      },
       routes: {
         "/spa": "./dist"
       }
     },
-    open: false
+    open: true
   };
 };
diff --git a/conf/browsersync.conf.js b/conf/browsersync.conf.js
index e8c38fa..dd7acd5 100644
--- a/conf/browsersync.conf.js
+++ b/conf/browsersync.conf.js
@@ -1,18 +1,5 @@
 const conf = require('./gulp.conf');
-const httpProxy = require('http-proxy');
-
-// TODO move the proxy config in a separate file and share with browsersync.dist.js
-
-const proxy = httpProxy.createProxyServer({
-  target: 'http://xos.dev:9101'
-});
-
-proxy.on('error', function(error, req, res) {
-  res.writeHead(500, {
-    'Content-Type': 'text/plain'
-  });
-  console.error('[Proxy]', error);
-});
+const proxy = require('./proxy');
 
 module.exports = function () {
   return {
diff --git a/conf/proxy.js b/conf/proxy.js
new file mode 100644
index 0000000..daec1a8
--- /dev/null
+++ b/conf/proxy.js
@@ -0,0 +1,14 @@
+const httpProxy = require('http-proxy');
+
+const proxy = httpProxy.createProxyServer({
+  target: 'http://xos.dev:9101'
+});
+
+proxy.on('error', function(error, req, res) {
+  res.writeHead(500, {
+    'Content-Type': 'text/plain'
+  });
+  console.error('[Proxy]', error);
+});
+
+module.exports = proxy;
\ No newline at end of file
diff --git a/src/app/core/nav/nav.ts b/src/app/core/nav/nav.ts
index f537e5e..2082efb 100644
--- a/src/app/core/nav/nav.ts
+++ b/src/app/core/nav/nav.ts
@@ -21,10 +21,6 @@
     private XosSidePanel: IXosSidePanelService,
     private XosComponentInjector: IXosComponentInjectorService
   ) {
-    // NOTE we'll need to have:
-    // - Base routes (defined from configuration based on BRAND)
-    // - Autogenerated routes (nested somewhere)
-    // - Service Routes (dynamically added)
     this.routes = [];
     this.$scope.$watch(() => this.navigationService.query(), (routes) => {
       this.routes = routes;
diff --git a/src/app/datasources/helpers/model-discoverer.service.ts b/src/app/datasources/helpers/model-discoverer.service.ts
index deaed33..da6f265 100644
--- a/src/app/datasources/helpers/model-discoverer.service.ts
+++ b/src/app/datasources/helpers/model-discoverer.service.ts
@@ -62,6 +62,7 @@
 
         const pArray = [];
         _.forEach(modelsDef, (model: IXosModeldef) => {
+          this.$log.debug(`[XosModelDiscovererService] Loading: ${model.name}`);
           let p = this.cacheModelEntries(model)
             .then(model => {
               return this.addState(model);
@@ -167,15 +168,20 @@
       },
       component: 'xosCrud',
     };
-    this.XosRuntimeStates.addState(
-      this.stateNameFromModel(model),
-      state
-    );
 
-    // extend model
-    model.clientUrl = `${this.serviceNameFromAppName(model.app)}${clientUrl}`;
+    try {
+      this.XosRuntimeStates.addState(
+        this.stateNameFromModel(model),
+        state
+      );
 
-    d.resolve(model);
+      // extend model
+      model.clientUrl = `${this.serviceNameFromAppName(model.app)}${clientUrl}`;
+
+      d.resolve(model);
+    } catch (e) {
+      d.reject(e);
+    }
     return d.promise;
   }
 
@@ -186,13 +192,17 @@
 
     const parentState: string = this.getParentStateFromModel(model);
 
-    this.XosNavigationService.add({
-      label: this.ConfigHelpers.pluralize(model.name),
-      state: stateName,
-      parent: parentState
-    });
+    try {
+      this.XosNavigationService.add({
+        label: this.ConfigHelpers.pluralize(model.name),
+        state: stateName,
+        parent: parentState
+      });
+      d.resolve(model);
+    } catch (e) {
+      d.reject(e);
+    }
 
-    d.resolve(model);
 
     return d.promise;
   }