categories.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. # backend/app/api/categories.py
  2. from fastapi import APIRouter, Depends, HTTPException, status
  3. from sqlalchemy.orm import Session
  4. from typing import List
  5. from ..database import get_db
  6. from ..models import Category, Spider
  7. from ..schemas import CategoryCreate, CategoryUpdate, Category, ListResponse, SuccessResponse
  8. from ..services.category_service import CategoryService
  9. router = APIRouter(prefix="/api/categories", tags=["categories"])
  10. @router.post("/", response_model=Category)
  11. def create_category(category: CategoryCreate, db: Session = Depends(get_db)):
  12. if CategoryService.check_category_name_exists(db, category.name):
  13. raise HTTPException(
  14. status_code=status.HTTP_400_BAD_REQUEST,
  15. detail="分类名称已存在"
  16. )
  17. db_category = Category(**category.dict())
  18. db.add(db_category)
  19. db.commit()
  20. db.refresh(db_category)
  21. return db_category
  22. @router.get("/", response_model=ListResponse)
  23. def get_categories(db: Session = Depends(get_db)):
  24. categories = db.query(Category).all()
  25. for category in categories:
  26. category.spider_count = CategoryService.get_spider_count(db, category.id)
  27. return ListResponse(total=len(categories), items=categories)
  28. @router.put("/{category_id}", response_model=Category)
  29. def update_category(category_id: int, category: CategoryUpdate, db: Session = Depends(get_db)):
  30. db_category = CategoryService.get_category_by_id(db, category_id)
  31. if category.name and category.name != db_category.name:
  32. if CategoryService.check_category_name_exists(db, category.name, exclude_id=category_id):
  33. raise HTTPException(
  34. status_code=status.HTTP_400_BAD_REQUEST,
  35. detail="分类名称已存在"
  36. )
  37. update_data = category.dict(exclude_unset=True)
  38. for field, value in update_data.items():
  39. setattr(db_category, field, value)
  40. db.commit()
  41. db.refresh(db_category)
  42. return db_category
  43. @router.delete("/{category_id}")
  44. def delete_category(category_id: int, db: Session = Depends(get_db)):
  45. db_category = CategoryService.get_category_by_id(db, category_id)
  46. spider_count = CategoryService.get_spider_count(db, category_id)
  47. if spider_count > 0:
  48. raise HTTPException(
  49. status_code=status.HTTP_400_BAD_REQUEST,
  50. detail=f"该分类下还有 {spider_count} 个脚本,无法删除"
  51. )
  52. db.delete(db_category)
  53. db.commit()
  54. return SuccessResponse(success=True, message="分类删除成功")