Добавлены новые функции для управления категориями: реализованы мутации для создания, обновления и удаления категорий. Обновлены компоненты админ-панели для отображения и управления категориями, улучшен интерфейс и адаптивность. Добавлены новые кнопки и обработчики событий для взаимодействия с категориями.
This commit is contained in:
@ -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!) {
|
||||
|
@ -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) {
|
||||
|
@ -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!
|
||||
|
Reference in New Issue
Block a user