Добавлены новые скрипты в package.json для автоматизации работы с базой данных, включая инициализацию и сброс данных. Обновлена схема Prisma для поддержки автоматического seeding. Реализован новый резолвер для получения всех категорий товаров в GraphQL. Исправлен форматирование в queries.ts.

This commit is contained in:
Bivekich
2025-07-28 09:34:43 +03:00
parent 32b436c35d
commit e56d4e309d
6 changed files with 310 additions and 2 deletions

View File

@ -2,6 +2,12 @@ generator client {
provider = "prisma-client-js"
}
// Конфигурация для автоматического seeding
generator seed {
provider = "prisma-client-js"
output = "./generated/client"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")

141
prisma/seed.js Normal file
View 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 }