const { Client, Databases, Query } = require('node-appwrite'); require('dotenv').config({ path: '.env.local' }); const client = new Client() .setEndpoint(process.env.NEXT_PUBLIC_APPWRITE_ENDPOINT) .setProject(process.env.NEXT_PUBLIC_APPWRITE_PROJECT_ID) .setKey(process.env.APPWRITE_API_KEY); const databases = new Databases(client); const DB_ID = process.env.APPWRITE_DATABASE_ID; const makeSlug = (text) => { if (!text) return ''; return text .normalize("NFD") .replace(/[\u0300-\u036f]/g, "") .toLowerCase() .replace(/[^a-z0-9]+/g, '-') .replace(/(^-|-$)+/g, ''); }; async function updateSlugs() { try { console.log('Connecting to Appwrite to update Multivision slugs...'); const collections = await databases.listCollections(DB_ID); const map = {}; collections.collections.forEach(c => { map[c.name.toLowerCase()] = c.$id; }); const postsCollectionId = map['posts'] || 'posts'; let cursor = null; let updatedCount = 0; let totalCount = 0; while (true) { const queries = [ Query.startsWith('slug', 'multivision-'), Query.limit(100) ]; if (cursor) queries.push(Query.cursorAfter(cursor)); const res = await databases.listDocuments(DB_ID, postsCollectionId, queries); console.log(`Fetched ${res.documents.length} matching documents in this batch.`); for (const doc of res.documents) { totalCount++; const newSlug = makeSlug(doc.titulo); console.log(`Updating document ${doc.$id}`); console.log(` Old slug: ${doc.slug}`); console.log(` New slug: ${newSlug}`); try { await databases.updateDocument(DB_ID, postsCollectionId, doc.$id, { slug: newSlug }); updatedCount++; } catch (updateErr) { console.error(` Failed to update ${doc.$id}: ${updateErr.message}`); if (updateErr.message.includes('unique') || updateErr.code === 409) { const alternativeSlug = `${newSlug}-${Math.floor(Math.random() * 1000)}`; console.log(` Trying alternative slug: ${alternativeSlug}`); try { await databases.updateDocument(DB_ID, postsCollectionId, doc.$id, { slug: alternativeSlug }); updatedCount++; } catch (e) { console.error(` Failed alternative update for ${doc.$id}: ${e.message}`); } } } } if (res.documents.length < 100) break; cursor = res.documents[res.documents.length - 1].$id; } console.log(`\nOperation complete. Found ${totalCount} multivision posts, successfully updated ${updatedCount}.`); process.exit(0); } catch (error) { console.error('Error:', error); process.exit(1); } } updateSlugs();