All files / lib/api/core httpHelpers.ts

90.69% Statements 39/43
66.66% Branches 10/15
60% Functions 3/5
90.24% Lines 37/41

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 10424x                   24x       22x     22x 22x       22x         22x     22x 12x 12x 12x 4x     22x                       24x         16x 16x 16x 16x 16x       14x   14x                         24x 5x 5x 5x 5x 5x 5x 4x 4x             3x 2x 2x 1x 1x   1x   1x      
import { getAuthToken } from './tokenHelpers';
 
/**
 * Construit les en-têtes HTTP pour une requête API
 * @param requiresAuth - Indique si la requête nécessite une authentification
 * @param baseHeaders - En-têtes de base à inclure (optionnel)
 * @returns Headers configurés pour la requête
 * @example
 * const headers = buildHeaders(true, { 'Custom-Header': 'value' });
 */
export function buildHeaders(
  requiresAuth: boolean,
  baseHeaders: HeadersInit = {}
): HeadersInit {
    const headers: Record<string, string> = {
        "Content-Type": "application/json",
    };
    if (baseHeaders) {
        Iif (baseHeaders instanceof Headers) {
            baseHeaders.forEach((value, key) => {
                headers[key] = value;
            });
        } else Iif (Array.isArray(baseHeaders)) {
            baseHeaders.forEach(([key, value]) => {
                headers[key] = value;
            });
        } else {
            Object.assign(headers, baseHeaders);
        }
    }
    if (requiresAuth) {
        const token = getAuthToken();
        console.log('[buildHeaders] Token utilisé:', token);
        if (token) {
            headers['Authorization'] = `Bearer ${token}`;
        }
    }
    return headers;
}
 
 
/**
 * Effectue une requête HTTP vers l'API avec gestion des en-têtes et de l'authentification
 * @param endpoint - Point de terminaison de l'API
 * @param options - Options de la requête fetch
 * @param requiresAuth - Indique si la requête nécessite une authentification
 * @returns Promise contenant la réponse Response
 * @throws Error - En cas d'erreur réseau ou de configuration
 */
export async function makeRequest(
    endpoint: string,
    options: RequestInit = {},
    requiresAuth: boolean = true
): Promise<Response> {
    const headers = buildHeaders(requiresAuth, options.headers);
    const baseUrl = process.env.NEXT_PUBLIC_API_URL;
    const cleanEndpoint = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;
    console.log('[makeRequest] URL:', baseUrl + cleanEndpoint, 'Headers:', headers);
    const response = await fetch(baseUrl + cleanEndpoint, {
        ...options,
        headers,
    });
    console.log(headers)
    // Ne pas lever d'erreur ici, laisser fetchApi gérer le 401 et autres erreurs
    return response;
}
 
 
/**
 * Tente de rafraîchir le token d'authentification en utilisant le refresh token
 * @returns Promise<boolean> - true si le token a été rafraîchi avec succès, false sinon
 * @example
 * const success = await tryRefreshToken();
 * if (success) {
 *   // Token rafraîchi, on peut réessayer la requête
 * }
 */
export async function tryRefreshToken(): Promise<boolean> {
  console.log("[tryRefreshToken] Tentative de rafraîchissement du token");
  const refreshTokenKey = process.env.NEXT_PUBLIC_AUTH_REFRESH_TOKEN_KEY!;
  const tokenKey = process.env.NEXT_PUBLIC_AUTH_TOKEN_KEY!;
  const baseUrl = process.env.NEXT_PUBLIC_API_URL!;
  const refreshToken = localStorage.getItem(refreshTokenKey);
  if (!refreshToken) return false;
  try {
    const response = await fetch(`${baseUrl}/auth/refresh/`, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({ refresh: refreshToken }),
    });
    if (!response.ok) return false;
    const data = await response.json();
    if (data.access) {
      localStorage.setItem(tokenKey, data.access);
      return true;
    }
    return false;
  } catch {
    return false;
  }
}