Добавлены новые скрипты в 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

@ -835,4 +835,4 @@ export const GET_SUPPLY_ORDERS = gql`
}
}
}
`
`;

View File

@ -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
View 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)
}