Files
sfera/src/lib/seed-init.ts

141 lines
4.1 KiB
TypeScript

import { PrismaClient } from '@prisma/client'
import bcrypt from 'bcryptjs'
const prisma = new PrismaClient()
// Список базовых категорий товаров
const DEFAULT_CATEGORIES = [
'Одежда и обувь',
'Косметика и парфюмерия',
'Дом и сад',
'Детские товары',
'Спорт и отдых',
'Электроника',
'Книги',
'Здоровье',
'Автотовары',
'Строительство и ремонт',
'Продукты питания',
'Зоотовары',
'Дача, сад и огород',
'Канцелярские товары',
'Хобби и творчество',
'Украшения и аксессуары',
'Сумки и чемоданы',
'Техника для дома',
'Музыкальные инструменты',
'Игры и игрушки'
]
let isInitialized = false
export async function ensureAdmin() {
try {
// Проверяем есть ли уже админ
const existingAdmin = await prisma.admin.findUnique({
where: { username: 'admin' }
})
if (existingAdmin) {
return existingAdmin
}
console.log('🔐 Создание администратора...')
// Генерируем хеш пароля
const password = 'admin123' // Временный пароль
const hashedPassword = await bcrypt.hash(password, 12)
// Создаем администратора
const admin = await prisma.admin.create({
data: {
username: 'admin',
password: hashedPassword,
email: 'admin@sferav.com',
isActive: true
}
})
console.log('✅ Администратор создан:', admin.username)
return admin
} catch (error) {
console.error('❌ Ошибка создания администратора:', error)
return null
}
}
export async function ensureCategories() {
try {
// Проверяем сколько категорий уже есть
const existingCount = await prisma.category.count()
if (existingCount >= DEFAULT_CATEGORIES.length) {
return { created: 0, existing: existingCount }
}
let createdCount = 0
for (const categoryName of DEFAULT_CATEGORIES) {
try {
// Проверяем существует ли категория
const existingCategory = await prisma.category.findUnique({
where: { name: categoryName }
})
if (!existingCategory) {
// Создаем категорию
await prisma.category.create({
data: { name: categoryName }
})
createdCount++
}
} catch (error) {
// Игнорируем ошибки дублирования
if (error.code !== 'P2002') {
console.error(`Ошибка создания категории "${categoryName}":`, error.message)
}
}
}
if (createdCount > 0) {
console.log(`📂 Создано категорий: ${createdCount}`)
}
return { created: createdCount, existing: existingCount }
} catch (error) {
console.error('❌ Ошибка создания категорий:', error)
return { created: 0, existing: 0 }
}
}
export async function initializeDatabase() {
if (isInitialized) {
return
}
try {
console.log('🚀 Проверка инициализации базы данных...')
// Инициализируем админа и категории параллельно
const [admin, categories] = await Promise.all([
ensureAdmin(),
ensureCategories()
])
isInitialized = true
if (admin || categories.created > 0) {
console.log('✨ Инициализация базы данных завершена')
}
return { admin, categories }
} catch (error) {
console.error('💥 Ошибка инициализации базы данных:', error)
return null
}
}
// Автоматическая инициализация при импорте модуля
if (typeof window === 'undefined') { // Только на сервере
initializeDatabase().catch(console.error)
}