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.
This commit is contained in:
Julien Froidefond
2025-08-21 15:21:36 +02:00
parent dad172157b
commit a4b680b092
11 changed files with 317 additions and 205 deletions

148
scripts/sync-teams.ts Normal file
View File

@@ -0,0 +1,148 @@
#!/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 };