arkan-api / app /routers /admin.py
masry86's picture
initial commit - arkan backend
de0f1ef
# ✅ الملف الكامل بعد التعديل
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)