Dinamically generate views for CORE Models

Change-Id: Ib1d042f366f916c2ba8513ee62014e7256ceb53d
diff --git a/src/app/datasources/index.ts b/src/app/datasources/index.ts
index 535937b..936920e 100644
--- a/src/app/datasources/index.ts
+++ b/src/app/datasources/index.ts
@@ -1,17 +1,18 @@
 import {CoreRest} from './rest/core.rest';
-import {SlicesRest} from './rest/slices.rest';
+import {ModelRest} from './rest/model.rest';
 import {AuthService} from './rest/auth.rest';
 import {WebSocketEvent} from './websocket/global';
-import {SliceStore} from './stores/slices.store';
+import {ModelStore} from './stores/model.store';
 import {StoreHelpers} from './helpers/store.helpers';
 import {SynchronizerStore} from './stores/synchronizer.store';
+import {ModeldefsService} from './rest/modeldefs.rest';
 
-export const xosRest = 'xosDataSources';
+export const xosDataSources = 'xosDataSources';
 
 angular
   .module('xosDataSources', ['ngCookies'])
   .service('CoreRest', CoreRest)
-  .service('SlicesRest', SlicesRest)
+  .service('ModelRest', ModelRest)
   .service('AuthService', AuthService)
   .service('WebSocket', WebSocketEvent);
 
@@ -19,4 +20,5 @@
   .module('xosDataSources')
   .service('StoreHelpers', StoreHelpers)
   .service('SynchronizerStore', SynchronizerStore)
-  .service('SlicesStore', SliceStore);
+  .service('ModelStore', ModelStore)
+  .service('ModelDefs', ModeldefsService);
diff --git a/src/app/datasources/rest/model.rest.ts b/src/app/datasources/rest/model.rest.ts
new file mode 100644
index 0000000..45431d4
--- /dev/null
+++ b/src/app/datasources/rest/model.rest.ts
@@ -0,0 +1,21 @@
+import {AppConfig} from '../../config/app.config';
+
+export interface IXosResourceService {
+  getResource(url: string): ng.resource.IResourceClass<any>;
+}
+
+export class ModelRest implements IXosResourceService {
+  static $inject = ['$resource'];
+  private resource: angular.resource.IResourceClass<any>;
+
+  /** @ngInject */
+  constructor(
+    private $resource: ng.resource.IResourceService
+  ) {
+
+  }
+
+  public getResource(url: string): ng.resource.IResourceClass<ng.resource.IResource<any>> {
+    return this.resource = this.$resource(`${AppConfig.apiEndpoint}${url}`);
+  }
+}
diff --git a/src/app/datasources/rest/modeldefs.rest.ts b/src/app/datasources/rest/modeldefs.rest.ts
new file mode 100644
index 0000000..d05aa6d
--- /dev/null
+++ b/src/app/datasources/rest/modeldefs.rest.ts
@@ -0,0 +1,36 @@
+import {AppConfig} from '../../config/app.config';
+
+interface IModeldefField {
+  name: string;
+  type: string;
+}
+
+export interface IModeldef {
+  fields: IModeldefField[];
+  relations: string[];
+  name: string;
+}
+
+export interface IModeldefsService {
+  get(): Promise<IModeldef[]>;
+}
+
+export class ModeldefsService {
+  constructor(
+    private $http: angular.IHttpService,
+    private $q: angular.IQService,
+  ) {
+  }
+
+  public get(): Promise<any> {
+    const d = this.$q.defer();
+    this.$http.get(`${AppConfig.apiEndpoint}/utility/modeldefs/`)
+      .then((res) => {
+        d.resolve(res.data);
+      })
+      .catch(e => {
+        d.reject(e);
+      });
+    return d.promise;
+  }
+}
diff --git a/src/app/datasources/rest/slices.rest.ts b/src/app/datasources/rest/slices.rest.ts
deleted file mode 100644
index a5b7e5c..0000000
--- a/src/app/datasources/rest/slices.rest.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-import {AppConfig} from '../../config/app.config';
-
-export interface IXosResourceService {
-  getResource(): ng.resource.IResourceClass<any>;
-}
-
-export class SlicesRest implements IXosResourceService {
-  static $inject = ['$resource'];
-  private resource: angular.resource.IResourceClass<any>;
-
-  /** @ngInject */
-  constructor(
-    private $resource: ng.resource.IResourceService
-  ) {
-    this.resource = this.$resource(`${AppConfig.apiEndpoint}/core/slices/`);
-  }
-
-  public getResource(): ng.resource.IResourceClass<ng.resource.IResource<any>> {
-    return this.resource;
-  }
-}
diff --git a/src/app/datasources/stores/model.store.ts b/src/app/datasources/stores/model.store.ts
new file mode 100644
index 0000000..f31d571
--- /dev/null
+++ b/src/app/datasources/stores/model.store.ts
@@ -0,0 +1,44 @@
+/// <reference path="../../../../typings/index.d.ts"/>
+
+import {BehaviorSubject, Observable} from 'rxjs/Rx';
+import {IWSEvent, IWSEventService} from '../websocket/global';
+import {IXosResourceService} from '../rest/model.rest';
+import {IStoreHelpersService} from '../helpers/store.helpers';
+
+export interface  IModelStoreService {
+  query(model: string): Observable<any>;
+}
+
+export class ModelStore {
+  static $inject = ['WebSocket', 'StoreHelpers', 'ModelRest'];
+  private _slices: BehaviorSubject<any[]> = new BehaviorSubject([]);
+  constructor(
+    private webSocket: IWSEventService,
+    private storeHelpers: IStoreHelpersService,
+    private sliceService: IXosResourceService
+  ) {
+  }
+
+  query(model: string) {
+    this.loadInitialData(model);
+    this.webSocket.list()
+      .filter((e: IWSEvent) => e.model === model)
+      .subscribe(
+        (event: IWSEvent) => {
+          this.storeHelpers.updateCollection(event, this._slices);
+        }
+      );
+    return this._slices.asObservable();
+  }
+
+  private loadInitialData(model: string) {
+    const endpoint = `/core/${model.toLowerCase()}s/`;
+    this.sliceService.getResource(endpoint).query().$promise
+      .then(
+        res => {
+          this._slices.next(res);
+        },
+        err => console.log(`Error retrieving ${model}`, err)
+      );
+  }
+}
diff --git a/src/app/datasources/stores/slices.store.ts b/src/app/datasources/stores/slices.store.ts
deleted file mode 100644
index 9c3389f..0000000
--- a/src/app/datasources/stores/slices.store.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-/// <reference path="../../../../typings/index.d.ts"/>
-
-import {BehaviorSubject, Observable} from 'rxjs/Rx';
-import {IWSEvent, IWSEventService} from '../websocket/global';
-import {IXosResourceService} from '../rest/slices.rest';
-import {IStoreHelpersService} from '../helpers/store.helpers';
-
-export interface  IStoreService {
-  query(): Observable<any>;
-}
-
-export class SliceStore {
-  static $inject = ['WebSocket', 'StoreHelpers', 'SlicesRest'];
-  private _slices: BehaviorSubject<any[]> = new BehaviorSubject([]);
-  constructor(
-    private webSocket: IWSEventService,
-    private storeHelpers: IStoreHelpersService,
-    private sliceService: IXosResourceService
-  ) {
-    this.loadInitialData();
-    this.webSocket.list()
-      .filter((e: IWSEvent) => e.model === 'Slice')
-      .subscribe(
-        (event: IWSEvent) => {
-          this.storeHelpers.updateCollection(event, this._slices);
-        }
-      );
-  }
-
-  query() {
-    return this._slices.asObservable();
-  }
-
-  private loadInitialData() {
-    this.sliceService.getResource().query().$promise
-      .then(
-        res => {
-          this._slices.next(res);
-        },
-        err => console.log('Error retrieving Slices', err)
-      );
-  }
-}
diff --git a/src/app/datasources/stores/synchronizer.store.ts b/src/app/datasources/stores/synchronizer.store.ts
index 598d23c..33a0c39 100644
--- a/src/app/datasources/stores/synchronizer.store.ts
+++ b/src/app/datasources/stores/synchronizer.store.ts
@@ -1,8 +1,12 @@
 /// <reference path="../../../../typings/index.d.ts"/>
 
-import {Subject} from 'rxjs/Rx';
+import {Subject, Observable} from 'rxjs/Rx';
 import {IWSEvent, IWSEventService} from '../websocket/global';
 
+export interface  IStoreService {
+  query(): Observable<any>;
+}
+
 export class SynchronizerStore {
   static $inject = ['WebSocket'];
   private _notifications: Subject<IWSEvent> = new Subject();