[CORD-814] Preparatory work to display service graph

Change-Id: I8e06cb92f017ce599258451800293b991540f72b
diff --git a/src/app/service-graph/services/graph.store.ts b/src/app/service-graph/services/graph.store.ts
new file mode 100644
index 0000000..e892b99
--- /dev/null
+++ b/src/app/service-graph/services/graph.store.ts
@@ -0,0 +1,81 @@
+import {Observable, BehaviorSubject} from 'rxjs';
+import {IXosModelStoreService} from '../../datasources/stores/model.store';
+import {IXosServiceGraph, IXosServiceModel, IXosTenantModel} from '../interfaces';
+import {IXosDebouncer} from '../../core/services/helpers/debounce.helper';
+export interface IXosServiceGraphStore {
+  get(): Observable<IXosServiceGraph>;
+}
+
+export class XosServiceGraphStore implements IXosServiceGraphStore {
+  static $inject = [
+    '$log',
+    'XosModelStore',
+    'XosDebouncer'
+  ];
+  private d3Graph = new BehaviorSubject({});
+
+  // storing locally reference to the data model
+  private services;
+  private tenants;
+
+  // debounced functions
+  private handleData;
+
+  // datastore
+  private ServiceObservable: Observable<any>;
+  private TenantObservable: Observable<any>;
+
+  constructor (
+    private $log: ng.ILogService,
+    private XosModelStore: IXosModelStoreService,
+    private XosDebouncer: IXosDebouncer
+  ) {
+
+    // we want to have a quiet period of 500ms from the last event before doing anything
+    this.handleData = this.XosDebouncer.debounce(this._handleData, 500, false);
+
+    this.ServiceObservable = this.XosModelStore.query('Service', '/core/services');
+    this.TenantObservable = this.XosModelStore.query('Service', '/core/tenants');
+
+    this.ServiceObservable
+      .subscribe(
+        (res) => {
+          this.combineData(res, 'services');
+        },
+        (err) => {
+          this.$log.error(err);
+        }
+      );
+
+    this.ServiceObservable
+      .subscribe(
+        (res) => {
+          this.combineData(res, 'tenants');
+        },
+        (err) => {
+          this.$log.error(err);
+        }
+      );
+  }
+
+  public get() {
+    return this.d3Graph.asObservable();
+  }
+
+  private combineData(data: any, type: 'services'|'tenants') {
+    switch (type) {
+      case 'services':
+        this.services = data;
+        break;
+      case 'tenants':
+        this.tenants = data;
+        break;
+    }
+    this.handleData(this.services, this.tenants);
+  }
+
+  private _handleData(services: IXosServiceModel[], tenants: IXosTenantModel[]) {
+    this.$log.log(`XosServiceGraphStore`, services, tenants);
+  }
+
+}