Files
peakskills/scripts/sync-teams.ts
Julien Froidefond a4b680b092 refactor: update database setup and remove skills migration API
- Changed migration commands in DATABASE_SETUP.md to use `pnpm run sync-skills` and `pnpm run sync-teams`.
- Removed the skills migration API endpoint in route.ts, streamlining the migration process.
- Updated MIGRATION_UUID.md to reflect changes in migration steps and removed the old skills migration script.
- Added new sync scripts for skills and teams in package.json.
- Cleaned up init.sql by removing old teams data insertion and adjusted comments for clarity.
2025-08-21 15:21:36 +02:00

149 lines
4.5 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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<void> {
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<string, Team>();
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 };