# backend/app/api/categories.py from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from typing import List from ..database import get_db from ..models import Category, Spider from ..schemas import CategoryCreate, CategoryUpdate, Category, ListResponse, SuccessResponse from ..services.category_service import CategoryService router = APIRouter(prefix="/api/categories", tags=["categories"]) @router.post("/", response_model=Category) def create_category(category: CategoryCreate, db: Session = Depends(get_db)): if CategoryService.check_category_name_exists(db, category.name): raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="分类名称已存在" ) db_category = Category(**category.dict()) db.add(db_category) db.commit() db.refresh(db_category) return db_category @router.get("/", response_model=ListResponse) def get_categories(db: Session = Depends(get_db)): categories = db.query(Category).all() for category in categories: category.spider_count = CategoryService.get_spider_count(db, category.id) return ListResponse(total=len(categories), items=categories) @router.put("/{category_id}", response_model=Category) def update_category(category_id: int, category: CategoryUpdate, db: Session = Depends(get_db)): db_category = CategoryService.get_category_by_id(db, category_id) if category.name and category.name != db_category.name: if CategoryService.check_category_name_exists(db, category.name, exclude_id=category_id): raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="分类名称已存在" ) update_data = category.dict(exclude_unset=True) for field, value in update_data.items(): setattr(db_category, field, value) db.commit() db.refresh(db_category) return db_category @router.delete("/{category_id}") def delete_category(category_id: int, db: Session = Depends(get_db)): db_category = CategoryService.get_category_by_id(db, category_id) spider_count = CategoryService.get_spider_count(db, category_id) if spider_count > 0: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail=f"该分类下还有 {spider_count} 个脚本,无法删除" ) db.delete(db_category) db.commit() return SuccessResponse(success=True, message="分类删除成功")