Spaces:
Sleeping
Sleeping
File size: 3,116 Bytes
3c4e575 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
from fastapi import APIRouter, Request, Depends, HTTPException, Query
from fastapi.responses import HTMLResponse
from sqlalchemy.orm import Session
from typing import List
from app import models, schemas, crud
from app.database import get_db
from app.auth import get_current_admin_user, get_current_active_user # Import both
from app.main import templates # Import templates from main.py
router = APIRouter()
# Route to serve the HTML shell for the dashboard
@router.get("/dashboard", response_class=HTMLResponse)
async def admin_dashboard_shell(request: Request):
# This route loads the page structure.
# Client-side JS will verify admin status and fetch data.
return templates.TemplateResponse("admin/dashboard.html", {
"request": request,
"title": "Admin Dashboard"
# No user or users_list passed here initially
})
# New API endpoint to fetch dashboard data (protected)
@router.get("/api/dashboard-data")
async def get_admin_dashboard_data(
db: Session = Depends(get_db),
current_user: models.User = Depends(get_current_admin_user), # Ensures only admin can access
search_query: str = Query(None, alias="search")
):
if search_query:
user = crud.get_user_by_email(db, email=search_query)
users_list = [schemas.User.from_orm(user)] if user else [] # Convert to schema
else:
users = crud.get_users(db, limit=100)
users_list = [schemas.User.from_orm(u) for u in users] # Convert list to schema
# Return data needed by the dashboard template's JS
return {"users_list": users_list, "search_query": search_query, "admin_email": current_user.email}
# Route to view specific user details (protected)
# This serves an HTML page, so it will also need the client-side auth check pattern
@router.get("/users/{user_id}", response_class=HTMLResponse)
async def admin_view_user_details_shell(request: Request, user_id: int):
# Serve the shell page. JS will fetch details.
return templates.TemplateResponse("admin/user_details.html", {
"request": request,
"user_id": user_id, # Pass user_id for JS to use
"title": f"User Details" # Generic title initially
})
# New API endpoint to fetch specific user details (protected)
@router.get("/api/users/{user_id}")
async def get_admin_user_details_data(
user_id: int,
db: Session = Depends(get_db),
current_admin: models.User = Depends(get_current_admin_user) # Ensure admin access
):
target_user = crud.get_user(db, user_id=user_id)
if not target_user:
raise HTTPException(status_code=404, detail="User not found")
user_inputs_orm = crud.get_user_data_inputs_by_user_id(db, user_id=user_id, limit=100)
# Convert ORM objects to Pydantic schemas for JSON response
target_user_schema = schemas.User.from_orm(target_user)
user_inputs_schema = [schemas.UserDataInputResponse.from_orm(item) for item in user_inputs_orm]
return {
"target_user": target_user_schema,
"user_inputs": user_inputs_schema
}
|