101 lines
6.4 KiB
TypeScript
101 lines
6.4 KiB
TypeScript
import { PrismaClient } from '@prisma/client'
|
|
import bcrypt from 'bcryptjs'
|
|
|
|
const prisma = new PrismaClient()
|
|
|
|
async function main() {
|
|
console.log('🌱 Seeding database...')
|
|
|
|
// Clear existing data
|
|
await prisma.activityLog.deleteMany()
|
|
await prisma.funnelMetric.deleteMany()
|
|
await prisma.contentSession.deleteMany()
|
|
await prisma.launchTask.deleteMany()
|
|
await prisma.subscriptionTier.deleteMany()
|
|
await prisma.user.deleteMany()
|
|
|
|
// Create users
|
|
const hash = await bcrypt.hash('oskvlabs2026', 10)
|
|
const users = await Promise.all([
|
|
prisma.user.create({ data: { username: 'quo', password: hash, name: 'Olly (Quo)', role: 'member' } }),
|
|
prisma.user.create({ data: { username: 'kevin', password: hash, name: 'Kevin', role: 'member' } }),
|
|
prisma.user.create({ data: { username: 'jake', password: hash, name: 'Jake', role: 'admin' } }),
|
|
prisma.user.create({ data: { username: 'buba', password: hash, name: 'Buba (AI Coach)', role: 'admin' } }),
|
|
])
|
|
console.log(`✅ Created ${users.length} users`)
|
|
|
|
// Create launch tasks
|
|
const tasks = await Promise.all([
|
|
// Phase 1 — Seed Content
|
|
prisma.launchTask.create({ data: { title: 'Post process fragments on @quowavy', description: 'Share BTS/process clips — no links, no prices', phase: 1, sortOrder: 1, status: 'in_progress' } }),
|
|
prisma.launchTask.create({ data: { title: 'Post process fragments on @kevinthevp', description: 'Share BTS/process clips — no links, no prices', phase: 1, sortOrder: 2, status: 'in_progress' } }),
|
|
prisma.launchTask.create({ data: { title: 'Build curiosity without revealing the product', description: 'Let the audience ask questions organically', phase: 1, sortOrder: 3, status: 'todo' } }),
|
|
prisma.launchTask.create({ data: { title: 'Collect 3-5 strong process clips each', description: 'Have a backlog of content ready before Phase 2', phase: 1, sortOrder: 4, status: 'todo' } }),
|
|
|
|
// Phase 2 — Build Presence
|
|
prisma.launchTask.create({ data: { title: 'Launch @oskv.labs Instagram', description: 'Start posting branded content from the OSKV Labs account', phase: 2, sortOrder: 1, status: 'todo' } }),
|
|
prisma.launchTask.create({ data: { title: 'Mention Discord verbally in content', description: 'Talk about the community naturally in stories/videos', phase: 2, sortOrder: 2, status: 'todo' } }),
|
|
prisma.launchTask.create({ data: { title: 'Create OSKV Labs brand assets', description: 'Logo, color palette, templates for IG content', phase: 2, sortOrder: 3, status: 'todo' } }),
|
|
prisma.launchTask.create({ data: { title: 'Set up Discord server structure', description: 'Channels, roles, permissions, welcome flow', phase: 2, sortOrder: 4, status: 'todo' } }),
|
|
|
|
// Phase 3 — Launch
|
|
prisma.launchTask.create({ data: { title: 'Open free Lab Floor (Tier 0)', description: 'Let people in for free to experience the community', phase: 3, sortOrder: 1, status: 'todo' } }),
|
|
prisma.launchTask.create({ data: { title: 'Announce first cohort presentation', description: 'Create buzz around the first live session', phase: 3, sortOrder: 2, status: 'todo' } }),
|
|
prisma.launchTask.create({ data: { title: 'Open paid tiers', description: 'Launch Observers, Operators, Inner Circle, Apprenticeship', phase: 3, sortOrder: 3, status: 'todo' } }),
|
|
prisma.launchTask.create({ data: { title: 'Set up payment processing', description: 'Connect Stripe/payment links for all paid tiers', phase: 3, sortOrder: 4, status: 'todo' } }),
|
|
|
|
// Current priority tasks
|
|
prisma.launchTask.create({ data: { title: '📌 Finish Google Doc: Tier descriptions', description: 'What people get per tier — deliverables, access, pricing', phase: 1, sortOrder: 0, status: 'in_progress', assignee: 'quo' } }),
|
|
prisma.launchTask.create({ data: { title: '📌 Collect payment links for all tiers', description: 'Stripe links or equivalent for each paid tier', phase: 1, sortOrder: 0, status: 'todo', assignee: 'kevin' } }),
|
|
])
|
|
console.log(`✅ Created ${tasks.length} launch tasks`)
|
|
|
|
// Create subscription tiers
|
|
const tiers = await Promise.all([
|
|
prisma.subscriptionTier.create({ data: { tierNumber: 0, name: 'The Lab Floor', price: 0, description: 'Free community access — the front door', paymentLinkStatus: 'collected' } }),
|
|
prisma.subscriptionTier.create({ data: { tierNumber: 1, name: 'Observers', price: 12, description: 'Watch live sessions, access replays, community chat' } }),
|
|
prisma.subscriptionTier.create({ data: { tierNumber: 2, name: 'Operators', price: 35, description: 'Everything in Observers + breakdowns, templates, feedback rounds' } }),
|
|
prisma.subscriptionTier.create({ data: { tierNumber: 3, name: 'Inner Circle', price: 90, description: 'Full access — group calls, direct feedback, inner community' } }),
|
|
prisma.subscriptionTier.create({ data: { tierNumber: 4, name: 'Apprenticeship', price: 300, priceMax: 500, description: '1-on-1 mentorship, project collab, direct coaching', isApplicationOnly: true, hardCap: 5 } }),
|
|
])
|
|
console.log(`✅ Created ${tiers.length} subscription tiers`)
|
|
|
|
// Create content calendar template for next 2 weeks
|
|
const now = new Date()
|
|
const monday = new Date(now)
|
|
monday.setDate(now.getDate() - now.getDay() + 1) // This Monday
|
|
|
|
for (let week = 0; week < 2; week++) {
|
|
const weekStart = new Date(monday)
|
|
weekStart.setDate(monday.getDate() + week * 7)
|
|
|
|
await Promise.all([
|
|
prisma.contentSession.create({ data: { title: 'Industry Strategy Session', dayOfWeek: 'Monday', topic: 'Freelance strategy & networking', weekStart, status: week === 0 ? 'planned' : 'planned' } }),
|
|
prisma.contentSession.create({ data: { title: 'AI Workflow Deep Dive', dayOfWeek: 'Wednesday', topic: 'AI workflows, prompting, tool stacks', weekStart, status: 'planned' } }),
|
|
prisma.contentSession.create({ data: { title: 'Post-Production Masterclass', dayOfWeek: 'Friday', topic: 'Editing, post-production, career case studies', weekStart, status: 'planned' } }),
|
|
])
|
|
}
|
|
console.log('✅ Created content calendar (2 weeks)')
|
|
|
|
// Seed initial funnel metric
|
|
await prisma.funnelMetric.create({
|
|
data: {
|
|
date: new Date(),
|
|
quowavyFollowers: 0,
|
|
kevinthevpFollowers: 0,
|
|
oskvlabsFollowers: 0,
|
|
discordMembersFree: 0,
|
|
discordMembersPaid: 0,
|
|
conversionRate: 0,
|
|
notes: 'Pre-launch baseline',
|
|
},
|
|
})
|
|
console.log('✅ Created initial funnel metric')
|
|
|
|
console.log('🎉 Seeding complete!')
|
|
}
|
|
|
|
main()
|
|
.catch(e => { console.error(e); process.exit(1) })
|
|
.finally(() => prisma.$disconnect())
|