import { Injectable } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; import { Observable } from 'rxjs'; import { Lore, LoreCreate, LoreNode, LoreNodeCreate } from './lore.model'; /** Compte des entités qui seront supprimées en cascade avec un dossier. */ export interface LoreNodeDeletionImpact { /** Sous-dossiers (récursif, sans compter le dossier racine lui-même). */ folders: number; /** Pages dans l'ensemble du sous-arbre. */ pages: number; } /** Compte des entités qui seront supprimées / détachées en cascade avec un Lore. */ export interface LoreDeletionImpact { folders: number; pages: number; templates: number; /** Campagnes qui perdront leur référence au Lore (mais resteront présentes). */ detachedCampaigns: number; } /** * Service HTTP pour la gestion des Lores. * Port de sortie vers le Backend Java (Architecture Hexagonale). */ @Injectable({ providedIn: 'root' }) export class LoreService { private apiUrl = '/api/lores'; private nodesUrl = '/api/lore-nodes'; constructor(private http: HttpClient) {} getAllLores(): Observable { return this.http.get(this.apiUrl); } getLoreById(id: string): Observable { return this.http.get(`${this.apiUrl}/${id}`); } createLore(lore: LoreCreate): Observable { return this.http.post(this.apiUrl, lore); } updateLore(id: string, lore: LoreCreate): Observable { return this.http.put(`${this.apiUrl}/${id}`, lore); } deleteLore(id: string): Observable { return this.http.delete(`${this.apiUrl}/${id}`); } getLoreDeletionImpact(id: string): Observable { return this.http.get(`${this.apiUrl}/${id}/deletion-impact`); } getLoreNodes(loreId: string): Observable { return this.http.get(`${this.nodesUrl}?loreId=${loreId}`); } getLoreNodeById(id: string): Observable { return this.http.get(`${this.nodesUrl}/${id}`); } createLoreNode(node: LoreNodeCreate): Observable { return this.http.post(this.nodesUrl, node); } /** PUT complet — envoie l'objet entier au backend (qui attend un LoreNodeDTO). */ updateLoreNode(id: string, node: LoreNode): Observable { return this.http.put(`${this.nodesUrl}/${id}`, node); } deleteLoreNode(id: string): Observable { return this.http.delete(`${this.nodesUrl}/${id}`); } getLoreNodeDeletionImpact(id: string): Observable { return this.http.get(`${this.nodesUrl}/${id}/deletion-impact`); } searchLores(q: string): Observable { const params = new HttpParams().set('q', q); return this.http.get(`${this.apiUrl}/search`, { params }); } searchLoreNodes(q: string): Observable { const params = new HttpParams().set('q', q); return this.http.get(`${this.nodesUrl}/search`, { params }); } }