rebours/clean-duplicates.mjs
2026-03-30 18:03:12 +02:00

66 lines
1.7 KiB
JavaScript

import { createClient } from '@sanity/client'
import dotenv from 'dotenv'
dotenv.config()
const client = createClient({
projectId: process.env.SANITY_PROJECT_ID,
dataset: process.env.SANITY_DATASET || 'production',
apiVersion: '2024-01-01',
useCdn: false,
token: process.env.SANITY_API_TOKEN,
})
async function cleanDuplicates() {
console.log('🔍 Recherche des produits...\n')
const products = await client.fetch(
`*[_type == "product"] | order(name asc, _createdAt asc) { _id, name, slug, _createdAt }`
)
console.log(` Total: ${products.length} produits trouvés\n`)
// Group by slug
const grouped = {}
for (const p of products) {
const key = p.slug?.current || p.name
if (!grouped[key]) grouped[key] = []
grouped[key].push(p)
}
const toDelete = []
for (const [key, docs] of Object.entries(grouped)) {
if (docs.length > 1) {
console.log(` ⚠️ "${key}" — ${docs.length} exemplaires`)
// Keep the first (oldest), delete the rest
const [keep, ...duplicates] = docs
console.log(` ✓ Garder: ${keep._id} (${keep._createdAt})`)
for (const dup of duplicates) {
console.log(` ✗ Supprimer: ${dup._id} (${dup._createdAt})`)
toDelete.push(dup._id)
}
console.log()
}
}
if (toDelete.length === 0) {
console.log('✅ Aucun doublon trouvé !')
return
}
console.log(`\n🗑️ Suppression de ${toDelete.length} doublon(s)...\n`)
const tx = client.transaction()
for (const id of toDelete) {
tx.delete(id)
}
await tx.commit()
console.log('✅ Doublons supprimés !')
}
cleanDuplicates().catch((err) => {
console.error('❌ Erreur:', err.message)
process.exit(1)
})