141 lines
4.1 KiB
TypeScript
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)
|
|
}
|