+51
-41
@@ -1,60 +1,70 @@
|
||||
const { PrismaClient } = require('@prisma/client');
|
||||
const bcrypt = require('bcrypt');
|
||||
const { v4: uuidv4 } = require('uuid');
|
||||
const crypto = require('crypto');
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
const VENUE_NAME = process.env.SETUP_VENUE_NAME || process.argv[2] || 'My Venue';
|
||||
const ADMIN_EMAIL = process.env.SETUP_ADMIN_EMAIL || process.argv[3] || 'admin@example.com';
|
||||
const ADMIN_PASSWORD = process.env.SETUP_ADMIN_PASSWORD || process.argv[4] || 'admin123';
|
||||
const args = process.argv.slice(2).filter((arg) => arg !== '--force');
|
||||
const FORCE = process.argv.includes('--force');
|
||||
const VENUE_NAME = process.env.SETUP_VENUE_NAME || args[0] || 'My Venue';
|
||||
const ADMIN_EMAIL = process.env.SETUP_ADMIN_EMAIL || args[1];
|
||||
const ADMIN_PASSWORD = process.env.SETUP_ADMIN_PASSWORD || args[2];
|
||||
|
||||
async function main() {
|
||||
console.log('=== KoolTap Production Setup ===\n');
|
||||
|
||||
// Wipe everything
|
||||
await prisma.auditLog.deleteMany();
|
||||
await prisma.remoteCommand.deleteMany();
|
||||
await prisma.openTabSnapshot.deleteMany();
|
||||
await prisma.tabOwnership.deleteMany();
|
||||
await prisma.refreshToken.deleteMany();
|
||||
await prisma.registrationCode.deleteMany();
|
||||
await prisma.device.deleteMany();
|
||||
await prisma.clientUser.deleteMany();
|
||||
await prisma.venue.deleteMany();
|
||||
console.log('✓ Cleared existing data');
|
||||
const venues = await prisma.venue.count();
|
||||
if (venues > 0 && !FORCE) {
|
||||
console.log(`The database already has ${venues} venue(s); nothing to do. Pass --force to wipe ALL data and start over.`);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!ADMIN_EMAIL || !ADMIN_PASSWORD) {
|
||||
throw new Error('Usage: node prisma/setup.js "<venue name>" <admin email> <admin password> [--force]');
|
||||
}
|
||||
if (ADMIN_PASSWORD.length < 10) {
|
||||
throw new Error('The admin password must be at least 10 characters');
|
||||
}
|
||||
|
||||
// Create venue
|
||||
const venueId = uuidv4();
|
||||
await prisma.venue.create({ data: { id: venueId, name: VENUE_NAME } });
|
||||
console.log(`✓ Created venue: ${VENUE_NAME}`);
|
||||
|
||||
// Create admin user
|
||||
const hash = await bcrypt.hash(ADMIN_PASSWORD, 10);
|
||||
await prisma.clientUser.create({
|
||||
data: {
|
||||
id: uuidv4(),
|
||||
venueId,
|
||||
email: ADMIN_EMAIL,
|
||||
passwordHash: hash,
|
||||
name: 'Admin',
|
||||
role: 'admin',
|
||||
},
|
||||
});
|
||||
console.log(`✓ Created admin: ${ADMIN_EMAIL}`);
|
||||
|
||||
console.log('\n=== Setup complete ===');
|
||||
await prisma.$transaction(async (tx) => {
|
||||
await tx.auditLog.deleteMany();
|
||||
await tx.tabReminder.deleteMany();
|
||||
await tx.plannedTab.deleteMany();
|
||||
await tx.remoteCommand.deleteMany();
|
||||
await tx.openTabSnapshot.deleteMany();
|
||||
await tx.tabOwnership.deleteMany();
|
||||
await tx.refreshToken.deleteMany();
|
||||
await tx.registrationCode.deleteMany();
|
||||
await tx.device.deleteMany();
|
||||
await tx.clientUser.deleteMany();
|
||||
await tx.venue.deleteMany();
|
||||
|
||||
await tx.venue.create({ data: { id: venueId, name: VENUE_NAME } });
|
||||
await tx.clientUser.create({
|
||||
data: {
|
||||
id: uuidv4(),
|
||||
venueId,
|
||||
email: ADMIN_EMAIL,
|
||||
passwordHash: hash,
|
||||
name: 'Admin',
|
||||
role: 'admin',
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
console.log('=== Setup complete ===');
|
||||
console.log(` Venue: ${VENUE_NAME}`);
|
||||
console.log(` Venue ID: ${venueId}`);
|
||||
console.log(` Admin: ${ADMIN_EMAIL}`);
|
||||
console.log(` Password: ${ADMIN_PASSWORD}`);
|
||||
console.log('\nSave the Venue ID — the Flutter app needs it to find your venue.');
|
||||
console.log('Login at https://kooltap.com with the admin credentials above.');
|
||||
|
||||
await prisma.$disconnect();
|
||||
console.log('\nLog in to the dashboard with the admin credentials you provided.');
|
||||
}
|
||||
|
||||
main().catch((err) => {
|
||||
console.error('Setup failed:', err);
|
||||
process.exit(1);
|
||||
});
|
||||
main()
|
||||
.catch((err) => {
|
||||
console.error('Setup failed:', err.message ?? err);
|
||||
process.exitCode = 1;
|
||||
})
|
||||
.finally(() => prisma.$disconnect());
|
||||
|
||||
Reference in New Issue
Block a user