import { PrismaClient } from '@prisma/client'; import { hash } from 'argon2'; import { randomUUID } from 'node:crypto'; const prisma = new PrismaClient(); async function main() { await prisma.$transaction(async (tx) => { // region Users const password = await hash('12345678'); const admin = await tx.user.upsert({ where: { email: 'admin@mail.com' }, update: {}, create: { email: 'admin@mail.com', name: 'Admin user', role: 'ADMIN', password, emailConfirmedAt: new Date() } }); const huntMember = await tx.user.upsert({ where: { email: 'team@mail.com' }, update: {}, create: { email: 'team@mail.com', name: 'Hunt member', role: 'ADMIN', password, emailConfirmedAt: new Date() } }); const user = await tx.user.upsert({ where: { email: 'user@mail.com' }, update: {}, create: { email: 'user@mail.com', name: 'User', role: 'USER', password, emailConfirmedAt: new Date() } }); const teamMember = await tx.user.upsert({ where: { email: 'member@mail.com' }, update: {}, create: { email: 'member@mail.com', name: 'Team Member', role: 'USER', password, emailConfirmedAt: new Date() } }); // endregion const hunt = await tx.hunt.create({ include: { teams: true, quests: { orderBy: { order: 'asc' } } }, data: { name: 'Bremer Stadtrallye!', description: 'DIE Rallye durch Bremen!', start: new Date('2025-08-23T10:00:00.000Z'), end: new Date('2025-08-30T10:00:00.000Z'), allowJoin: true, revealQuests: true, revealAnswers: false, quests: { create: [ { title: 'MOIN!', description: 'Finde das größte MOIN', question: 'Wo steht es?', order: 0, optional: false, pictureRequired: true, textRequired: false, textType: 'TEXT', textSolution: 'Am Herdentor', points: 10 }, { title: 'Die Musikanten', description: 'Dort wo die vier Bremer Tiere musizieren, müsst ihr ihre Beine anfassen!', question: 'Wie viele Beine haben die Musikanten zusammen?', extraText: 'Mehr Punkte, je mehr unterschiedliche Beine ihre berührt!', points: 10, extraPoints: 5, pictureRequired: true, optional: false, textRequired: true, textType: 'INTEGER', textSolution: '14', order: 1 }, { title: 'Tolle Aussicht', description: 'Mache ein Bild aus einem Gebäude der Hochschule, von so weit oben wie möglich!', points: 10, extraPoints: 10, extraText: 'Wenn ihr das einzige Team in diesem Gebäude/Standort oder die Höchsten wart!', optional: false, pictureRequired: true, textRequired: false, question: 'In welchem Gebäude und Stockwerk wart ihr?', textType: 'TEXT', order: 2 } ] }, creatorId: admin.id, members: { create: [ { memberId: huntMember.id } ] }, teams: { create: [ { ownerId: user.id, name: 'Team 1', description: 'Das beste Informatik Team!', password: 'top secret', members: { create: [ { memberId: teamMember.id } ] } } ] } } }); const team = hunt.teams[0]; const images = [ '/img/dummy/moin1.jpeg', '/img/dummy/musikanten1.jpg', '/img/dummy/aussicht1.jpeg' ]; const answers = await tx.questAnswer.createManyAndReturn({ data: [ { teamId: team.id, memberId: user.id, questId: hunt.quests[0].id, text: 'Am Herdentor', location: 'An der Haltestelle Herdentor', lat: 53.079138, lon: 8.809734, reviewerId: admin.id, score: 10, review: 'Schönes Bild!' }, { teamId: team.id, memberId: teamMember.id, questId: hunt.quests[1].id, text: '14', location: 'Marktplatz', score: 10 }, { teamId: team.id, memberId: teamMember.id, questId: hunt.quests[2].id, text: 'Neustadtswall AB-Gebäude Etage 10', score: 17, reviewerId: huntMember.id, review: 'Höchstes Team, aber leider gabs andere im AB!' } ] }); await Promise.all( answers.map((a, i) => tx.file.create({ data: { url: images[i], creatorId: a.memberId, uuid: randomUUID(), answers: { connect: { id: a.id } }, answerId: a.id } }) ) ); console.log(JSON.stringify(hunt, null, 2)); }); } main() .then(async () => { await prisma.$disconnect(); }) .catch(async (e) => { console.error(e); await prisma.$disconnect(); process.exit(1); });