From 1ff70a9f7f35652fbf0457f2190fa66c64d26000 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rados=C5=82aw=20Gierwia=C5=82o?= Date: Sat, 6 Dec 2025 17:50:57 +0100 Subject: [PATCH] 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 --- backend/package.json | 3 +- backend/scripts/create-event.js | 70 +++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 backend/scripts/create-event.js diff --git a/backend/package.json b/backend/package.json index 7e1f61b..349e85c 100644 --- a/backend/package.json +++ b/backend/package.json @@ -14,7 +14,8 @@ "prisma:seed:dev": "node prisma/seed.development.js", "prisma:seed:prod": "node prisma/seed.production.js", "prisma:studio": "prisma studio", - "cli": "node src/cli/index.js" + "cli": "node src/cli/index.js", + "event:create": "node scripts/create-event.js" }, "keywords": [ "webrtc", diff --git a/backend/scripts/create-event.js b/backend/scripts/create-event.js new file mode 100644 index 0000000..f061324 --- /dev/null +++ b/backend/scripts/create-event.js @@ -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 + * 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 '); + 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();