vsarvesh's picture
Deploy Khayal FastAPI backend
8b8fb5b
Raw
History Blame Contribute Delete
2.27 kB
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select, func
from app.core.database import get_db
from app.core.security import get_current_user
from app.core.config import settings
from app.models.user import User, UserRole
from app.models.appointment import Appointment
from app.models.fitness import ActivityLog
router = APIRouter()
async def verify_admin(current_user: User = Depends(get_current_user)):
if current_user.role != UserRole.ADMIN:
raise HTTPException(status_code=403, detail="Admin access required")
return current_user
@router.get("/users")
async def admin_get_users(
db: AsyncSession = Depends(get_db),
admin: User = Depends(verify_admin),
):
result = await db.execute(select(User).order_by(User.created_at.desc()))
return result.scalars().all()
@router.get("/analytics")
async def admin_analytics(
db: AsyncSession = Depends(get_db),
admin: User = Depends(verify_admin),
):
total_users = await db.scalar(select(func.count(User.id)))
total_appointments = await db.scalar(select(func.count(Appointment.id)))
verified_users = await db.scalar(select(func.count(User.id)).where(User.is_verified == True))
return {
"total_users": total_users or 0,
"total_appointments": total_appointments or 0,
"verified_users": verified_users or 0,
"appointments_by_status": {},
"users_by_role": {},
}
@router.get("/activity-logs")
async def admin_activity_logs(
db: AsyncSession = Depends(get_db),
admin: User = Depends(verify_admin),
):
result = await db.execute(
select(ActivityLog).order_by(ActivityLog.created_at.desc()).limit(100)
)
return result.scalars().all()
@router.put("/users/{user_id}/role")
async def admin_update_role(
user_id: int,
role: UserRole,
db: AsyncSession = Depends(get_db),
admin: User = Depends(verify_admin),
):
result = await db.execute(select(User).where(User.id == user_id))
user = result.scalar_one_or_none()
if not user:
raise HTTPException(status_code=404, detail="User not found")
user.role = role
await db.commit()
return {"message": f"User role updated to {role.value}"}