2018-07-04 17:51:31 +02:00
|
|
|
import { Injectable } from '@angular/core';
|
|
|
|
|
2018-07-12 14:11:31 +02:00
|
|
|
import { OpenSlidesComponent } from 'app/openslides.component';
|
|
|
|
import { WebsocketService } from './websocket.service';
|
2018-08-24 13:05:03 +02:00
|
|
|
|
|
|
|
import { CollectionStringModelMapperService } from './collectionStringModelMapper.service';
|
2018-07-04 17:51:31 +02:00
|
|
|
|
|
|
|
/**
|
2018-07-12 14:11:31 +02:00
|
|
|
* Handles the initial update and automatic updates using the {@link WebsocketService}
|
|
|
|
* Incoming objects, usually BaseModels, will be saved in the dataStore (`this.DS`)
|
|
|
|
* This service usually creates all models
|
|
|
|
*
|
|
|
|
* The dataStore will injected over the parent class: {@link OpenSlidesComponent}.
|
2018-07-04 17:51:31 +02:00
|
|
|
*/
|
|
|
|
@Injectable({
|
|
|
|
providedIn: 'root'
|
|
|
|
})
|
2018-07-12 14:11:31 +02:00
|
|
|
export class AutoupdateService extends OpenSlidesComponent {
|
|
|
|
/**
|
|
|
|
* Constructor to create the AutoupdateService. Calls the constructor of the parent class.
|
|
|
|
* @param websocketService
|
|
|
|
*/
|
2018-08-29 13:21:25 +02:00
|
|
|
public constructor(websocketService: WebsocketService) {
|
2018-07-04 17:51:31 +02:00
|
|
|
super();
|
2018-08-23 15:28:57 +02:00
|
|
|
websocketService.getOberservable<any>('autoupdate').subscribe(response => {
|
2018-07-04 17:51:31 +02:00
|
|
|
this.storeResponse(response);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2018-07-12 14:11:31 +02:00
|
|
|
/**
|
|
|
|
* Handle the answer of incoming data via {@link WebsocketService}.
|
|
|
|
*
|
2018-08-24 13:05:03 +02:00
|
|
|
* Bundles the data per action and collection. THis speeds up the caching in the DataStore.
|
|
|
|
*
|
2018-07-12 14:11:31 +02:00
|
|
|
* Detects the Class of an incomming model, creates a new empty object and assigns
|
|
|
|
* the data to it using the deserialize function.
|
|
|
|
*
|
|
|
|
* Saves models in DataStore.
|
|
|
|
*/
|
2018-08-29 13:21:25 +02:00
|
|
|
public storeResponse(socketResponse): void {
|
2018-08-24 13:05:03 +02:00
|
|
|
// Reorganize the autoupdate: groupy by action, then by collection. The final
|
|
|
|
// entries are the single autoupdate objects.
|
|
|
|
const autoupdate = {
|
|
|
|
changed: {},
|
|
|
|
deleted: {}
|
|
|
|
};
|
|
|
|
|
|
|
|
// Reorganize them.
|
|
|
|
socketResponse.forEach(obj => {
|
|
|
|
if (!autoupdate[obj.action][obj.collection]) {
|
|
|
|
autoupdate[obj.action][obj.collection] = [];
|
2018-08-22 16:03:49 +02:00
|
|
|
}
|
2018-08-24 13:05:03 +02:00
|
|
|
autoupdate[obj.action][obj.collection].push(obj);
|
2018-07-04 17:51:31 +02:00
|
|
|
});
|
2018-07-12 14:11:31 +02:00
|
|
|
|
2018-08-24 13:05:03 +02:00
|
|
|
// Delete the removed objects from the DataStore
|
|
|
|
Object.keys(autoupdate.deleted).forEach(collection => {
|
|
|
|
this.DS.remove(collection, ...autoupdate.deleted[collection].map(_obj => _obj.id));
|
|
|
|
});
|
|
|
|
|
|
|
|
// Add the objects to the DataStore.
|
|
|
|
Object.keys(autoupdate.changed).forEach(collection => {
|
|
|
|
const targetClass = CollectionStringModelMapperService.getCollectionStringType(collection);
|
|
|
|
if (!targetClass) {
|
|
|
|
// TODO: throw an error later..
|
|
|
|
/*throw new Error*/ console.log(`Unregistered resource ${collection}`);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
this.DS.add(...autoupdate.changed[collection].map(_obj => new targetClass().deserialize(_obj.data)));
|
|
|
|
});
|
2018-07-12 14:11:31 +02:00
|
|
|
}
|
2018-08-28 11:07:10 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Sends a WebSocket request to the Server with the maxChangeId of the DataStore.
|
|
|
|
* The server should return an autoupdate with all new data.
|
|
|
|
*
|
|
|
|
* TODO: Wait for changeIds to be implemented on the server.
|
|
|
|
*/
|
|
|
|
public requestChanges() {
|
|
|
|
console.log('requesting changed objects');
|
|
|
|
// this.websocketService.send('changeIdRequest', this.DS.maxChangeId);
|
|
|
|
}
|
2018-07-04 17:51:31 +02:00
|
|
|
}
|