| from fastapi import APIRouter, Depends, HTTPException, status |
| from sqlalchemy.orm import Session |
|
|
| from app.dependencies import get_current_admin_user, get_db |
| from app.models.user import User |
| from app.schemas.admin import AdminDepartmentUpdate, AdminUserUpdate |
| from app.schemas.department import DepartmentCreate, DepartmentResponse |
| from app.schemas.user import UserRead |
| from app.services.admin_service import ( |
| create_department, |
| deactivate_department, |
| deactivate_user, |
| get_department, |
| get_user, |
| list_departments, |
| list_users, |
| update_department, |
| update_user, |
| ) |
|
|
|
|
| router = APIRouter(prefix="/admin", tags=["admin"]) |
|
|
|
|
| def _raise_not_found(entity: str) -> None: |
| raise HTTPException( |
| status_code=status.HTTP_404_NOT_FOUND, |
| detail=f"{entity} not found", |
| ) |
|
|
|
|
| @router.get("/departments", response_model=list[DepartmentResponse]) |
| def admin_list_departments( |
| db: Session = Depends(get_db), |
| current_admin: User = Depends(get_current_admin_user), |
| ): |
| _ = current_admin |
| return list_departments(db) |
|
|
|
|
| @router.post("/departments", response_model=DepartmentResponse, status_code=status.HTTP_201_CREATED) |
| def admin_create_department( |
| payload: DepartmentCreate, |
| db: Session = Depends(get_db), |
| current_admin: User = Depends(get_current_admin_user), |
| ): |
| _ = current_admin |
| try: |
| return create_department(db, **payload.model_dump()) |
| except ValueError as exc: |
| raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=str(exc)) from exc |
|
|
|
|
| @router.put("/departments/{department_id}", response_model=DepartmentResponse) |
| def admin_update_department( |
| department_id: int, |
| payload: AdminDepartmentUpdate, |
| db: Session = Depends(get_db), |
| current_admin: User = Depends(get_current_admin_user), |
| ): |
| _ = current_admin |
| try: |
| department = update_department(db, department_id=department_id, payload=payload) |
| except ValueError as exc: |
| message = str(exc) |
| status_code = status.HTTP_404_NOT_FOUND if message == "Department not found" else status.HTTP_400_BAD_REQUEST |
| raise HTTPException(status_code=status_code, detail=message) from exc |
| return department |
|
|
|
|
| @router.delete("/departments/{department_id}", response_model=DepartmentResponse) |
| def admin_deactivate_department( |
| department_id: int, |
| db: Session = Depends(get_db), |
| current_admin: User = Depends(get_current_admin_user), |
| ): |
| _ = current_admin |
| try: |
| department = deactivate_department(db, department_id=department_id) |
| except ValueError as exc: |
| raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(exc)) from exc |
| return department |
|
|
|
|
| @router.get("/users", response_model=list[UserRead]) |
| def admin_list_users( |
| db: Session = Depends(get_db), |
| current_admin: User = Depends(get_current_admin_user), |
| ): |
| _ = current_admin |
| return list_users(db) |
|
|
|
|
| @router.get("/users/{user_id}", response_model=UserRead) |
| def admin_get_user( |
| user_id: int, |
| db: Session = Depends(get_db), |
| current_admin: User = Depends(get_current_admin_user), |
| ): |
| _ = current_admin |
| user = get_user(db, user_id=user_id) |
| if user is None: |
| _raise_not_found("User") |
| return user |
|
|
|
|
| @router.put("/users/{user_id}", response_model=UserRead) |
| def admin_update_user( |
| user_id: int, |
| payload: AdminUserUpdate, |
| db: Session = Depends(get_db), |
| current_admin: User = Depends(get_current_admin_user), |
| ): |
| _ = current_admin |
| try: |
| user = update_user(db, user_id=user_id, payload=payload) |
| except ValueError as exc: |
| message = str(exc) |
| status_code = status.HTTP_404_NOT_FOUND if message == "User not found" else status.HTTP_400_BAD_REQUEST |
| raise HTTPException(status_code=status_code, detail=message) from exc |
| return user |
|
|
|
|
| @router.delete("/users/{user_id}", response_model=UserRead) |
| def admin_deactivate_user( |
| user_id: int, |
| db: Session = Depends(get_db), |
| current_admin: User = Depends(get_current_admin_user), |
| ): |
| _ = current_admin |
| try: |
| user = deactivate_user(db, user_id=user_id) |
| except ValueError as exc: |
| raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=str(exc)) from exc |
| return user |
|
|