/** * Seed script — chạy sau khi drizzle-kit push để tạo dữ liệu mẫu. * Usage: npm run seed --workspace=apps/api-server * hoặc: npx tsx src/db/seed.ts */ import { db } from './database.module' import { users, organizations, projects, memberships, devices } from './schema' import { nanoid } from 'nanoid' import * as bcrypt from 'bcrypt' async function seed() { console.log('🌱 Seeding database...') // Tạo organization mặc định const orgId = nanoid() await db.insert(organizations).values({ id: orgId, name: 'K9 Tech Demo', status: 'active', planTier: 'trial', }) console.log(` ✓ Organization: K9 Tech Demo (${orgId})`) // Tạo user admin const adminId = nanoid() const passwordHash = await bcrypt.hash('admin1234', 12) await db.insert(users).values({ id: adminId, email: 'admin@k9tech.space', name: 'Admin User', passwordHash, provider: 'email', emailVerified: true, }) console.log(` ✓ User: admin@k9tech.space / admin1234`) // Gán admin vào org await db.insert(memberships).values({ userId: adminId, orgId, role: 'org_admin', }) console.log(` ✓ Membership: admin → K9 Tech Demo (org_admin)`) // Tạo project mẫu const projectId = nanoid() await db.insert(projects).values({ id: projectId, orgId, name: 'Công trình Demo', description: 'Dự án timelapse demo cho testing', status: 'active', captureInterval: 60, resolution: '1920x1080', timezone: 'Asia/Ho_Chi_Minh', }) console.log(` ✓ Project: Công trình Demo (${projectId})`) // Tạo 3 device mẫu const deviceNames = [ { name: 'Camera Chính', serial: 'DEMO-001' }, { name: 'Camera Góc 2', serial: 'DEMO-002' }, { name: 'Camera Góc 3', serial: 'DEMO-003' }, ] for (const d of deviceNames) { const deviceId = d.serial // ID = serial for easy POC testing const apiKeyPlain = `dev-api-key-${d.serial.toLowerCase()}` const apiKeyHash = await bcrypt.hash(apiKeyPlain, 10) await db.insert(devices).values({ id: deviceId, orgId, projectId, name: d.name, serialNo: d.serial, apiKeyHash, status: 'online', firmwareVersion: '1.0.0', lastSeenAt: new Date(), }) console.log(` ✓ Device: ${d.name} (${d.serial}) — API key: ${apiKeyHash} — ID: ${deviceId}`) } console.log('\n✅ Seed complete!') console.log('\nTest login:') console.log(' curl -X POST http://localhost:3001/v1/auth/login \\') console.log(' -H "Content-Type: application/json" \\') console.log(' -d \'{"email":"admin@k9tech.space","password":"admin1234"}\'') process.exit(0) } seed().catch((err) => { console.error('❌ Seed failed:', err) process.exit(1) })