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); | |
| }); | |