| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 |
- from typing import List
- from fastapi import APIRouter, Depends, HTTPException, status
- from sqlalchemy.orm import Session
- from app.database import get_db
- from app.core.deps import require_roles
- from app.models.user import User
- from app.schemas.common import ApiResponse
- from app.schemas.expense_item import ExpenseItemCreate, ExpenseItemUpdate, ExpenseItemOut
- from app.services.expense_item import ExpenseItemService
- router = APIRouter(prefix="/api/expense-items", tags=["费用项目管理"])
- @router.get("/tree", response_model=ApiResponse[List[ExpenseItemOut]])
- def get_expense_item_tree(db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
- tree = ExpenseItemService.get_item_tree(db)
- return ApiResponse(data=[ExpenseItemOut.model_validate(i) for i in tree])
- @router.get("/{item_id}", response_model=ApiResponse[ExpenseItemOut])
- def get_expense_item(item_id: int, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
- item = ExpenseItemService.get_by_id(db, item_id)
- if not item:
- raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="费用项目不存在")
- return ApiResponse(data=ExpenseItemOut.model_validate(item))
- @router.post("/", response_model=ApiResponse[ExpenseItemOut])
- def create_expense_item(body: ExpenseItemCreate, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
- data = body.model_dump(exclude_unset=True)
- item = ExpenseItemService.create(db, data)
- return ApiResponse(data=ExpenseItemOut.model_validate(item))
- @router.put("/{item_id}", response_model=ApiResponse[ExpenseItemOut])
- def update_expense_item(item_id: int, body: ExpenseItemUpdate, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
- data = body.model_dump(exclude_unset=True)
- item = ExpenseItemService.update(db, item_id, data)
- if not item:
- raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="费用项目不存在")
- return ApiResponse(data=ExpenseItemOut.model_validate(item))
- @router.delete("/{item_id}", response_model=ApiResponse[None])
- def delete_expense_item(item_id: int, db: Session = Depends(get_db), _: User = Depends(require_roles("ADMIN"))):
- ExpenseItemService.soft_delete(db, item_id)
- return ApiResponse(data=None)
|