blob: 0839cc74f7e2502f43a821c131eb221f9a295c84 [file] [log] [blame]
Matteo Scandolof2c3ed62016-12-15 14:32:50 -08001/// <reference path="../../../../typings/index.d.ts"/>
2
3import {BehaviorSubject, Observable} from 'rxjs/Rx';
4import {IWSEvent, IWSEventService} from '../websocket/global';
5import {IXosResourceService} from '../rest/model.rest';
6import {IStoreHelpersService} from '../helpers/store.helpers';
7
8export interface IModelStoreService {
9 query(model: string): Observable<any>;
10}
11
12export class ModelStore {
13 static $inject = ['WebSocket', 'StoreHelpers', 'ModelRest'];
Matteo Scandoloa4a47112016-12-16 10:06:13 -080014 private _collection: BehaviorSubject<any[]> = new BehaviorSubject([]);
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080015 constructor(
16 private webSocket: IWSEventService,
17 private storeHelpers: IStoreHelpersService,
Matteo Scandoloa4a47112016-12-16 10:06:13 -080018 private ModelRest: IXosResourceService
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080019 ) {
20 }
Matteo Scandolod62ea792016-12-22 14:02:28 -080021 // FIXME if called multiple time (for different collection),
22 // it return the same observable while it should return different ones
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080023
24 query(model: string) {
25 this.loadInitialData(model);
26 this.webSocket.list()
27 .filter((e: IWSEvent) => e.model === model)
28 .subscribe(
29 (event: IWSEvent) => {
Matteo Scandoloa4a47112016-12-16 10:06:13 -080030 this.storeHelpers.updateCollection(event, this._collection);
31 },
32 err => console.error
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080033 );
Matteo Scandoloa4a47112016-12-16 10:06:13 -080034 return this._collection.asObservable();
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080035 }
36
37 private loadInitialData(model: string) {
Matteo Scandoloee655a12016-12-19 15:38:43 -080038 // NOTE check what is the correct pattern to pluralize this
39 const endpoint = `/core/${model.toLowerCase()}s`;
Matteo Scandoloa4a47112016-12-16 10:06:13 -080040 this.ModelRest.getResource(endpoint).query().$promise
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080041 .then(
42 res => {
Matteo Scandoloa4a47112016-12-16 10:06:13 -080043 this._collection.next(res);
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080044 },
45 err => console.log(`Error retrieving ${model}`, err)
46 );
47 }
48}