Files
pichunt/prisma/seed/hunt.ts
T
2025-08-09 14:58:38 +02:00

342 lines
9.1 KiB
TypeScript

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()
}
});
const user2 = await tx.user.upsert({
where: { email: 'user2@mail.com' },
update: {},
create: {
email: 'user2@mail.com',
name: 'User2',
role: 'USER',
password,
emailConfirmedAt: new Date()
}
});
const teamMember2 = await tx.user.upsert({
where: { email: 'member2@mail.com' },
update: {},
create: {
email: 'member2@mail.com',
name: 'Team Member2',
role: 'USER',
password,
emailConfirmedAt: new Date()
}
});
const user3 = await tx.user.upsert({
where: { email: 'user3@mail.com' },
update: {},
create: {
email: 'user3@mail.com',
name: 'User3',
role: 'USER',
password,
emailConfirmedAt: new Date()
}
});
const teamMember3 = await tx.user.upsert({
where: { email: 'member3@mail.com' },
update: {},
create: {
email: 'member3@mail.com',
name: 'Team Member3',
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
},
{
title: 'Einfach mal abhauen',
description:
'Fahrt so weit ihr wollt und macht ein Foto vom Haltestellenschild!',
question: 'An welcher Haltestelle wart ihr?',
order: 3,
pictureRequired: true,
textRequired: true,
textType: 'TEXT',
points: 3,
extraPoints: 30,
extraText: 'Je weiter weg'
}
]
},
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
}
]
}
},
{
ownerId: user2.id,
name: 'Team 2',
description: 'Das schlechteste Informatik Team!',
password: 'top secret',
members: {
create: [
{
memberId: teamMember2.id
}
]
}
},
{
ownerId: user3.id,
name: 'Team 3',
description: 'Das Informatik Team!',
password: 'top secret',
members: {
create: [
{
memberId: teamMember3.id
}
]
}
}
]
}
}
});
const team = hunt.teams[0];
const team2 = hunt.teams[1];
const team3 = hunt.teams[2];
const images = [
'/img/dummy/moin1.jpeg',
'/img/dummy/musikanten1.jpg',
'/img/dummy/aussicht1.jpeg',
'https://pichunt.s3.swarm.syma.dev/0197ff6a-ce49-7000-a5b0-f32f1ee1b4ee',
'https://pichunt.s3.swarm.syma.dev/0197ff1a-3c8e-7000-8ba6-fa9c06548f82',
'https://pichunt.s3.swarm.syma.dev/0197ff5b-f74d-7000-864c-20f531481fcc'
];
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!',
internalNote: 'Wow!'
},
{
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!',
rankingValue: 10
},
{
teamId: team.id,
memberId: teamMember.id,
questId: hunt.quests[3].id,
text: 'Theater am Leibnizplatz',
score: 13,
reviewerId: admin.id,
review: 'Ihr wart 612m weit weg!',
rankingValue: 612,
internalNote: '612m'
},
{
teamId: team2.id,
memberId: teamMember2.id,
questId: hunt.quests[3].id,
text: 'Bürgerpark',
score: 21,
reviewerId: admin.id,
review: 'Ihr wart 2110m weit weg!',
rankingValue: 2110,
internalNote: 'Bisher am weitesten'
},
{
teamId: team3.id,
memberId: teamMember3.id,
questId: hunt.quests[3].id,
text: 'Am Brill',
score: 18,
reviewerId: huntMember.id,
review: 'Ihr wart 945m weit weg!',
rankingValue: 945,
showcase: true
}
]
});
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);
});