import { inject, Injectable } from '@angular/core'; import { Policy } from '../models/policy'; import { Observable, of, map } from 'rxjs'; import { HermesClientService } from '../../hermes-client.service'; import EventService from './EventService'; @Injectable({ providedIn: 'root' }) export default class PolicyService { private readonly client = inject(HermesClientService); private readonly events = inject(EventService); private data: Policy[] = [] private loaded = false; create$: Observable | undefined; update$: Observable | undefined; delete$: Observable | undefined; constructor() { this.create$ = this.client.filterByRequestType('create_policy'); this.update$ = this.client.filterByRequestType('update_policy'); this.delete$ = this.client.filterByRequestType('delete_policy'); this.create$?.subscribe(d => this.data.push(d.data)); this.update$?.subscribe(d => { const policy = this.data.find(p => p.id == d.data.id); if (policy) { policy.group_id = d.data.group_id; policy.path = d.data.path; policy.span = d.data.span; policy.usage = d.data.usage; } }); this.delete$?.subscribe(d => this.data = this.data.filter(r => r.id != d.request.data.id)); this.events.listen('tts_logoff', () => { this.data = []; this.loaded = false; }); } fetch() { if (this.loaded) { return of(this.data); } const $ = this.client.first(d => d.d.request.type == 'get_policies')!.pipe(map(d => d.d.data)); $.subscribe(d => { this.data = d; this.loaded = true; }); this.client.fetchPolicies(); return $; } }