feat: add event creation script with random slugs
Add reusable script for creating events with secure random slugs. - Create backend/scripts/create-event.js with CLI interface - Add npm script 'event:create' to package.json - Generate 8-character random hex slugs using crypto - Include date validation and error handling - Display event details and URL after creation
This commit is contained in:
@@ -14,7 +14,8 @@
|
|||||||
"prisma:seed:dev": "node prisma/seed.development.js",
|
"prisma:seed:dev": "node prisma/seed.development.js",
|
||||||
"prisma:seed:prod": "node prisma/seed.production.js",
|
"prisma:seed:prod": "node prisma/seed.production.js",
|
||||||
"prisma:studio": "prisma studio",
|
"prisma:studio": "prisma studio",
|
||||||
"cli": "node src/cli/index.js"
|
"cli": "node src/cli/index.js",
|
||||||
|
"event:create": "node scripts/create-event.js"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"webrtc",
|
"webrtc",
|
||||||
|
|||||||
70
backend/scripts/create-event.js
Normal file
70
backend/scripts/create-event.js
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
#!/usr/bin/env node
|
||||||
|
|
||||||
|
const { PrismaClient } = require('@prisma/client');
|
||||||
|
const crypto = require('crypto');
|
||||||
|
|
||||||
|
const prisma = new PrismaClient();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new event with a random slug
|
||||||
|
* Usage: node scripts/create-event.js <name> <location> <startDate> <endDate>
|
||||||
|
* Example: node scripts/create-event.js "Santa Swing" "Kraków, Poland" "2025-12-12" "2025-12-15"
|
||||||
|
*/
|
||||||
|
async function createEvent() {
|
||||||
|
try {
|
||||||
|
// Parse command-line arguments
|
||||||
|
const args = process.argv.slice(2);
|
||||||
|
|
||||||
|
if (args.length < 4) {
|
||||||
|
console.error('❌ Usage: node scripts/create-event.js <name> <location> <startDate> <endDate>');
|
||||||
|
console.error(' Example: node scripts/create-event.js "Santa Swing" "Kraków, Poland" "2025-12-12" "2025-12-15"');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const [name, location, startDate, endDate] = args;
|
||||||
|
|
||||||
|
// Validate dates
|
||||||
|
const start = new Date(startDate);
|
||||||
|
const end = new Date(endDate);
|
||||||
|
|
||||||
|
if (isNaN(start.getTime()) || isNaN(end.getTime())) {
|
||||||
|
console.error('❌ Invalid date format. Use YYYY-MM-DD format.');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (end < start) {
|
||||||
|
console.error('❌ End date must be after start date.');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate random slug (8 characters alphanumeric)
|
||||||
|
const slug = crypto.randomBytes(4).toString('hex');
|
||||||
|
|
||||||
|
// Create event
|
||||||
|
const event = await prisma.event.create({
|
||||||
|
data: {
|
||||||
|
name,
|
||||||
|
slug,
|
||||||
|
location,
|
||||||
|
startDate: start,
|
||||||
|
endDate: end,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('✅ Event created successfully:');
|
||||||
|
console.log(` ID: ${event.id}`);
|
||||||
|
console.log(` Name: ${event.name}`);
|
||||||
|
console.log(` Slug: ${event.slug}`);
|
||||||
|
console.log(` Location: ${event.location}`);
|
||||||
|
console.log(` Dates: ${event.startDate.toISOString().split('T')[0]} → ${event.endDate.toISOString().split('T')[0]}`);
|
||||||
|
console.log(`\n URL: ${process.env.FRONTEND_URL || 'http://localhost'}/events/${event.slug}`);
|
||||||
|
|
||||||
|
} catch (error) {
|
||||||
|
console.error('❌ Error creating event:', error.message);
|
||||||
|
process.exit(1);
|
||||||
|
} finally {
|
||||||
|
await prisma.$disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
createEvent();
|
||||||
Reference in New Issue
Block a user