Добавлены новые скрипты в package.json для автоматизации работы с базой данных, включая инициализацию и сброс данных. Обновлена схема Prisma для поддержки автоматического seeding. Реализован новый резолвер для получения всех категорий товаров в GraphQL. Исправлен форматирование в queries.ts.
This commit is contained in:
@ -835,4 +835,4 @@ export const GET_SUPPLY_ORDERS = gql`
|
||||
}
|
||||
}
|
||||
}
|
||||
`
|
||||
`;
|
@ -8,6 +8,7 @@ import { DaDataService } from "@/services/dadata-service";
|
||||
import { MarketplaceService } from "@/services/marketplace-service";
|
||||
import { WildberriesService } from "@/services/wildberries-service";
|
||||
import { Prisma } from "@prisma/client";
|
||||
import "@/lib/seed-init"; // Автоматическая инициализация БД
|
||||
|
||||
// Сервисы
|
||||
const smsService = new SmsService();
|
||||
@ -1241,6 +1242,21 @@ export const resolvers = {
|
||||
|
||||
return scheduleRecords;
|
||||
},
|
||||
|
||||
// Получение всех категорий товаров
|
||||
categories: async () => {
|
||||
try {
|
||||
const categories = await prisma.category.findMany({
|
||||
orderBy: {
|
||||
name: 'asc'
|
||||
}
|
||||
});
|
||||
return categories;
|
||||
} catch (error) {
|
||||
console.error('Ошибка получения категорий:', error);
|
||||
throw new GraphQLError('Не удалось получить категории');
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
Mutation: {
|
||||
|
141
src/lib/seed-init.ts
Normal file
141
src/lib/seed-init.ts
Normal file
@ -0,0 +1,141 @@
|
||||
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)
|
||||
}
|
Reference in New Issue
Block a user