| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- # 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="分类删除成功")
|