Добавлены новые скрипты в package.json для автоматизации работы с базой данных, включая инициализацию и сброс данных. Обновлена схема Prisma для поддержки автоматического seeding. Реализован новый резолвер для получения всех категорий товаров в GraphQL. Исправлен форматирование в queries.ts.
This commit is contained in:
141
prisma/seed.js
Normal file
141
prisma/seed.js
Normal file
@ -0,0 +1,141 @@
|
||||
import { PrismaClient } from '@prisma/client'
|
||||
import bcrypt from 'bcryptjs'
|
||||
|
||||
const prisma = new PrismaClient()
|
||||
|
||||
// Список базовых категорий товаров
|
||||
const DEFAULT_CATEGORIES = [
|
||||
'Одежда и обувь',
|
||||
'Косметика и парфюмерия',
|
||||
'Дом и сад',
|
||||
'Детские товары',
|
||||
'Спорт и отдых',
|
||||
'Электроника',
|
||||
'Книги',
|
||||
'Здоровье',
|
||||
'Автотовары',
|
||||
'Строительство и ремонт',
|
||||
'Продукты питания',
|
||||
'Зоотовары',
|
||||
'Дача, сад и огород',
|
||||
'Канцелярские товары',
|
||||
'Хобби и творчество',
|
||||
'Украшения и аксессуары',
|
||||
'Сумки и чемоданы',
|
||||
'Техника для дома',
|
||||
'Музыкальные инструменты',
|
||||
'Игры и игрушки'
|
||||
]
|
||||
|
||||
async function seedAdmin() {
|
||||
try {
|
||||
console.log('🔐 Создание администратора...')
|
||||
|
||||
// Проверяем есть ли уже админ
|
||||
const existingAdmin = await prisma.admin.findUnique({
|
||||
where: { username: 'admin' }
|
||||
})
|
||||
|
||||
if (existingAdmin) {
|
||||
console.log('ℹ️ Администратор уже существует, пропускаем создание')
|
||||
return existingAdmin
|
||||
}
|
||||
|
||||
// Генерируем хеш пароля
|
||||
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('✅ Администратор создан:')
|
||||
console.log(` Логин: ${admin.username}`)
|
||||
console.log(` Пароль: ${password}`)
|
||||
console.log(` Email: ${admin.email}`)
|
||||
console.log(' ⚠️ Обязательно смените пароль после первого входа!')
|
||||
|
||||
return admin
|
||||
} catch (error) {
|
||||
console.error('❌ Ошибка создания администратора:', error)
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
async function seedCategories() {
|
||||
try {
|
||||
console.log('\n📂 Создание категорий...')
|
||||
|
||||
let createdCount = 0
|
||||
let skippedCount = 0
|
||||
|
||||
for (const categoryName of DEFAULT_CATEGORIES) {
|
||||
try {
|
||||
// Проверяем существует ли категория
|
||||
const existingCategory = await prisma.category.findUnique({
|
||||
where: { name: categoryName }
|
||||
})
|
||||
|
||||
if (existingCategory) {
|
||||
skippedCount++
|
||||
continue
|
||||
}
|
||||
|
||||
// Создаем категорию
|
||||
await prisma.category.create({
|
||||
data: {
|
||||
name: categoryName
|
||||
}
|
||||
})
|
||||
|
||||
createdCount++
|
||||
console.log(` ✅ Создана категория: ${categoryName}`)
|
||||
} catch (error) {
|
||||
console.log(` ⚠️ Ошибка создания категории "${categoryName}":`, error.message)
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`\n📊 Результат создания категорий:`)
|
||||
console.log(` Создано: ${createdCount}`)
|
||||
console.log(` Пропущено (уже существует): ${skippedCount}`)
|
||||
console.log(` Всего категорий: ${DEFAULT_CATEGORIES.length}`)
|
||||
|
||||
return { createdCount, skippedCount, total: DEFAULT_CATEGORIES.length }
|
||||
} catch (error) {
|
||||
console.error('❌ Ошибка создания категорий:', error)
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
async function main() {
|
||||
try {
|
||||
console.log('🚀 Запуск инициализации базы данных...\n')
|
||||
|
||||
// Создаем админа
|
||||
await seedAdmin()
|
||||
|
||||
// Создаем категории
|
||||
await seedCategories()
|
||||
|
||||
console.log('\n🎉 Инициализация базы данных завершена успешно!')
|
||||
|
||||
} catch (error) {
|
||||
console.error('\n💥 Ошибка инициализации базы данных:', error)
|
||||
process.exit(1)
|
||||
} finally {
|
||||
await prisma.$disconnect()
|
||||
}
|
||||
}
|
||||
|
||||
// Запускаем если скрипт вызван напрямую
|
||||
if (import.meta.url === `file://${process.argv[1]}`) {
|
||||
main()
|
||||
}
|
||||
|
||||
export { seedAdmin, seedCategories }
|
Reference in New Issue
Block a user