edtech / apps /api /src /scripts /inject-missing-images.ts
CognxSafeTrack
fix(qa): resolve missing image anomalies and secure pedagogy worker TTS audio flow
082d3db
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function injectMissingImages() {
console.log("🖼️ Démarrage de l'injection des visuels manquants...");
const tracks = await prisma.track.findMany({
include: { days: true }
});
let imagesInjected = 0;
for (const track of tracks) {
// Find sector generic name
const sectorStr = track.title.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9]/g, "_");
let fallbackUrl = `https://r2.xamle.sn/branding/${sectorStr}_generic.png`;
// If it's the core tracks, we might just use a general fallback if sector isn't in title
if (track.id.startsWith("T")) {
fallbackUrl = 'https://r2.xamle.sn/branding/general_generic.png';
if (track.title.toLowerCase().includes("restauration")) fallbackUrl = 'https://r2.xamle.sn/branding/restauration_generic.png';
if (track.title.toLowerCase().includes("couture")) fallbackUrl = 'https://r2.xamle.sn/branding/couture_generic.png';
} else {
fallbackUrl = `https://r2.xamle.sn/branding/${sectorStr}_generic.png`;
}
for (const day of track.days) {
// Specifically fixing days 5, 8, 10 and any other day missing visuals
if (!day.imageUrl && !day.videoUrl) {
await prisma.trackDay.update({
where: { id: day.id },
data: { imageUrl: fallbackUrl }
});
console.log(`✅ Injected generic image for Track ${track.id} Day ${day.dayNumber}`);
imagesInjected++;
}
}
}
console.log(`\n🎉 Injection terminée ! ${imagesInjected} images de secours (Couture, Restauration...) ajoutées en BDD.`);
await prisma.$disconnect();
}
injectMissingImages().catch(e => {
console.error(e);
process.exit(1);
});