66 lines
No EOL
1.7 KiB
JavaScript
66 lines
No EOL
1.7 KiB
JavaScript
import mongoose from 'mongoose'
|
|
import Event from '../server/models/event.js'
|
|
import { connectDB } from '../server/utils/mongoose.js'
|
|
|
|
// Generate slug from title
|
|
function generateSlug(title) {
|
|
return title
|
|
.toLowerCase()
|
|
.replace(/[^a-z0-9]+/g, '-')
|
|
.replace(/^-+|-+$/g, '')
|
|
}
|
|
|
|
async function migrateEventSlugs() {
|
|
try {
|
|
// Connect to database
|
|
await connectDB()
|
|
console.log('Connected to database')
|
|
|
|
// Find all events without slugs
|
|
const eventsWithoutSlugs = await Event.find({
|
|
$or: [
|
|
{ slug: { $exists: false } },
|
|
{ slug: null },
|
|
{ slug: '' }
|
|
]
|
|
})
|
|
|
|
console.log(`Found ${eventsWithoutSlugs.length} events without slugs`)
|
|
|
|
if (eventsWithoutSlugs.length === 0) {
|
|
console.log('All events already have slugs!')
|
|
return
|
|
}
|
|
|
|
// Generate and assign unique slugs
|
|
for (const event of eventsWithoutSlugs) {
|
|
let baseSlug = generateSlug(event.title)
|
|
let slug = baseSlug
|
|
let counter = 1
|
|
|
|
// Ensure slug is unique
|
|
while (await Event.findOne({ slug, _id: { $ne: event._id } })) {
|
|
slug = `${baseSlug}-${counter}`
|
|
counter++
|
|
}
|
|
|
|
event.slug = slug
|
|
await event.save({ validateBeforeSave: false }) // Skip validation to avoid pre-save hook
|
|
console.log(`✓ Generated slug "${slug}" for event "${event.title}"`)
|
|
}
|
|
|
|
console.log(`Successfully migrated ${eventsWithoutSlugs.length} events!`)
|
|
} catch (error) {
|
|
console.error('Error migrating event slugs:', error)
|
|
} finally {
|
|
await mongoose.connection.close()
|
|
console.log('Database connection closed')
|
|
}
|
|
}
|
|
|
|
// Run migration if called directly
|
|
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
migrateEventSlugs()
|
|
}
|
|
|
|
export default migrateEventSlugs |