| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- /**
- * 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)
- })
|