11# webapp/packages/api/user-service/main.py
2- from fastapi import APIRouter , FastAPI , UploadFile , File , Depends , HTTPException , BackgroundTasks , Request
2+ from fastapi import APIRouter , FastAPI , UploadFile , File , Depends , HTTPException , BackgroundTasks , Request , Header
33from fastapi .responses import JSONResponse
44from fastapi .middleware .cors import CORSMiddleware
55from typing import Annotated , Optional , Dict , Any , List
@@ -150,6 +150,14 @@ class AddUsageRequest(BaseModel):
150150
151151 model_config = ConfigDict (populate_by_name = True )
152152
153+
154+ class AdminUpdateUserRequest (BaseModel ):
155+ monthly_allowance : Optional [float ] = Field (default = None , alias = "monthlyAllowance" )
156+ allowance_reset_date : Optional [float ] = Field (default = None , alias = "allowanceResetDate" )
157+ spend_remaining : Optional [float ] = Field (default = None , alias = "spendRemaining" )
158+
159+ model_config = ConfigDict (populate_by_name = True )
160+
153161# Import models after defining local ones to avoid circular dependencies
154162from models .chat import ChatRequest , ChatMessage , ChatResponse , ProviderConfig , SessionData
155163
@@ -165,6 +173,14 @@ def get_logger() -> ObservabilityService:
165173def get_user_service_dep (db : DatabaseService = Depends (get_db )) -> UserService :
166174 return get_user_service (db )
167175
176+
177+ def require_admin_access (admin_password : str | None = Header (default = None , alias = "X-Admin-Password" )):
178+ if not settings .ADMIN_PANEL_ENABLED :
179+ raise HTTPException (status_code = 403 , detail = "Admin panel is disabled" )
180+
181+ if admin_password != settings .ADMIN_PANEL_PASSWORD :
182+ raise HTTPException (status_code = 401 , detail = "Invalid admin password" )
183+
168184# Background task for LLM processing
169185async def process_chat (ticket_id : str , request : ChatRequest , user : dict , req : Request ):
170186 # Background tasks don't have access to dependency injection, so we get service instances directly
@@ -394,6 +410,29 @@ def get_current_user_profile(user: dict = Depends(get_current_user), user_servic
394410 return user_service .get_user (user .get ("uid" , "anonymous" ), user )
395411
396412
413+ @router .get ("/admin/users" , response_model = List [User ])
414+ def list_all_users (
415+ user_service : UserService = Depends (get_user_service_dep ),
416+ _ : None = Depends (require_admin_access ),
417+ ):
418+ return user_service .list_users ()
419+
420+
421+ @router .put ("/admin/users/{user_id}" , response_model = User )
422+ def update_user_allowances (
423+ user_id : str ,
424+ request : AdminUpdateUserRequest ,
425+ user_service : UserService = Depends (get_user_service_dep ),
426+ _ : None = Depends (require_admin_access ),
427+ ):
428+ return user_service .update_user_usage_info (
429+ user_id ,
430+ monthly_allowance = request .monthly_allowance ,
431+ allowance_reset_date = request .allowance_reset_date ,
432+ spend_remaining = request .spend_remaining ,
433+ )
434+
435+
397436@router .put ("/users/me/monthly-allowance" , response_model = User )
398437def set_monthly_allowance (
399438 request : UpdateMonthlyAllowanceRequest ,
0 commit comments