102 lines
3.3 KiB
Python
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)
|