Merge "[CORD-772] Onboarding GUI Extensions and persisting them in xos-core"
diff --git a/Dockerfile b/Dockerfile
index 3fef3f0..46ee933 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,5 +1,5 @@
 # To build use: docker build -t xosproject/xos-gui .
-# To run use: docker run -p 80:80 -d xosproject/xos-gui
+# To run use: docker run -p 4000:4000 --volumes-from gui-extensions-store -d xosproject/xos-gui
 
 FROM nginx
 
diff --git a/Dockerfile.xos-gui-extension-builder b/Dockerfile.xos-gui-extension-builder
new file mode 100644
index 0000000..4bf1e02
--- /dev/null
+++ b/Dockerfile.xos-gui-extension-builder
@@ -0,0 +1,16 @@
+# To build use: docker build -t xosproject/xos-gui-extension-builder .
+
+FROM node:argon
+
+# Set environment vars
+ENV CODE_SOURCE .
+ENV CODE_DEST /var/www
+
+# Add the app deps
+COPY ${CODE_SOURCE}/package.json ${CODE_DEST}/package.json
+COPY ${CODE_SOURCE}/typings.json ${CODE_DEST}/typings.json
+
+# Install Deps
+WORKDIR ${CODE_DEST}
+RUN npm install
+RUN npm run typings
diff --git a/src/app/extender/services/onboard.service.spec.ts b/src/app/extender/services/onboard.service.spec.ts
index 17a7543..d53f3af 100644
--- a/src/app/extender/services/onboard.service.spec.ts
+++ b/src/app/extender/services/onboard.service.spec.ts
@@ -34,11 +34,7 @@
 
 const MockModelStore = {
   query: () => {
-    return {
-      subscribe: () => {
-        return;
-      }
-    };
+    return subject.asObservable();
   }
 };
 
@@ -69,17 +65,12 @@
 
   describe('when receive an event', () => {
     it('should use $ocLazyLoad to add modules to the app', () => {
-      subject.next({
-        model: 'XOSComponent',
-        msg: {
-          app: 'sample',
-          object: {
-            extra: '["vendor.js", "app.js"]',
-            name: 'sample app'
-          }
+      subject.next([
+        {
+          files: 'vendor.js,app.js',
+          name: 'sample app'
         }
-      });
-      $timeout.flush();
+      ]);
       expect($ocLazyLoad.load).toHaveBeenCalledWith('vendor.js');
       expect($ocLazyLoad.load).toHaveBeenCalledWith('app.js');
     });
diff --git a/src/app/extender/services/onboard.service.ts b/src/app/extender/services/onboard.service.ts
index 2f85028..b6a9abc 100644
--- a/src/app/extender/services/onboard.service.ts
+++ b/src/app/extender/services/onboard.service.ts
@@ -1,4 +1,4 @@
-import {IWSEventService, IWSEvent} from '../../datasources/websocket/global';
+import {IWSEventService} from '../../datasources/websocket/global';
 import {IXosModelStoreService} from '../../datasources/stores/model.store';
 import * as _ from 'lodash';
 import {Observable} from 'rxjs';
@@ -20,56 +20,19 @@
   ) {
     this.$log.info('[XosOnboarder] Setup');
 
-    // Listen for new app (we need a pause to allow the container to boot)
-    this.webSocket.list()
-      .filter((e: IWSEvent) => {
-        if (e.model === 'XOSComponent' && e.msg.object.extra) {
-          e.msg.object.extra = JSON.parse(e.msg.object.extra);
-          return true;
-        }
-        return false;
-      })
-      .subscribe(
-        (event) => {
-          this.$timeout(() => {
-            this.$log.info(`[XosOnboarder] Loading files for app: ${event.msg.object.name}`);
-            // NOTE we need the timeout because the event is triggered when the model is created,
-            // XOS take around 15s to boot it
-            this.loadFile(event.msg.object.extra)
-              .then((res) => {
-                this.$log.info(`[XosOnboarder] All files loaded for app: ${event.msg.object.name}`);
-              });
-          }, 20 * 1000);
-        }
-      );
+    // Load onboarded app
+    const ComponentObservable: Observable<any> = this.XosModelStore.query('XOSGuiExtension');
 
-    // Load previously onboarded app (containers are already running, so we don't need to wait)
-    let componentsLoaded = false;
-    const ComponentObservable: Observable<any> = this.XosModelStore.query('XOSComponent');
     ComponentObservable.subscribe(
         (component) => {
-          if (componentsLoaded) {
-            // if we have already loaded the component present when we loaded the page
-            // do nothing, we are intercepting WS to give the container time to boot
-            return;
-          }
-
           _.forEach(component, (c) => {
-            if (c.extra) {
-              this.$log.info(`[XosOnboarder] Loading files for app: ${c.name}`);
-              let extra;
-              try {
-                extra = JSON.parse(c.extra);
-              } catch (e) {
-                extra = c.extra;
-              }
-              this.loadFile(extra)
-                .then((res) => {
-                  this.$log.info(`[XosOnboarder] All files loaded for app: ${c.name}`);
-                });
-            }
+            this.$log.info(`[XosOnboarder] Loading files for app: ${c.name}`);
+            const files = c.files.split(',').map(s => s.trim());
+            this.loadFile(files)
+              .then((res) => {
+                this.$log.info(`[XosOnboarder] All files loaded for app: ${c.name}`);
+              });
           });
-          componentsLoaded = true;
         }
       );
   }
diff --git a/src/extensions/.gitignore b/src/extensions/.gitignore
new file mode 100644
index 0000000..c96a04f
--- /dev/null
+++ b/src/extensions/.gitignore
@@ -0,0 +1,2 @@
+*
+!.gitignore
\ No newline at end of file