All files / app/services draw.service.ts

100% Statements 33/33
84% Branches 21/25
100% Functions 11/11
100% Lines 27/27

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119                      1x 11x     11x 11x               5x 5x 1x     5x           3x 2x   2x         2x         2x       1x                       5x         4x 1x                 3x   2x 1x 1x     1x                 1x 1x 1x     1x                   1x                
import { Injectable } from '@angular/core';
import { HttpClient, HttpParams, HttpErrorResponse } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { catchError, map } from 'rxjs/operators';
import { environment } from '../config/environment';
import { AuthService } from './auth.service';
import { PerformDrawResponse, FinalWinnerResponse } from '../models';
 
@Injectable({
  providedIn: 'root'
})
export class DrawService {
  private readonly API_URL = `${environment.apiUrl}/draw`;
 
  constructor(
    private http: HttpClient,
    private authService: AuthService
  ) {}
 
  /**
   * Effectuer le tirage final du jeu concours (admin)
   * Gère les cas où le backend retourne du texte brut au lieu de JSON
   */
  performFinalDraw(seed?: number): Observable<PerformDrawResponse> {
    let params = new HttpParams();
    if (seed !== undefined) {
      params = params.set('seed', seed.toString());
    }
 
    return this.http.post<PerformDrawResponse>(`${this.API_URL}/final`, {}, {
      params,
      headers: this.authService.getAuthHeaders()
    }).pipe(
      catchError((error: HttpErrorResponse) => {
        // Si le backend retourne du texte brut dans error.error
        if (error.error && typeof error.error === 'string') {
          const textResponse = error.error as string;
          // Extraire le message d'erreur du texte
          const errorMessage = textResponse.includes('Aucun') || textResponse.includes('aucun') 
            ? textResponse 
            : `Erreur lors du tirage final: ${textResponse}`;
          
          // Créer une erreur avec le message extrait
          const customError: any = {
            status: error.status,
            message: errorMessage,
            error: { message: errorMessage, error: textResponse }
          };
          return throwError(() => customError);
        }
        
        // Pour les autres erreurs, on propage l'erreur originale
        return throwError(() => error);
      })
    );
  }
 
  /**
   * Obtenir le gagnant du tirage final
   * Gère les cas où le backend retourne 400 ou 404 (pas de gagnant) ou du texte brut
   * Les erreurs 400/404 sont considérées comme normales (pas de gagnant)
   * Utilise responseType: 'json' avec catchError pour gérer les erreurs proprement
   */
  getFinalWinner(): Observable<FinalWinnerResponse> {
    return this.http.get<FinalWinnerResponse>(`${this.API_URL}/winner`, {
      headers: this.authService.getAuthHeaders()
    }).pipe(
      catchError((error: HttpErrorResponse) => {
        // Si c'est une erreur 404 (pas de gagnant) - cas normal après correction backend
        if (error.status === 404) {
          return throwError(() => ({ 
            status: 404, 
            message: 'No winner found',
            silent: true
          }));
        }
        
        // Si c'est encore une erreur 400 (ancien backend non redémarré)
        // Vérifier si c'est un JSON avec un message d'erreur
        if (error.status === 400) {
          // Si c'est un objet JSON avec une propriété "error"
          if (error.error && typeof error.error === 'object' && error.error.error) {
            const errorMessage = error.error.error;
            if (errorMessage.includes('Aucun tirage') || 
                errorMessage.includes('aucun tirage') ||
                errorMessage.includes('pas de tirage')) {
              return throwError(() => ({ 
                status: 404, 
                message: 'No winner found',
                silent: true
              }));
            }
          }
          
          // Si c'est du texte brut
          if (error.error && typeof error.error === 'string') {
            const textResponse = error.error as string;
            if (textResponse.includes('Aucun tirage') || 
                textResponse.includes('aucun tirage') ||
                textResponse.includes('pas de tirage')) {
              return throwError(() => ({ 
                status: 404, 
                message: 'No winner found',
                silent: true
              }));
            }
          }
        }
        
        // Pour les vraies erreurs, on propage l'erreur originale
        return throwError(() => error);
      })
    );
  }
}