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; playthroughs: 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 { const params = new HttpParams().set('campaignId', campaignId); return this.http.get('/api/arcs', { params }); } 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 ========== /** * Liste les chapitres d'un arc. Si {@code playthroughId} est fourni, le backend * enrichit les DTOs avec progressionStatus + effectiveStatus relatifs à la Partie. */ getChapters(arcId: string, playthroughId?: string): Observable { let params = new HttpParams().set('arcId', arcId); if (playthroughId) params = params.set('playthroughId', playthroughId); return this.http.get('/api/chapters', { params }); } getChapterById(id: string, playthroughId?: string): Observable { let params = new HttpParams(); if (playthroughId) params = params.set('playthroughId', playthroughId); return this.http.get(`/api/chapters/${id}`, { params }); } 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 { const params = new HttpParams().set('chapterId', chapterId); return this.http.get('/api/scenes', { params }); } 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 }); } }