All files / app/services user.service.ts

89.47% Statements 34/38
76% Branches 19/25
100% Functions 9/9
89.47% Lines 34/38

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 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151                                1x 11x     11x 11x             1x                 4x       4x             4x 4x 4x 4x     4x 4x 4x 4x     4x   1x   1x 1x 1x                 3x       4x 2x   4x 1x     4x                     4x     4x                 1x                 1x                 2x           2x 2x                     1x          
import { Injectable } from '@angular/core';
import { HttpClient, HttpParams } from '@angular/common/http';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
import { environment } from '../config/environment';
import { AuthService } from './auth.service';
import {
  User,
  UpdateUserRequest,
  PageUser,
  Win
} from '../models';
 
@Injectable({
  providedIn: 'root'
})
export class UserService {
  private readonly API_URL = `${environment.apiUrl}/users`;
 
  constructor(
    private http: HttpClient,
    private authService: AuthService
  ) {}
 
  /**
   * Obtenir le profil de l'utilisateur connecté
   */
  getCurrentUser(): Observable<User> {
    return this.http.get<User>(`${this.API_URL}/me`, {
      headers: this.authService.getAuthHeaders()
    });
  }
 
  /**
   * Lister les utilisateurs (paginé)
   */
  getAllUsers(page: number = 0, size: number = 10): Observable<PageUser> {
    const params = new HttpParams()
      .set('page', page.toString())
      .set('size', size.toString());
 
    return this.http.get<any>(this.API_URL, {
      params,
      headers: this.authService.getAuthHeaders()
    }).pipe(
      map((response: any) => {
        // Mapper la réponse de l'API vers le format PageUser
        // Spring Data peut retourner différentes structures selon la version
        const content = response.content || [];
        const pageable = response.pageable || {};
        const currentPageNumber = response.number !== undefined ? response.number : (pageable.pageNumber !== undefined ? pageable.pageNumber : page);
        const pageSize = response.size || pageable.pageSize || size;
        
        // Calculer totalElements et totalPages
        let totalElements = response.totalElements;
        let totalPages = response.totalPages;
        let isLast = response.last;
        let isFirst = response.first;
        
        // Si totalElements n'est pas fourni, essayer de l'estimer
        if (totalElements === undefined || totalElements === null) {
          // Si on est à la dernière page et qu'on connaît le nombre d'éléments
          if (content.length < pageSize) {
            // Probablement la dernière page
            totalElements = (currentPageNumber * pageSize) + content.length;
            totalPages = Math.ceil(totalElements / pageSize);
            isLast = true;
          } else E{
            // On ne peut pas déterminer le total, utiliser une valeur par défaut
            // qui permettra la pagination même si on ne connaît pas le total exact
            totalElements = (currentPageNumber + 1) * pageSize; // Estimation minimale
            totalPages = Math.ceil(totalElements / pageSize);
            isLast = false;
          }
        } else {
          totalPages = totalPages || Math.ceil(totalElements / pageSize);
        }
        
        // Déterminer first et last si non fournis
        if (isFirst === undefined) {
          isFirst = currentPageNumber === 0;
        }
        if (isLast === undefined) {
          isLast = currentPageNumber >= (totalPages - 1);
        }
        
        const pageUser: PageUser = {
          content: content,
          totalElements: totalElements,
          totalPages: totalPages,
          size: pageSize,
          number: currentPageNumber,
          first: isFirst,
          last: isLast
        };
        
        // Logs uniquement pour la première page ou en cas d'erreur
        if (page === 0) {
        }
        
        return pageUser;
      })
    );
  }
 
  /**
   * Mettre à jour un utilisateur (PUT - remplace toutes les données)
   */
  updateUser(id: number, userData: UpdateUserRequest): Observable<User> {
    return this.http.put<User>(`${this.API_URL}/${id}`, userData, {
      headers: this.authService.getAuthHeaders()
    });
  }
 
  /**
   * Mettre à jour partiellement un utilisateur (PATCH)
   */
  updatePartialUser(id: number, userData: UpdateUserRequest): Observable<User> {
    return this.http.patch<User>(`${this.API_URL}/${id}`, userData, {
      headers: this.authService.getAuthHeaders()
    });
  }
 
  /**
   * Supprimer un utilisateur
   */
  deleteUser(id: number): Observable<any> {
    return this.http.delete(`${this.API_URL}/${id}`, {
      headers: this.authService.getAuthHeaders(),
      responseType: 'text' as 'json' // Accepter les réponses texte du backend
    }).pipe(
      map((response: any) => {
        // Si la réponse est une chaîne, la convertir en objet
        if (typeof response === 'string') {
          return { message: response, success: true };
        }
        return response;
      })
    );
  }
 
  /**
   * Obtenir l'historique des gains d'un utilisateur
   */
  getUserWins(id: number): Observable<Win[]> {
    return this.http.get<Win[]>(`${this.API_URL}/${id}/wins`, {
      headers: this.authService.getAuthHeaders()
    });
  }
}