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:
148
scripts/sync-teams.ts
Normal file
148
scripts/sync-teams.ts
Normal 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 };
|
||||
Reference in New Issue
Block a user