- 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.
149 lines
4.5 KiB
TypeScript
149 lines
4.5 KiB
TypeScript
#!/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 };
|