85 lines
2.1 KiB
TypeScript
85 lines
2.1 KiB
TypeScript
import { Injectable } from '@angular/core';
|
|
|
|
export interface CacheChangeIds {
|
|
[elementId: string]: number;
|
|
}
|
|
|
|
/**
|
|
* Handles caching metadata for the relation manager.
|
|
*
|
|
* Mainly holds an object mapping element ids to their last updates change ids.
|
|
* The manager can detect invalid caches, if the change id in the cache's metadata
|
|
* diverges from the change ids in this service.
|
|
*/
|
|
@Injectable({
|
|
providedIn: 'root'
|
|
})
|
|
export class RelationCacheService {
|
|
private cache: {
|
|
[elementId: string]: number;
|
|
} = {};
|
|
|
|
public constructor() {}
|
|
|
|
/**
|
|
* Reset the cache.
|
|
*/
|
|
public reset(): void {
|
|
this.cache = {};
|
|
}
|
|
|
|
/**
|
|
* Deletes models from this cache.
|
|
*
|
|
* @param collection Collection
|
|
* @param ids Ids from all models in the collection
|
|
*/
|
|
public registerDeletedModels(collection: string, ids: number[]): void {
|
|
ids.forEach(id => {
|
|
const elementId = collection + ':' + id;
|
|
delete this.cache[elementId];
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Adds models to the cache with the given change id.
|
|
*
|
|
* @param collection Collection
|
|
* @param ids Ids from all models in the collection
|
|
* @param changeId The change id to put into the cache
|
|
*/
|
|
public registerChangedModels(collection: string, ids: number[], changeId: number): void {
|
|
ids.forEach(id => {
|
|
const elementId = collection + ':' + id;
|
|
this.cache[elementId] = changeId;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Queries the change id for one element.
|
|
*
|
|
* @param elementId The element to query.
|
|
*/
|
|
public query(elementId: string): number | null {
|
|
return this.cache[elementId] || null;
|
|
}
|
|
|
|
/**
|
|
* Checks, if all given change ids are valid.
|
|
*/
|
|
public checkCacheValidity(changeIds: CacheChangeIds): boolean {
|
|
if (!changeIds) {
|
|
return false;
|
|
}
|
|
|
|
const elementIds = Object.keys(changeIds);
|
|
if (!elementIds.length) {
|
|
return false;
|
|
}
|
|
|
|
return elementIds.every(elementId => {
|
|
return this.query(elementId) === changeIds[elementId];
|
|
});
|
|
}
|
|
}
|