almeira-web/update-multivision-slugs.js

91 lines
3.3 KiB
JavaScript

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