All files / lib/api/service epreuveService.ts

100% Statements 28/28
86.53% Branches 45/52
100% Functions 5/5
100% Lines 22/22

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 884x   4x             4x   4x                   4x   4x 1x 1x 1x 1x 1x 1x 1x   1x 1x       4x                     2x                 1x                   1x 1x       4x 9x                            
import {fetchApi} from '@/lib/api/core/fetchWrappers';
import {Epreuve, EpreuveCardType, EpreuveFilters} from '@/type/evenement/epreuve';
import {formatDateFr, formatHeure} from "@/utils/formatDate";
 
export type { EpreuveFilters } from '@/type/evenement/epreuve';
 
/**
 * Service pour la gestion des épreuves sportives
 */
export class EpreuveService {
  /** Chemin de base pour les endpoints des épreuves */
  private static readonly BASE_PATH = '/epreuve';
 
  /**
   * Récupère toutes les épreuves avec filtres optionnels
   * @param filters - Filtres optionnels pour la recherche et pagination
   * @returns Promise<Epreuve[]> - Liste des épreuves
   * @throws Error - En cas d'erreur de l'API ou de réseau
   * Route Django: path('epreuve/', EpreuveListView.as_view(), name='epreuve-list')
   */
  static async getAllEpreuves(filters?: EpreuveFilters): Promise<Epreuve[]> {
    let url = `${this.BASE_PATH}/`;
 
    if (filters) {
      const params = new URLSearchParams();
      if (filters.libelle) params.append('search', filters.libelle);
      if (filters.disciplineId) params.append('disciplineId', filters.disciplineId.toString());
      if (filters.date) params.append('date', filters.date);
      if (filters.tour) params.append('tour', filters.tour);
      if (filters.sortBy) params.append('sortBy', filters.sortBy);
      if (filters.sortOrder) params.append('sortOrder', filters.sortOrder);
 
      if (params.toString()) {
        url += `?${params.toString()}`;
      }
    }
 
    return fetchApi<Epreuve[]>(url,{},false);
  }
 
  /**
   * Récupère une épreuve par son ID
   * @param id - ID de l'épreuve à récupérer
   * @returns Promise<Epreuve> - L'épreuve correspondante
   * @throws Error - En cas d'erreur de l'API ou si l'épreuve n'existe pas
   * Route Django: path('epreuve/<int:pk>/', EpreuveDetailView.as_view(), name='epreuve-detail')
   */
  static async getEpreuveById(id: number): Promise<Epreuve> {
    return fetchApi<Epreuve>(`${this.BASE_PATH}/${id}/`);
  }
 
  /**
   * Transforme une liste d'épreuves en format carte pour l'affichage
   * @param epreuves - Liste des épreuves à transformer
   * @returns EpreuveCardType[] - Liste des épreuves au format carte
   */
  static transformToCardType(epreuves: Epreuve[]): EpreuveCardType[] {
    return epreuves.map(mapEpreuveToCard);
  }
 
  /**
   * Récupère toutes les épreuves directement au format carte pour l'affichage
   * @param filters - Filtres optionnels pour la recherche et pagination
   * @returns Promise<EpreuveCardType[]> - Liste des épreuves au format carte
   * @throws Error - En cas d'erreur de l'API ou de réseau
   */
  static async getAllEvenementsAsCards(filters?: EpreuveFilters): Promise<EpreuveCardType[]> {
    const epreuves = await this.getAllEpreuves(filters);
    return this.transformToCardType(epreuves);
  }
}
 
export function mapEpreuveToCard(epreuve: Epreuve): EpreuveCardType {
  return {
    id: epreuve.id,
    date: formatDateFr(epreuve.evenement?.date) || "Date Inconnue",
    dateRaw: epreuve.evenement?.date || "", // Conserver la date brute
    discipline: epreuve.discipline?.nom || "Inconnu",
    genre: epreuve.genre || "Inconnu",
    libelle: epreuve?.libelle,
    tour: epreuve.tour || "Inconnu",
    lieu: epreuve.evenement?.lieu?.nom || "Lieu inconnu",
    heure: formatHeure(epreuve.evenement?.horraire) || "horaire inconnu",
    icone: epreuve.discipline.icone || ""
  };
 
}