71 lines
2.3 KiB
JavaScript
71 lines
2.3 KiB
JavaScript
// Seeds a demo campaign for local dev. Species/classes/skills are NOT seeded
|
|
// as rows — they're fixed game-rule tables ported into src/game/data/*.js and
|
|
// used directly by the calculation engine. Weapons ARE seeded, but only into
|
|
// this demo campaign (weapons are per-campaign in the schema, since a DM can
|
|
// add homebrew weapons).
|
|
const path = require('path');
|
|
const bcrypt = require('bcrypt');
|
|
const { PrismaClient } = require('@prisma/client');
|
|
const { generateInviteCode } = require('../src/utils/inviteCode');
|
|
|
|
const prisma = new PrismaClient();
|
|
const weapons = require(path.join(__dirname, '..', 'seed-data', 'weapons.json'));
|
|
|
|
async function main() {
|
|
const passwordHash = await bcrypt.hash('password123', 12);
|
|
|
|
const dm = await prisma.user.upsert({
|
|
where: { email: 'dm@example.com' },
|
|
update: {},
|
|
create: { email: 'dm@example.com', passwordHash, displayName: 'Dungeon Master' },
|
|
});
|
|
|
|
const player = await prisma.user.upsert({
|
|
where: { email: 'player@example.com' },
|
|
update: {},
|
|
create: { email: 'player@example.com', passwordHash, displayName: 'Test Player' },
|
|
});
|
|
|
|
let campaign = await prisma.campaign.findFirst({ where: { name: 'The Sunken Reach (Demo)' } });
|
|
if (!campaign) {
|
|
campaign = await prisma.campaign.create({
|
|
data: {
|
|
name: 'The Sunken Reach (Demo)',
|
|
description: 'A demo campaign seeded for local development.',
|
|
inviteCode: generateInviteCode(),
|
|
startingGold: 15,
|
|
startingItemCount: 2,
|
|
startingSpellCount: 2,
|
|
ownerId: dm.id,
|
|
members: {
|
|
create: [
|
|
{ userId: dm.id, role: 'DM' },
|
|
{ userId: player.id, role: 'PLAYER' },
|
|
],
|
|
},
|
|
},
|
|
});
|
|
}
|
|
|
|
for (const weapon of weapons) {
|
|
const existing = await prisma.weapon.findFirst({ where: { campaignId: campaign.id, name: weapon.name } });
|
|
if (!existing) {
|
|
await prisma.weapon.create({ data: { ...weapon, campaignId: campaign.id } });
|
|
}
|
|
}
|
|
|
|
console.log('Seed complete.');
|
|
console.log(` DM login: dm@example.com / password123`);
|
|
console.log(` Player login: player@example.com / password123`);
|
|
console.log(` Campaign invite code: ${campaign.inviteCode}`);
|
|
}
|
|
|
|
main()
|
|
.catch((err) => {
|
|
console.error(err);
|
|
process.exit(1);
|
|
})
|
|
.finally(async () => {
|
|
await prisma.$disconnect();
|
|
});
|