first commit
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
generator client {
|
||||
provider = "prisma-client-js"
|
||||
}
|
||||
|
||||
datasource db {
|
||||
provider = "sqlite"
|
||||
url = env("DATABASE_URL")
|
||||
}
|
||||
|
||||
model User {
|
||||
id Int @id @default(autoincrement())
|
||||
username String @unique
|
||||
passwordHash String
|
||||
balance Int @default(0)
|
||||
role String @default("user")
|
||||
createdAt DateTime @default(now())
|
||||
inventory InventoryItem[]
|
||||
transactions Transaction[]
|
||||
}
|
||||
|
||||
model Case {
|
||||
id Int @id @default(autoincrement())
|
||||
name String
|
||||
imageUrl String @default("")
|
||||
price Int
|
||||
active Boolean @default(true)
|
||||
createdAt DateTime @default(now())
|
||||
items CaseItem[]
|
||||
}
|
||||
|
||||
model Item {
|
||||
id Int @id @default(autoincrement())
|
||||
name String
|
||||
imageUrl String @default("")
|
||||
rarity String
|
||||
marketValue Int
|
||||
createdAt DateTime @default(now())
|
||||
cases CaseItem[]
|
||||
inventory InventoryItem[]
|
||||
}
|
||||
|
||||
model CaseItem {
|
||||
id Int @id @default(autoincrement())
|
||||
caseId Int
|
||||
itemId Int
|
||||
dropRate Float
|
||||
case Case @relation(fields: [caseId], references: [id], onDelete: Cascade)
|
||||
item Item @relation(fields: [itemId], references: [id], onDelete: Cascade)
|
||||
|
||||
@@unique([caseId, itemId])
|
||||
}
|
||||
|
||||
model InventoryItem {
|
||||
id Int @id @default(autoincrement())
|
||||
userId Int
|
||||
itemId Int
|
||||
obtainedAt DateTime @default(now())
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
item Item @relation(fields: [itemId], references: [id], onDelete: Cascade)
|
||||
}
|
||||
|
||||
model Transaction {
|
||||
id Int @id @default(autoincrement())
|
||||
userId Int
|
||||
type String
|
||||
amount Int
|
||||
meta String @default("{}")
|
||||
createdAt DateTime @default(now())
|
||||
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
import bcrypt from 'bcrypt';
|
||||
import { PrismaClient } from '@prisma/client';
|
||||
|
||||
const prisma = new PrismaClient();
|
||||
|
||||
const ITEMS = [
|
||||
{ name: 'Dust Fragment', rarity: 'Consumer', marketValue: 5, imageUrl: '' },
|
||||
{ name: 'Scrap Token', rarity: 'Consumer', marketValue: 8, imageUrl: '' },
|
||||
{ name: 'Plain Cap', rarity: 'Consumer', marketValue: 12, imageUrl: '' },
|
||||
{ name: 'Blue Softpack', rarity: 'Industrial', marketValue: 25, imageUrl: '' },
|
||||
{ name: 'Steel Badge', rarity: 'Industrial', marketValue: 35, imageUrl: '' },
|
||||
{ name: 'Signal Chip', rarity: 'Industrial', marketValue: 40, imageUrl: '' },
|
||||
{ name: 'Azure Coil', rarity: 'MilSpec', marketValue: 80, imageUrl: '' },
|
||||
{ name: 'Navy Grip', rarity: 'MilSpec', marketValue: 95, imageUrl: '' },
|
||||
{ name: 'Pulse Meter', rarity: 'MilSpec', marketValue: 110, imageUrl: '' },
|
||||
{ name: 'Violet Core', rarity: 'Restricted', marketValue: 220, imageUrl: '' },
|
||||
{ name: 'Phantom Lens', rarity: 'Restricted', marketValue: 280, imageUrl: '' },
|
||||
{ name: 'Neon Circuit', rarity: 'Restricted', marketValue: 320, imageUrl: '' },
|
||||
{ name: 'Pink Dynamo', rarity: 'Classified', marketValue: 650, imageUrl: '' },
|
||||
{ name: 'Ruby Flux', rarity: 'Classified', marketValue: 800, imageUrl: '' },
|
||||
{ name: 'Crimson Edge', rarity: 'Covert', marketValue: 1800, imageUrl: '' },
|
||||
{ name: 'Blood Ember', rarity: 'Covert', marketValue: 2400, imageUrl: '' },
|
||||
{ name: 'Golden Relic', rarity: 'Extraordinary', marketValue: 12000, imageUrl: '' },
|
||||
{ name: 'Mythic Blade', rarity: 'Extraordinary', marketValue: 25000, imageUrl: '' },
|
||||
];
|
||||
|
||||
async function main() {
|
||||
await prisma.transaction.deleteMany();
|
||||
await prisma.inventoryItem.deleteMany();
|
||||
await prisma.caseItem.deleteMany();
|
||||
await prisma.case.deleteMany();
|
||||
await prisma.item.deleteMany();
|
||||
await prisma.user.deleteMany();
|
||||
|
||||
const adminHash = await bcrypt.hash('admin123', 10);
|
||||
const userHash = await bcrypt.hash('player123', 10);
|
||||
|
||||
await prisma.user.create({
|
||||
data: {
|
||||
username: 'admin',
|
||||
passwordHash: adminHash,
|
||||
balance: 0,
|
||||
role: 'admin',
|
||||
},
|
||||
});
|
||||
|
||||
const demo = await prisma.user.create({
|
||||
data: {
|
||||
username: 'player',
|
||||
passwordHash: userHash,
|
||||
balance: 10000,
|
||||
role: 'user',
|
||||
},
|
||||
});
|
||||
|
||||
await prisma.transaction.create({
|
||||
data: {
|
||||
userId: demo.id,
|
||||
type: 'seed_credit',
|
||||
amount: 10000,
|
||||
meta: JSON.stringify({ reason: 'demo_seed' }),
|
||||
},
|
||||
});
|
||||
|
||||
const items = [];
|
||||
for (const data of ITEMS) {
|
||||
items.push(await prisma.item.create({ data }));
|
||||
}
|
||||
|
||||
const byName = Object.fromEntries(items.map((i) => [i.name, i]));
|
||||
|
||||
const starter = await prisma.case.create({
|
||||
data: {
|
||||
name: 'Starter Crate',
|
||||
imageUrl: '',
|
||||
price: 100,
|
||||
active: true,
|
||||
},
|
||||
});
|
||||
|
||||
const arsenal = await prisma.case.create({
|
||||
data: {
|
||||
name: 'Arsenal Case',
|
||||
imageUrl: '',
|
||||
price: 250,
|
||||
active: true,
|
||||
},
|
||||
});
|
||||
|
||||
const vault = await prisma.case.create({
|
||||
data: {
|
||||
name: 'Gold Vault',
|
||||
imageUrl: '',
|
||||
price: 500,
|
||||
active: true,
|
||||
},
|
||||
});
|
||||
|
||||
const drops = [
|
||||
[starter, 'Dust Fragment', 40],
|
||||
[starter, 'Scrap Token', 30],
|
||||
[starter, 'Plain Cap', 15],
|
||||
[starter, 'Blue Softpack', 8],
|
||||
[starter, 'Azure Coil', 5],
|
||||
[starter, 'Violet Core', 1.5],
|
||||
[starter, 'Crimson Edge', 0.4],
|
||||
[starter, 'Golden Relic', 0.1],
|
||||
|
||||
[arsenal, 'Steel Badge', 35],
|
||||
[arsenal, 'Signal Chip', 25],
|
||||
[arsenal, 'Navy Grip', 18],
|
||||
[arsenal, 'Pulse Meter', 12],
|
||||
[arsenal, 'Phantom Lens', 6],
|
||||
[arsenal, 'Pink Dynamo', 2.5],
|
||||
[arsenal, 'Blood Ember', 1.2],
|
||||
[arsenal, 'Mythic Blade', 0.3],
|
||||
|
||||
[vault, 'Neon Circuit', 40],
|
||||
[vault, 'Ruby Flux', 30],
|
||||
[vault, 'Crimson Edge', 18],
|
||||
[vault, 'Blood Ember', 8],
|
||||
[vault, 'Golden Relic', 3],
|
||||
[vault, 'Mythic Blade', 1],
|
||||
];
|
||||
|
||||
for (const [c, name, dropRate] of drops) {
|
||||
await prisma.caseItem.create({
|
||||
data: {
|
||||
caseId: c.id,
|
||||
itemId: byName[name].id,
|
||||
dropRate,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
console.log('Seed complete.');
|
||||
console.log(' admin / admin123');
|
||||
console.log(' player / player123 (balance: 100.00)');
|
||||
}
|
||||
|
||||
main()
|
||||
.catch((e) => {
|
||||
console.error(e);
|
||||
process.exit(1);
|
||||
})
|
||||
.finally(async () => {
|
||||
await prisma.$disconnect();
|
||||
});
|
||||
Reference in New Issue
Block a user