Spaces:
Sleeping
Sleeping
const asyncHandler = require('express-async-handler'); | |
const Category = require('../models/Category'); | |
const PromptGroup = require('../models/PromptGroup'); | |
// @desc 获取所有分类 | |
// @route GET /api/categories | |
// @access Private | |
const getCategories = asyncHandler(async (req, res) => { | |
const categories = await Category.find({}).sort({ name: 1 }); | |
res.json(categories); | |
}); | |
// @desc 通过ID获取分类 | |
// @route GET /api/categories/:id | |
// @access Private | |
const getCategoryById = asyncHandler(async (req, res) => { | |
const category = await Category.findById(req.params.id); | |
if (category) { | |
res.json(category); | |
} else { | |
res.status(404); | |
throw new Error('分类未找到'); | |
} | |
}); | |
// @desc 创建分类 | |
// @route POST /api/categories | |
// @access Private | |
const createCategory = asyncHandler(async (req, res) => { | |
const { name, color } = req.body; | |
// 检查是否分类名称已存在 | |
const categoryExists = await Category.findOne({ name }); | |
if (categoryExists) { | |
res.status(400); | |
throw new Error('分类名称已存在'); | |
} | |
const category = await Category.create({ | |
name, | |
color: color || '#007AFF', | |
}); | |
if (category) { | |
res.status(201).json(category); | |
} else { | |
res.status(400); | |
throw new Error('无效的分类数据'); | |
} | |
}); | |
// @desc 更新分类 | |
// @route PUT /api/categories/:id | |
// @access Private | |
const updateCategory = asyncHandler(async (req, res) => { | |
const { name, color } = req.body; | |
const category = await Category.findById(req.params.id); | |
if (category) { | |
// 如果更改了名称,检查新名称是否已存在 | |
if (name && name !== category.name) { | |
const categoryExists = await Category.findOne({ name }); | |
if (categoryExists) { | |
res.status(400); | |
throw new Error('分类名称已存在'); | |
} | |
} | |
category.name = name || category.name; | |
category.color = color || category.color; | |
const updatedCategory = await category.save(); | |
res.json(updatedCategory); | |
} else { | |
res.status(404); | |
throw new Error('分类未找到'); | |
} | |
}); | |
// @desc 删除分类 | |
// @route DELETE /api/categories/:id | |
// @access Private | |
const deleteCategory = asyncHandler(async (req, res) => { | |
const category = await Category.findById(req.params.id); | |
if (!category) { | |
res.status(404); | |
throw new Error('分类未找到'); | |
} | |
// 检查是否有提示词组使用该分类 | |
const groupsUsingCategory = await PromptGroup.countDocuments({ category: req.params.id }); | |
if (groupsUsingCategory > 0) { | |
res.status(400); | |
throw new Error(`无法删除分类,有 ${groupsUsingCategory} 个提示词组正在使用它`); | |
} | |
await category.deleteOne(); | |
res.json({ message: '分类已删除' }); | |
}); | |
module.exports = { | |
getCategories, | |
getCategoryById, | |
createCategory, | |
updateCategory, | |
deleteCategory, | |
}; |