MOPC-App/prisma/seed-jury-demo.ts

181 lines
5.0 KiB
TypeScript
Raw Permalink Normal View History

import { PrismaClient } from '@prisma/client'
import bcrypt from 'bcryptjs'
const prisma = new PrismaClient()
async function main() {
console.log('Setting up demo jury member...\n')
// Hash a password for the demo jury account
const password = 'JuryDemo2026!'
const passwordHash = await bcrypt.hash(password, 12)
// Create or update jury member
const juryUser = await prisma.user.upsert({
where: { email: 'jury.demo@monaco-opc.com' },
update: {
passwordHash,
mustSetPassword: false,
status: 'ACTIVE',
onboardingCompletedAt: new Date(),
},
create: {
email: 'jury.demo@monaco-opc.com',
name: 'Dr. Marie Laurent',
role: 'JURY_MEMBER',
status: 'ACTIVE',
passwordHash,
mustSetPassword: false,
passwordSetAt: new Date(),
onboardingCompletedAt: new Date(),
expertiseTags: ['Marine Biology', 'Ocean Conservation', 'Sustainable Innovation'],
notificationPreference: 'EMAIL',
},
})
console.log(`Jury user: ${juryUser.email} (${juryUser.id})`)
console.log(`Password: ${password}\n`)
// Find the round
const round = await prisma.round.findFirst({
where: { slug: 'mopc-2026-round-1' },
})
if (!round) {
console.error('Round not found! Run seed-candidatures first.')
process.exit(1)
}
console.log(`Round: ${round.name} (${round.id})`)
// Ensure voting window is open
const now = new Date()
const votingStart = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000) // 7 days ago
const votingEnd = new Date(now.getTime() + 30 * 24 * 60 * 60 * 1000) // 30 days from now
await prisma.round.update({
where: { id: round.id },
data: {
status: 'ACTIVE',
votingStartAt: votingStart,
votingEndAt: votingEnd,
},
})
console.log(`Voting window: ${votingStart.toISOString()}${votingEnd.toISOString()}\n`)
// Get some projects to assign (via RoundProject)
const roundProjects = await prisma.roundProject.findMany({
where: { roundId: round.id },
take: 8,
orderBy: { addedAt: 'desc' },
select: { project: { select: { id: true, title: true } } },
})
const projects = roundProjects.map(rp => rp.project)
if (projects.length === 0) {
console.error('No projects found! Run seed-candidatures first.')
process.exit(1)
}
console.log(`Found ${projects.length} projects to assign\n`)
// Create assignments
let created = 0
let skipped = 0
for (const project of projects) {
try {
await prisma.assignment.upsert({
where: {
userId_projectId_roundId: {
userId: juryUser.id,
projectId: project.id,
roundId: round.id,
},
},
update: {},
create: {
userId: juryUser.id,
projectId: project.id,
roundId: round.id,
method: 'MANUAL',
isRequired: true,
},
})
console.log(` Assigned: ${project.title}`)
created++
} catch {
skipped++
}
}
// Ensure evaluation criteria exist for this round
const existingForm = await prisma.evaluationForm.findFirst({
where: { roundId: round.id },
})
if (!existingForm) {
await prisma.evaluationForm.create({
data: {
roundId: round.id,
isActive: true,
criteriaJson: [
{
id: 'innovation',
label: 'Innovation & Originality',
description: 'How innovative is the proposed solution? Does it bring a new approach to ocean conservation?',
scale: 10,
weight: 25,
required: true,
},
{
id: 'feasibility',
label: 'Technical Feasibility',
description: 'Is the solution technically viable? Can it be realistically implemented?',
scale: 10,
weight: 25,
required: true,
},
{
id: 'impact',
label: 'Environmental Impact',
description: 'What is the potential positive impact on ocean health and marine ecosystems?',
scale: 10,
weight: 30,
required: true,
},
{
id: 'team',
label: 'Team Capability',
description: 'Does the team have the skills, experience, and commitment to execute?',
scale: 10,
weight: 20,
required: true,
},
],
},
})
console.log('\nCreated evaluation form with 4 criteria')
} else {
console.log('\nEvaluation form already exists')
}
console.log('\n========================================')
console.log('Demo jury member setup complete!')
console.log(` Email: jury.demo@monaco-opc.com`)
console.log(` Password: ${password}`)
console.log(` Assignments: ${created} created, ${skipped} skipped`)
console.log(` Voting: OPEN (${round.name})`)
console.log('========================================\n')
}
main()
.catch((e) => {
console.error(e)
process.exit(1)
})
.finally(async () => {
await prisma.$disconnect()
})