All files / app/services cookie.service.ts

87.03% Statements 47/54
76.92% Branches 10/13
78.57% Functions 11/14
88% Lines 44/50

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 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177                              1x 31x 31x 31x 31x 31x           17x             2x 2x     2x     2x 2x 1x 1x                   1x           1x                           2x 2x 1x 1x 1x 1x 1x                     21x 21x 2x     19x                     1x                     3x   3x             3x         3x                                 2x 2x 2x 2x             3x 3x 3x 3x 3x 3x   2x             1x        
import { Injectable, inject } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { AuthService } from './auth.service';
import { Observable, of } from 'rxjs';
import { catchError, tap } from 'rxjs/operators';
 
export interface CookiePreferences {
  essential: boolean; // Toujours true, ne peut pas être désactivé
  analytics: boolean;
  marketing: boolean;
}
 
@Injectable({
  providedIn: 'root'
})
export class CookieService {
  private http = inject(HttpClient);
  private authService = inject(AuthService);
  private readonly API_URL = 'http://localhost:8081/api';
  private readonly COOKIE_CONSENT_KEY = 'cookie_consent';
  private readonly COOKIE_PREFERENCES_KEY = 'cookie_preferences';
 
  /**
   * Vérifie si l'utilisateur a déjà donné son consentement aux cookies
   */
  hasConsent(): boolean {
    return localStorage.getItem(this.COOKIE_CONSENT_KEY) === 'true';
  }
 
  /**
   * Enregistre le consentement de l'utilisateur
   */
  setConsent(preferences: CookiePreferences): void {
    localStorage.setItem(this.COOKIE_CONSENT_KEY, 'true');
    localStorage.setItem(this.COOKIE_PREFERENCES_KEY, JSON.stringify(preferences));
    
    // Appliquer les préférences
    this.applyCookiePreferences(preferences);
    
    // Si l'utilisateur est connecté, sauvegarder aussi dans le backend
    const currentUser = this.authService.getCurrentUserSync();
    if (currentUser && currentUser.id) {
      this.savePreferencesToBackend(currentUser.id, preferences).subscribe({
        next: () => console.log('Préférences de cookies sauvegardées dans le backend'),
        error: (error) => console.warn('Erreur lors de la sauvegarde des préférences:', error)
      });
    }
  }
 
  /**
   * Sauvegarde les préférences de cookies dans le backend (si utilisateur connecté)
   */
  private savePreferencesToBackend(userId: number, preferences: CookiePreferences): Observable<any> {
    const payload = {
      cookiePreferences: JSON.stringify(preferences),
      cookieConsentGiven: true
    };
    
    // Utiliser l'endpoint existant updatePartialUser
    return this.http.patch(`${this.API_URL}/users/${userId}`, payload, {
      headers: this.authService.getAuthHeaders()
    }).pipe(
      catchError(error => {
        // Si erreur, continuer quand même (les préférences sont dans localStorage)
        return of(null);
      })
    );
  }
 
  /**
   * Charge les préférences de cookies depuis le backend (si utilisateur connecté)
   */
  loadPreferencesFromBackend(): void {
    const currentUser = this.authService.getCurrentUserSync();
    if (currentUser && currentUser.cookiePreferences) {
      try {
        const preferences = JSON.parse(currentUser.cookiePreferences);
        localStorage.setItem(this.COOKIE_PREFERENCES_KEY, JSON.stringify(preferences));
        localStorage.setItem(this.COOKIE_CONSENT_KEY, 'true');
        this.applyCookiePreferences(preferences);
      } catch (error) {
        console.warn('Erreur lors du chargement des préférences depuis le backend:', error);
      }
    }
  }
 
  /**
   * Récupère les préférences de cookies de l'utilisateur
   */
  getPreferences(): CookiePreferences {
    const stored = localStorage.getItem(this.COOKIE_PREFERENCES_KEY);
    if (stored) {
      return JSON.parse(stored);
    }
    // Par défaut, seulement les cookies essentiels
    return {
      essential: true,
      analytics: false,
      marketing: false
    };
  }
 
  /**
   * Récupère le consentement actuel (alias pour getPreferences pour cohérence)
   */
  getConsent(): CookiePreferences {
    return this.getPreferences();
  }
 
  /**
   * Applique les préférences de cookies
   */
  private applyCookiePreferences(preferences: CookiePreferences): void {
    // Cookies essentiels : toujours activés
    // Ces cookies sont nécessaires au fonctionnement du site
    
    // Cookies analytiques
    if (preferences.analytics) {
      // Ici vous pouvez initialiser Google Analytics, etc.
      console.log('Cookies analytiques activés');
    } else E{
      // Désactiver les cookies analytiques
      console.log('Cookies analytiques désactivés');
    }
 
    // Cookies marketing
    Iif (preferences.marketing) {
      // Ici vous pouvez initialiser les pixels de suivi publicitaire, etc.
      console.log('Cookies marketing activés');
    } else {
      // Désactiver les cookies marketing
      console.log('Cookies marketing désactivés');
    }
  }
 
  /**
   * Supprime tous les cookies (sauf les essentiels)
   */
  clearNonEssentialCookies(): void {
    // Supprimer les cookies analytiques et marketing
    // Cette fonction peut être appelée si l'utilisateur change ses préférences
    console.log('Suppression des cookies non essentiels');
  }
 
  /**
   * Définit un cookie
   */
  setCookie(name: string, value: string, days: number = 365): void {
    const date = new Date();
    date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
    const expires = `expires=${date.toUTCString()}`;
    document.cookie = `${name}=${value};${expires};path=/;SameSite=Lax`;
  }
 
  /**
   * Récupère un cookie
   */
  getCookie(name: string): string | null {
    const nameEQ = name + '=';
    const ca = document.cookie.split(';');
    for (let i = 0; i < ca.length; i++) {
      let c = ca[i];
      while (c.charAt(0) === ' ') c = c.substring(1, c.length);
      if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);
    }
    return null;
  }
 
  /**
   * Supprime un cookie
   */
  deleteCookie(name: string): void {
    document.cookie = `${name}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;`;
  }
}