caching works

This commit is contained in:
Daniel Ponte 2024-12-20 13:56:25 -05:00
parent ab52890706
commit 4a5cb830cd
2 changed files with 45 additions and 14 deletions

View file

@ -94,7 +94,7 @@ export class DurationPipe implements PipeTransform {
transform(call: CallRecord, args?: any): string { transform(call: CallRecord, args?: any): string {
const seconds = call.duration / 1000; const seconds = call.duration / 1000;
return seconds.toFixed(2)+"s"; return seconds.toFixed(2) + 's';
} }
} }

View file

@ -1,6 +1,16 @@
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { HttpClient, HttpResponse } from '@angular/common/http'; import { HttpClient, HttpResponse } from '@angular/common/http';
import { Observable, share, shareReplay } from 'rxjs'; import {
BehaviorSubject,
concat,
map,
filter,
concatMap,
Observable,
ReplaySubject,
share,
shareReplay,
} from 'rxjs';
import { Talkgroup, TalkgroupUpdate, TGID } from '../talkgroup'; import { Talkgroup, TalkgroupUpdate, TGID } from '../talkgroup';
export interface Pagination { export interface Pagination {
@ -18,29 +28,50 @@ export interface TalkgroupsPaginated {
providedIn: 'root', providedIn: 'root',
}) })
export class TalkgroupService { export class TalkgroupService {
private readonly _getTalkgroup = new Map<TGID, Observable<Talkgroup>>(); private readonly _getTalkgroup = new Map<string, Observable<Talkgroup>>();
constructor(private http: HttpClient) {} private tgs$ = new Observable<Talkgroup[]>();
constructor(private http: HttpClient) {
this.tgs$ = this.getTalkgroups().pipe(shareReplay(1));
this.fillTgMap();
}
getTalkgroups(): Observable<Talkgroup[]> { getTalkgroups(): Observable<Talkgroup[]> {
return this.http.get<Talkgroup[]>('/api/talkgroup/'); return this.http.get<Talkgroup[]>('/api/talkgroup/');
} }
tgKey(sys: number, tg: number): string {
return sys + ':' + tg;
}
getTalkgroupsPag(pagination: Pagination): Observable<TalkgroupsPaginated> { getTalkgroupsPag(pagination: Pagination): Observable<TalkgroupsPaginated> {
return this.http.post<TalkgroupsPaginated>('/api/talkgroup/', pagination); return this.http.post<TalkgroupsPaginated>('/api/talkgroup/', pagination);
} }
fillTgMap() {
this.tgs$.subscribe((tgs) => {
tgs.forEach((tg, i, a) => {
let tgid = this.tgKey(tg.system_id, tg.tgid);
const rs = this._getTalkgroup.get(tgid);
if (rs) {
(rs as ReplaySubject<Talkgroup>).next(tg);
} else {
const bs = new ReplaySubject<Talkgroup>(1);
bs.next(tg);
this._getTalkgroup.set(tgid, bs);
}
});
});
}
getTalkgroup(sys: number, tg: number): Observable<Talkgroup> { getTalkgroup(sys: number, tg: number): Observable<Talkgroup> {
let tgid = <TGID>{ sys: sys, tg: tg }; const key = this.tgKey(sys, tg);
if (!this._getTalkgroup.get(tgid)) { if (!this._getTalkgroup.get(key)) {
this._getTalkgroup.set( return this.tgs$.pipe(
tgid, concatMap((talkg) =>
this.http talkg.filter((tgv) => tgv.tgid == tg && tgv.system_id == sys),
.get<Talkgroup>(`/api/talkgroup/${sys}/${tg}`) ),
.pipe(shareReplay()),
); );
} }
return this._getTalkgroup.get(key)!;
return this._getTalkgroup.get(tgid)!;
} }
importRR(sysID: number, content: string): Observable<Talkgroup[]> { importRR(sysID: number, content: string): Observable<Talkgroup[]> {
@ -71,7 +102,7 @@ export class TalkgroupService {
} }
putTalkgroup(tu: TalkgroupUpdate): Observable<Talkgroup> { putTalkgroup(tu: TalkgroupUpdate): Observable<Talkgroup> {
let tgid = <TGID>{ sys: tu.system_id, tg: tu.tgid }; let tgid = this.tgKey(tu.system_id, tu.tgid);
this._getTalkgroup.set( this._getTalkgroup.set(
tgid, tgid,
this.http this.http