// scripts/configure-grand-final-requirements.mjs // Usage: node scripts/configure-grand-final-requirements.mjs (dry-run, prints plan) // node scripts/configure-grand-final-requirements.mjs --apply (writes) import { PrismaClient } from '@prisma/client' const p = new PrismaClient() const APPLY = process.argv.includes('--apply') const TARGET = [ { name: 'Final Presentation', acceptedMimeTypes: ['application/pdf'], sortOrder: 1, renameFrom: 'PDF presentation support' }, { name: 'Final Business Plan', acceptedMimeTypes: ['application/pdf'], sortOrder: 2 }, { name: '1-minute Video', acceptedMimeTypes: ['video/*'], sortOrder: 3, renameFrom: '1 minute video' }, { name: 'Executive Summary', acceptedMimeTypes: ['application/pdf'], sortOrder: 4 }, ] const run = async () => { const round = await p.round.findFirst({ where: { roundType: 'LIVE_FINAL' }, orderBy: { sortOrder: 'desc' } }) if (!round) throw new Error('No LIVE_FINAL round') const existing = await p.fileRequirement.findMany({ where: { roundId: round.id } }) console.log(`Round "${round.name}" (${round.id}); existing reqs: ${existing.map((r) => r.name).join(', ') || 'none'}`) for (const t of TARGET) { const match = existing.find((r) => r.name === t.name || (t.renameFrom && r.name === t.renameFrom)) if (match) { console.log(`UPDATE "${match.name}" -> name="${t.name}" required=true sort=${t.sortOrder} mimes=${t.acceptedMimeTypes}`) if (APPLY) await p.fileRequirement.update({ where: { id: match.id }, data: { name: t.name, acceptedMimeTypes: t.acceptedMimeTypes, isRequired: true, sortOrder: t.sortOrder } }) } else { console.log(`CREATE "${t.name}" required=true sort=${t.sortOrder} mimes=${t.acceptedMimeTypes}`) if (APPLY) await p.fileRequirement.create({ data: { roundId: round.id, name: t.name, acceptedMimeTypes: t.acceptedMimeTypes, isRequired: true, sortOrder: t.sortOrder } }) } } console.log(APPLY ? 'APPLIED.' : 'DRY-RUN (pass --apply to write).') } run().catch((e) => { console.error(e); process.exit(1) }).finally(() => p.$disconnect())