blob: 015d729d4ccc50d28eb3e09ae2a81b74253f1754 [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';
Matteo Scandolobac22452017-01-03 16:35:32 -08007import {IXosModelHelpersService} from '../../core/services/helpers/model.helper';
Matteo Scandolof2c3ed62016-12-15 14:32:50 -08008
9export interface IModelStoreService {
10 query(model: string): Observable<any>;
11}
12
13export class ModelStore {
Matteo Scandolobac22452017-01-03 16:35:32 -080014 static $inject = ['WebSocket', 'StoreHelpers', 'ModelRest', 'ModelHelpers'];
Matteo Scandolof9dd4d02016-12-22 15:17:01 -080015 private _collections: any; // NOTE contains a map of {model: BehaviourSubject}
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080016 constructor(
17 private webSocket: IWSEventService,
18 private storeHelpers: IStoreHelpersService,
Matteo Scandolobac22452017-01-03 16:35:32 -080019 private ModelRest: IXosResourceService,
20 private ModelHelpers: IXosModelHelpersService
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080021 ) {
Matteo Scandolof9dd4d02016-12-22 15:17:01 -080022 this._collections = {};
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080023 }
24
25 query(model: string) {
Matteo Scandolof9dd4d02016-12-22 15:17:01 -080026
27 // if there isn't already an observable for that item
28 if (!this._collections[model]) {
29 this._collections[model] = new BehaviorSubject([]); // NOTE maybe this can be created when we get response from the resource
30 this.loadInitialData(model);
31 }
32
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080033 this.webSocket.list()
34 .filter((e: IWSEvent) => e.model === model)
35 .subscribe(
36 (event: IWSEvent) => {
Matteo Scandolof9dd4d02016-12-22 15:17:01 -080037 this.storeHelpers.updateCollection(event, this._collections[model]);
Matteo Scandoloa4a47112016-12-16 10:06:13 -080038 },
39 err => console.error
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080040 );
Matteo Scandolof9dd4d02016-12-22 15:17:01 -080041
42 return this._collections[model].asObservable();
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080043 }
44
45 private loadInitialData(model: string) {
Matteo Scandoloee655a12016-12-19 15:38:43 -080046 // NOTE check what is the correct pattern to pluralize this
Matteo Scandolobac22452017-01-03 16:35:32 -080047 const endpoint = this.ModelHelpers.urlFromCoreModel(model);
Matteo Scandoloa4a47112016-12-16 10:06:13 -080048 this.ModelRest.getResource(endpoint).query().$promise
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080049 .then(
50 res => {
Matteo Scandolof9dd4d02016-12-22 15:17:01 -080051 this._collections[model].next(res);
Matteo Scandolof2c3ed62016-12-15 14:32:50 -080052 },
53 err => console.log(`Error retrieving ${model}`, err)
54 );
55 }
56}