| |
| from fastapi import APIRouter, Depends, Query, Request |
|
|
| from app.core.config import settings |
| from app.core.limiter import limiter |
| from app.models.user import User |
| from app.repositories.booking import BookingRepository |
| from app.repositories.user import UserRepository |
| from app.routers.deps import get_admin_user, get_booking_repo, get_user_repo |
| from app.schemas.user import UserCreate, UserListResponse, UserResponse, UserUpdate |
| from app.services.booking import BookingService |
| from app.services.user import UserService |
|
|
| router = APIRouter(prefix="/admin", tags=["Admin"]) |
|
|
|
|
| def _user_svc(repo: UserRepository = Depends(get_user_repo)) -> UserService: |
| return UserService(repo) |
|
|
|
|
| def _booking_svc(repo: BookingRepository = Depends(get_booking_repo)) -> BookingService: |
| return BookingService(repo) |
|
|
|
|
| @router.get("/stats") |
| @limiter.limit(settings.RATE_LIMIT_DEFAULT) |
| async def get_stats( |
| request: Request, |
| _: User = Depends(get_admin_user), |
| user_svc: UserService = Depends(_user_svc), |
| booking_svc: BookingService = Depends(_booking_svc), |
| ): |
| users_data = await user_svc.list_users(page=1, size=1) |
| bookings_data = await booking_svc.list_bookings(page=1, size=1) |
| return { |
| "total_users": users_data.total, |
| "total_bookings": bookings_data.total, |
| "total_revenue": 0.0, |
| } |
|
|
|
|
| @router.get("/users", response_model=UserListResponse) |
| @limiter.limit(settings.RATE_LIMIT_DEFAULT) |
| async def list_users( |
| request: Request, |
| page: int = Query(1, ge=1), |
| size: int = Query(20, ge=1, le=100), |
| _: User = Depends(get_admin_user), |
| svc: UserService = Depends(_user_svc), |
| ): |
| return await svc.list_users(page, size) |
|
|
|
|
| @router.post("/users", response_model=UserResponse, status_code=201) |
| @limiter.limit("10/minute") |
| async def create_user( |
| request: Request, |
| data: UserCreate, |
| _: User = Depends(get_admin_user), |
| svc: UserService = Depends(_user_svc), |
| ): |
| return await svc.create_user(data) |
|
|
|
|
| @router.get("/users/{user_id}", response_model=UserResponse) |
| @limiter.limit(settings.RATE_LIMIT_DEFAULT) |
| async def get_user( |
| request: Request, |
| user_id: int, |
| _: User = Depends(get_admin_user), |
| svc: UserService = Depends(_user_svc), |
| ): |
| return await svc.get_user(user_id) |
|
|
|
|
| @router.patch("/users/{user_id}", response_model=UserResponse) |
| @limiter.limit(settings.RATE_LIMIT_DEFAULT) |
| async def update_user( |
| request: Request, |
| user_id: int, |
| data: UserUpdate, |
| _: User = Depends(get_admin_user), |
| svc: UserService = Depends(_user_svc), |
| ): |
| return await svc.update_user(user_id, data) |
|
|
|
|
| @router.delete("/users/{user_id}", status_code=204) |
| @limiter.limit("10/minute") |
| async def delete_user( |
| request: Request, |
| user_id: int, |
| current_admin: User = Depends(get_admin_user), |
| svc: UserService = Depends(_user_svc), |
| ): |
| await svc.delete_user(user_id, current_admin.id) |