Добавлены новые функции для управления категориями: реализованы мутации для создания, обновления и удаления категорий. Обновлены компоненты админ-панели для отображения и управления категориями, улучшен интерфейс и адаптивность. Добавлены новые кнопки и обработчики событий для взаимодействия с категориями.

This commit is contained in:
Bivekich
2025-07-19 17:09:40 +03:00
parent 965482b617
commit 8d57fcd748
12 changed files with 1733 additions and 67 deletions

View File

@ -919,6 +919,43 @@ export const REMOVE_FROM_FAVORITES = gql`
}
`
// Мутации для категорий
export const CREATE_CATEGORY = gql`
mutation CreateCategory($input: CategoryInput!) {
createCategory(input: $input) {
success
message
category {
id
name
createdAt
updatedAt
}
}
}
`
export const UPDATE_CATEGORY = gql`
mutation UpdateCategory($id: ID!, $input: CategoryInput!) {
updateCategory(id: $id, input: $input) {
success
message
category {
id
name
createdAt
updatedAt
}
}
}
`
export const DELETE_CATEGORY = gql`
mutation DeleteCategory($id: ID!) {
deleteCategory(id: $id)
}
`
// Мутации для сотрудников
export const CREATE_EMPLOYEE = gql`
mutation CreateEmployee($input: CreateEmployeeInput!) {

View File

@ -2733,6 +2733,138 @@ export const resolvers = {
}
},
// Создать категорию
createCategory: async (_: unknown, args: { input: { name: string } }, context: Context) => {
if (!context.user) {
throw new GraphQLError('Требуется авторизация', {
extensions: { code: 'UNAUTHENTICATED' }
})
}
// Проверяем уникальность названия категории
const existingCategory = await prisma.category.findUnique({
where: { name: args.input.name }
})
if (existingCategory) {
return {
success: false,
message: 'Категория с таким названием уже существует'
}
}
try {
const category = await prisma.category.create({
data: {
name: args.input.name
}
})
return {
success: true,
message: 'Категория успешно создана',
category
}
} catch (error) {
console.error('Error creating category:', error)
return {
success: false,
message: 'Ошибка при создании категории'
}
}
},
// Обновить категорию
updateCategory: async (_: unknown, args: { id: string; input: { name: string } }, context: Context) => {
if (!context.user) {
throw new GraphQLError('Требуется авторизация', {
extensions: { code: 'UNAUTHENTICATED' }
})
}
// Проверяем существование категории
const existingCategory = await prisma.category.findUnique({
where: { id: args.id }
})
if (!existingCategory) {
return {
success: false,
message: 'Категория не найдена'
}
}
// Проверяем уникальность нового названия (если изменилось)
if (args.input.name !== existingCategory.name) {
const duplicateCategory = await prisma.category.findUnique({
where: { name: args.input.name }
})
if (duplicateCategory) {
return {
success: false,
message: 'Категория с таким названием уже существует'
}
}
}
try {
const category = await prisma.category.update({
where: { id: args.id },
data: {
name: args.input.name
}
})
return {
success: true,
message: 'Категория успешно обновлена',
category
}
} catch (error) {
console.error('Error updating category:', error)
return {
success: false,
message: 'Ошибка при обновлении категории'
}
}
},
// Удалить категорию
deleteCategory: async (_: unknown, args: { id: string }, context: Context) => {
if (!context.user) {
throw new GraphQLError('Требуется авторизация', {
extensions: { code: 'UNAUTHENTICATED' }
})
}
// Проверяем существование категории
const existingCategory = await prisma.category.findUnique({
where: { id: args.id },
include: { products: true }
})
if (!existingCategory) {
throw new GraphQLError('Категория не найдена')
}
// Проверяем, есть ли товары в этой категории
if (existingCategory.products.length > 0) {
throw new GraphQLError('Нельзя удалить категорию, в которой есть товары')
}
try {
await prisma.category.delete({
where: { id: args.id }
})
return true
} catch (error) {
console.error('Error deleting category:', error)
return false
}
},
// Добавить товар в корзину
addToCart: async (_: unknown, args: { productId: string; quantity: number }, context: Context) => {
if (!context.user) {

View File

@ -117,6 +117,11 @@ export const typeDefs = gql`
updateProduct(id: ID!, input: ProductInput!): ProductResponse!
deleteProduct(id: ID!): Boolean!
# Работа с категориями
createCategory(input: CategoryInput!): CategoryResponse!
updateCategory(id: ID!, input: CategoryInput!): CategoryResponse!
deleteCategory(id: ID!): Boolean!
# Работа с корзиной
addToCart(productId: ID!, quantity: Int = 1): CartResponse!
updateCartItem(productId: ID!, quantity: Int!): CartResponse!
@ -489,6 +494,16 @@ export const typeDefs = gql`
product: Product
}
input CategoryInput {
name: String!
}
type CategoryResponse {
success: Boolean!
message: String!
category: Category
}
# Типы для корзины
type Cart {
id: ID!