Files
triqura-ecd/scripts/seed-demo-users.ts
2025-11-15 23:59:38 +01:00

159 lines
4.7 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Seed Demo Users Script
*
* Creates demo user accounts in Supabase Auth
* Run this script once after deployment to set up demo accounts
*
* Usage:
* tsx scripts/seed-demo-users.ts
*/
import { config } from 'dotenv'
import { createClient } from '@supabase/supabase-js'
import type { Database } from '@/lib/database.types'
// Load environment variables from .env.local
config({ path: '.env.local' })
const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL!
const supabaseServiceKey = process.env.SUPABASE_SERVICE_ROLE_KEY!
if (!supabaseUrl || !supabaseServiceKey) {
console.error('❌ Missing environment variables!')
console.error('Required: NEXT_PUBLIC_SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY')
process.exit(1)
}
// Create Supabase client with service role (bypasses RLS)
const supabase = createClient<Database>(supabaseUrl, supabaseServiceKey, {
auth: {
autoRefreshToken: false,
persistSession: false
}
})
// Demo users to create
const demoUsers = [
{
email: 'demo@mini-ecd.demo',
password: 'Demo2024!',
access_level: 'interactive' as const,
notes: 'Main interactive demo account - full CRUD access for presentations'
},
{
email: 'readonly@mini-ecd.demo',
password: 'Demo2024!',
access_level: 'read_only' as const,
notes: 'Read-only demo account - view only access for public demos'
},
{
email: 'presenter@mini-ecd.demo',
password: 'Demo2024!',
access_level: 'presenter' as const,
notes: 'Presenter account for live demo sessions with special features'
}
]
async function seedDemoUsers() {
console.log('🌱 Starting demo user seed...\n')
for (const user of demoUsers) {
console.log(`Creating user: ${user.email}...`)
try {
// Step 1: Create auth user
const { data: authData, error: authError } = await supabase.auth.admin.createUser({
email: user.email,
password: user.password,
email_confirm: true, // Auto-confirm email
user_metadata: {
access_level: user.access_level,
is_demo: true
}
})
if (authError) {
// Check if user already exists
if (authError.message.includes('already registered')) {
console.log(` User already exists, fetching existing user...`)
// Get existing user
const { data: existingUsers } = await supabase.auth.admin.listUsers()
const existingUser = existingUsers.users.find(u => u.email === user.email)
if (!existingUser) {
throw new Error('User exists but cannot be found')
}
// Step 2: Upsert to demo_users table
const { error: demoError } = await supabase
.from('demo_users')
.upsert({
user_id: existingUser.id,
access_level: user.access_level,
notes: user.notes,
expires_at: null, // No expiration for main demo accounts
usage_count: 0
}, {
onConflict: 'user_id'
})
if (demoError) throw demoError
console.log(` ✅ Updated demo_users entry for ${user.email}`)
} else {
throw authError
}
} else {
console.log(` ✅ Created auth user: ${authData.user.id}`)
// Step 2: Insert into demo_users table
const { error: demoError } = await supabase
.from('demo_users')
.insert({
user_id: authData.user.id,
access_level: user.access_level,
notes: user.notes,
expires_at: null, // No expiration for main demo accounts
usage_count: 0
})
if (demoError) {
// Cleanup auth user if demo_users insert fails
await supabase.auth.admin.deleteUser(authData.user.id)
throw demoError
}
console.log(` ✅ Created demo_users entry`)
}
console.log(`${user.email} ready!\n`)
} catch (error: any) {
console.error(` ❌ Failed to create ${user.email}:`, error.message)
console.error('')
}
}
console.log('✅ Demo user seed complete!\n')
console.log('📋 Demo Credentials:')
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━')
demoUsers.forEach(user => {
console.log(`Email: ${user.email}`)
console.log(`Password: ${user.password}`)
console.log(`Access: ${user.access_level}`)
console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━')
})
}
// Run the seed
seedDemoUsers()
.then(() => {
console.log('✨ Done!')
process.exit(0)
})
.catch((error) => {
console.error('💥 Fatal error:', error)
process.exit(1)
})