#!/usr/bin/env tsx import * as fs from "fs"; import * as path from "path"; import { TeamsService } from "../services/teams-service"; import { Team } from "../lib/types"; interface TeamsData { teams: Team[]; } interface SyncStats { teamsProcessed: number; newTeams: number; updatedTeams: number; skippedTeams: number; } /** * Charge les teams depuis le fichier JSON */ function loadTeamsFromFile(): Team[] { try { const teamsFilePath = path.join(process.cwd(), "data", "teams.json"); const fileContent = fs.readFileSync(teamsFilePath, "utf-8"); const teamsData: TeamsData = JSON.parse(fileContent); console.log(`📁 ${teamsData.teams.length} teams trouvĂ©es dans le fichier`); return teamsData.teams; } catch (error) { console.error("❌ Erreur lors du chargement du fichier teams.json:", error); throw error; } } /** * Synchronise les teams depuis le fichier JSON vers la base de donnĂ©es * - PrĂ©serve les teams existantes (ne modifie que name/direction si changĂ©) * - Ajoute uniquement les nouvelles teams * - Ne supprime jamais de teams */ async function syncTeamsToDatabase(): Promise { try { console.log("🚀 DĂ©marrage de la synchronisation des teams..."); // Charger les teams depuis le fichier JSON const teamsFromFile = loadTeamsFromFile(); // RĂ©cupĂ©rer les teams existantes de la base de donnĂ©es const existingTeams = await TeamsService.getTeams(); console.log(`đŸ’Ÿ ${existingTeams.length} teams existantes en base`); // CrĂ©er un map des teams existantes pour une recherche rapide const existingTeamsMap = new Map(); existingTeams.forEach((team) => { existingTeamsMap.set(team.id, team); }); const stats: SyncStats = { teamsProcessed: 0, newTeams: 0, updatedTeams: 0, skippedTeams: 0, }; // Synchroniser chaque team for (const teamFromFile of teamsFromFile) { const existingTeam = existingTeamsMap.get(teamFromFile.id); if (!existingTeam) { // Nouvelle team - l'ajouter console.log( `➕ Nouvelle team: ${teamFromFile.name} (${teamFromFile.id})` ); await TeamsService.createTeam({ id: teamFromFile.id, name: teamFromFile.name, direction: teamFromFile.direction, }); stats.newTeams++; } else { // Team existante - vĂ©rifier s'il faut mettre Ă  jour const needsUpdate = existingTeam.name !== teamFromFile.name || existingTeam.direction !== teamFromFile.direction; if (needsUpdate) { console.log( `🔄 Mise Ă  jour de la team: ${teamFromFile.name} (${teamFromFile.id})` ); console.log( ` ‱ Name: "${existingTeam.name}" → "${teamFromFile.name}"` ); console.log( ` ‱ Direction: "${existingTeam.direction}" → "${teamFromFile.direction}"` ); await TeamsService.updateTeam(teamFromFile.id, { name: teamFromFile.name, direction: teamFromFile.direction, }); stats.updatedTeams++; } else { console.log( `✅ Team inchangĂ©e: ${teamFromFile.name} (${teamFromFile.id})` ); stats.skippedTeams++; } } stats.teamsProcessed++; } // Afficher les statistiques finales console.log("\n📊 Statistiques de synchronisation:"); console.log(` ‱ Teams traitĂ©es: ${stats.teamsProcessed}`); console.log(` ‱ Nouvelles teams: ${stats.newTeams}`); console.log(` ‱ Teams mises Ă  jour: ${stats.updatedTeams}`); console.log(` ‱ Teams inchangĂ©es: ${stats.skippedTeams}`); // VĂ©rification finale const finalTeams = await TeamsService.getTeams(); console.log(`\n✅ Synchronisation terminĂ©e avec succĂšs!`); console.log(`đŸ’Ÿ Total teams en base: ${finalTeams.length}`); // Afficher les directions disponibles const directions = await TeamsService.getDirections(); console.log(`🎯 Directions disponibles: ${directions.join(", ")}`); } catch (error) { console.error("❌ Erreur lors de la synchronisation:", error); process.exit(1); } } // ExĂ©cuter le script si appelĂ© directement if (require.main === module) { syncTeamsToDatabase() .then(() => { console.log("🎉 Script terminĂ© avec succĂšs"); process.exit(0); }) .catch((error) => { console.error("đŸ’„ Erreur fatale:", error); process.exit(1); }); } export { syncTeamsToDatabase };