import { Injectable } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; import { Observable } from 'rxjs'; import { Campaign, CampaignCreate, Arc, ArcCreate, Chapter, ChapterCreate, Scene, SceneCreate } from './campaign.model'; /** Compte des entités qui seront supprimées en cascade avec la campagne. */ export interface CampaignDeletionImpact { arcs: number; chapters: number; scenes: number; characters: number; } /** Compte des entités qui seront supprimées en cascade avec un arc. */ export interface ArcDeletionImpact { chapters: number; scenes: number; } /** Compte des scènes qui tomberont avec un chapitre. */ export interface ChapterDeletionImpact { scenes: number; } /** * Service HTTP pour la gestion des Campagnes. * Port de sortie vers le Backend Java (Architecture Hexagonale). */ @Injectable({ providedIn: 'root' }) export class CampaignService { private apiUrl = '/api/campaigns'; constructor(private http: HttpClient) {} getAllCampaigns(): Observable { return this.http.get(this.apiUrl); } getCampaignById(id: string): Observable { return this.http.get(`${this.apiUrl}/${id}`); } createCampaign(campaign: CampaignCreate): Observable { return this.http.post(this.apiUrl, campaign); } updateCampaign(id: string, campaign: CampaignCreate): Observable { return this.http.put(`${this.apiUrl}/${id}`, campaign); } deleteCampaign(id: string): Observable { return this.http.delete(`${this.apiUrl}/${id}`); } getCampaignDeletionImpact(id: string): Observable { return this.http.get(`${this.apiUrl}/${id}/deletion-impact`); } // ========== ARC ========== getArcs(campaignId: string): Observable { return this.http.get(`/api/arcs/campaign/${campaignId}`); } getArcById(id: string): Observable { return this.http.get(`/api/arcs/${id}`); } createArc(payload: ArcCreate): Observable { return this.http.post('/api/arcs', payload); } updateArc(id: string, payload: ArcCreate): Observable { return this.http.put(`/api/arcs/${id}`, payload); } deleteArc(id: string): Observable { return this.http.delete(`/api/arcs/${id}`); } getArcDeletionImpact(id: string): Observable { return this.http.get(`/api/arcs/${id}/deletion-impact`); } // ========== CHAPTER ========== getChapters(arcId: string): Observable { return this.http.get(`/api/chapters/arc/${arcId}`); } getChapterById(id: string): Observable { return this.http.get(`/api/chapters/${id}`); } createChapter(payload: ChapterCreate): Observable { return this.http.post('/api/chapters', payload); } updateChapter(id: string, payload: ChapterCreate): Observable { return this.http.put(`/api/chapters/${id}`, payload); } deleteChapter(id: string): Observable { return this.http.delete(`/api/chapters/${id}`); } getChapterDeletionImpact(id: string): Observable { return this.http.get(`/api/chapters/${id}/deletion-impact`); } // ========== SCENE ========== getScenes(chapterId: string): Observable { return this.http.get(`/api/scenes/chapter/${chapterId}`); } getSceneById(id: string): Observable { return this.http.get(`/api/scenes/${id}`); } createScene(payload: SceneCreate): Observable { return this.http.post('/api/scenes', payload); } updateScene(id: string, payload: SceneCreate): Observable { return this.http.put(`/api/scenes/${id}`, payload); } deleteScene(id: string): Observable { return this.http.delete(`/api/scenes/${id}`); } search(q: string): Observable { const params = new HttpParams().set('q', q); return this.http.get(`${this.apiUrl}/search`, { params }); } }