import { Injectable } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; import { Observable } from 'rxjs'; import { shareReplay, tap } from 'rxjs/operators'; import { Template, TemplateCreate } from './template.model'; /** * Service HTTP pour la gestion des Templates. * Port de sortie du Frontend vers le Backend Java (/api/templates). * * `getByLoreId` est cache via shareReplay(1) — toute mutation * (create/update/delete) invalide l'ensemble du cache. */ @Injectable({ providedIn: 'root' }) export class TemplateService { private apiUrl = '/api/templates'; private byLoreIdCache = new Map>(); constructor(private http: HttpClient) {} private invalidate(): void { this.byLoreIdCache.clear(); } /** Tous les templates d'un Lore (alimente le panneau sidebar). */ getByLoreId(loreId: string): Observable { let obs = this.byLoreIdCache.get(loreId); if (!obs) { const params = new HttpParams().set('loreId', loreId); obs = this.http.get(this.apiUrl, { params }).pipe( tap({ error: () => this.byLoreIdCache.delete(loreId) }), shareReplay(1) ); this.byLoreIdCache.set(loreId, obs); } return obs; } getById(id: string): Observable