from typing import Optional from fastapi import APIRouter, Depends, Form, Header from sqlalchemy.orm import Session from app.core.response import success_response from app.db import get_db_session from app.services.audit_log_service import AuditLogService from app.services.auth_service import AuthService from app.services.user_service import UserService router = APIRouter(prefix="/users", tags=["users"]) ROUTE_PERMISSION_SCOPE = "user_management" ROUTE_PERMISSION_ACTIONS = { "list": "users:list", "create": "users:create", "update": "users:update", } def get_user_service(db: Session = Depends(get_db_session)) -> UserService: return UserService(db) def get_audit_log_service(db: Session = Depends(get_db_session)) -> AuditLogService: return AuditLogService(db) def require_current_user( authorization: Optional[str] = Header(default=None), db: Session = Depends(get_db_session), ): return AuthService(db).require_current_user(authorization) @router.get("") def list_users( page: int = 1, page_size: int = 20, user_service: UserService = Depends(get_user_service), current_user: dict = Depends(require_current_user), ): return success_response(user_service.list_users(current_user, page, page_size)) @router.post("") def create_user( username: str = Form(...), display_name: str = Form(...), password: str = Form(...), role: str = Form(default="member"), status_value: str = Form(alias="status", default="active"), user_service: UserService = Depends(get_user_service), audit_log_service: AuditLogService = Depends(get_audit_log_service), current_user: dict = Depends(require_current_user), ): result = user_service.create_user(current_user, username, display_name, password, role, status_value) audit_log_service.record_event( tenant_id=current_user.get("tenant_id"), user_id=current_user.get("id"), action="create_user", resource_type="user", resource_id=result["id"], detail_json={ "username": result["username"], "display_name": result["display_name"], "role": result["role"], "status": result["status"], }, ) return success_response(result) @router.put("/{user_id}") def update_user( user_id: str, username: str = Form(...), display_name: str = Form(...), password: Optional[str] = Form(default=None), role: str = Form(default="member"), status_value: str = Form(alias="status", default="active"), user_service: UserService = Depends(get_user_service), audit_log_service: AuditLogService = Depends(get_audit_log_service), current_user: dict = Depends(require_current_user), ): result = user_service.update_user(current_user, user_id, username, display_name, password, role, status_value) audit_log_service.record_event( tenant_id=current_user.get("tenant_id"), user_id=current_user.get("id"), action="update_user", resource_type="user", resource_id=result["id"], detail_json={ "username": result["username"], "display_name": result["display_name"], "role": result["role"], "status": result["status"], "password_changed": bool(password and password.strip()), }, ) return success_response(result)