93 lines
3.4 KiB
JavaScript
93 lines
3.4 KiB
JavaScript
const { Client, Databases, Query } = require('node-appwrite');
|
|
require('dotenv').config({ path: '.env.local' });
|
|
|
|
const { applyTablesDbShim } = require('./src/lib/appwrite-tables-shim');
|
|
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);
|
|
applyTablesDbShim(client);
|
|
|
|
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();
|