From 2397bf7f716b938d965dfc4b03955a4b26255e23 Mon Sep 17 00:00:00 2001 From: "Najjar\\NajjarV02" Date: Wed, 15 Apr 2026 10:49:04 +0400 Subject: [PATCH] feat: add seed.js for database seeding functionality --- Dockerfile | 8 -------- prisma/seed.js | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 8 deletions(-) create mode 100644 prisma/seed.js diff --git a/Dockerfile b/Dockerfile index 1b6a707..99c884c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -15,14 +15,6 @@ ENV NEXT_TELEMETRY_DISABLED=1 # Generate Prisma client (reads prisma/schema.prisma + prisma.config.ts) RUN npx prisma generate -# Compile seed.ts → seed.js (esbuild ships with Next.js) -RUN node_modules/.bin/esbuild prisma/seed.ts \ - --bundle \ - --platform=node \ - --format=cjs \ - --packages=external \ - --outfile=prisma/seed.js - # Build Next.js — produces .next/standalone (set in next.config.mjs) RUN npm run build diff --git a/prisma/seed.js b/prisma/seed.js new file mode 100644 index 0000000..f6eaceb --- /dev/null +++ b/prisma/seed.js @@ -0,0 +1,51 @@ +'use strict'; +const { PrismaClient } = require('../src/generated/prisma/client.js'); +const { PrismaLibSql } = require('@prisma/adapter-libsql'); +const bcrypt = require('bcryptjs'); +const { randomBytes } = require('crypto'); +const path = require('path'); + +const dbUrl = process.env.DATABASE_URL ?? `file:${path.resolve(process.cwd(), 'prisma', 'lootah.db')}`; +const adapter = new PrismaLibSql({ url: dbUrl }); +const prisma = new PrismaClient({ adapter }); + +async function main() { + console.log('Seeding database...'); + + const existingAdmin = await prisma.adminUser.findUnique({ + where: { username: 'admin' }, + }); + + if (!existingAdmin) { + const passwordHash = await bcrypt.hash('admin123', 12); + await prisma.adminUser.create({ + data: { username: 'admin', passwordHash }, + }); + console.log('✓ Created admin user (username: admin, password: admin123)'); + console.log(' ⚠️ Change the password after first login!'); + } else { + console.log('✓ Admin user already exists, skipping.'); + } + + const existingSecret = await prisma.appSettings.findUnique({ + where: { key: 'jwt_secret' }, + }); + + if (!existingSecret) { + const jwtSecret = randomBytes(64).toString('hex'); + await prisma.appSettings.upsert({ + where: { key: 'jwt_secret' }, + update: { value: jwtSecret }, + create: { key: 'jwt_secret', value: jwtSecret }, + }); + console.log('✓ Generated JWT secret and stored in database.'); + } else { + console.log('✓ JWT secret already exists, skipping.'); + } + + console.log('Seeding complete!'); +} + +main() + .catch((e) => { console.error(e); process.exit(1); }) + .finally(async () => { await prisma.$disconnect(); });