Files
ai-contract-platform/backend/app/api/users.py
T

102 lines
3.3 KiB
Python

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="business"),
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="business"),
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)