ForgeFlow-ERP/backend/app/api/routes/system_permissions.py
2026-06-12 16:00:56 +08:00

176 lines
5.4 KiB
Python

from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.orm import Session
from app.db.session import get_db
from app.schemas.system_permissions import (
EmployeeOption,
MenuPermissionNode,
OrgEmployeeBind,
OrgNodeCreate,
OrgNodeRead,
OrgNodeUpdate,
PermissionRead,
RoleCreate,
RolePermissionUpdate,
RoleRead,
RoleUpdate,
SystemUserCreate,
SystemUserPasswordReset,
SystemUserRead,
SystemUserRoleUpdate,
SystemUserStatusUpdate,
)
from app.services.auth import AuthContext, require_system_admin
from app.services.system_permissions import (
build_org_tree,
bind_org_employee,
create_org_node,
create_role,
create_system_user,
delete_org_node,
list_employee_options,
list_menu_permission_tree,
list_permissions,
list_roles,
list_system_users,
reset_system_user_password,
unbind_org_employee,
update_org_node,
update_role,
update_system_user_roles,
update_system_user_status,
)
router = APIRouter(dependencies=[Depends(require_system_admin)])
@router.get("/org-tree", response_model=list[OrgNodeRead])
def get_org_tree(db: Session = Depends(get_db)) -> list[OrgNodeRead]:
return build_org_tree(db)
@router.post("/org-nodes", response_model=OrgNodeRead)
def post_org_node(payload: OrgNodeCreate, db: Session = Depends(get_db)) -> OrgNodeRead:
return create_org_node(db, payload)
@router.put("/org-nodes/{node_id}", response_model=OrgNodeRead)
def put_org_node(node_id: int, payload: OrgNodeUpdate, db: Session = Depends(get_db)) -> OrgNodeRead:
return update_org_node(db, node_id, payload)
@router.delete("/org-nodes/{node_id}", status_code=204)
def delete_org_node_route(node_id: int, db: Session = Depends(get_db)) -> None:
delete_org_node(db, node_id)
@router.post("/org-nodes/{node_id}/employees", response_model=OrgNodeRead)
def post_org_node_employee(
node_id: int,
payload: OrgEmployeeBind,
db: Session = Depends(get_db),
) -> OrgNodeRead:
return bind_org_employee(db, node_id, payload)
@router.delete("/org-nodes/{node_id}/employees/{employee_id}", response_model=OrgNodeRead)
def delete_org_node_employee(
node_id: int,
employee_id: int,
db: Session = Depends(get_db),
) -> OrgNodeRead:
return unbind_org_employee(db, node_id, employee_id)
@router.get("/permissions", response_model=list[PermissionRead])
def get_permissions(db: Session = Depends(get_db)) -> list[PermissionRead]:
return list_permissions(db)
@router.get("/menu-permission-tree", response_model=list[MenuPermissionNode])
def get_menu_permission_tree() -> list[MenuPermissionNode]:
return list_menu_permission_tree()
@router.get("/roles", response_model=list[RoleRead])
def get_roles(db: Session = Depends(get_db)) -> list[RoleRead]:
return list_roles(db)
@router.post("/roles", response_model=RoleRead)
def post_role(payload: RoleCreate, db: Session = Depends(get_db)) -> RoleRead:
return create_role(db, payload)
@router.put("/roles/{role_id}", response_model=RoleRead)
def put_role(role_id: int, payload: RoleUpdate, db: Session = Depends(get_db)) -> RoleRead:
return update_role(db, role_id, payload)
@router.put("/roles/{role_id}/permissions", response_model=RoleRead)
def put_role_permissions(
role_id: int,
payload: RolePermissionUpdate,
db: Session = Depends(get_db),
) -> RoleRead:
existing_role = next((role for role in list_roles(db) if role.role_id == role_id), None)
if not existing_role:
raise HTTPException(status_code=404, detail="角色不存在")
return update_role(
db,
role_id,
RoleUpdate(
role_name=existing_role.role_name,
role_scope=existing_role.role_scope,
status=existing_role.status,
remark=existing_role.remark,
permission_codes=payload.permission_codes,
),
)
@router.get("/employee-options", response_model=list[EmployeeOption])
def get_employee_options(
limit: int = Query(default=500, ge=1, le=500),
db: Session = Depends(get_db),
) -> list[EmployeeOption]:
return list_employee_options(db, limit=limit)
@router.get("/users", response_model=list[SystemUserRead])
def get_system_users(db: Session = Depends(get_db)) -> list[SystemUserRead]:
return list_system_users(db)
@router.post("/users", response_model=SystemUserRead)
def post_system_user(payload: SystemUserCreate, db: Session = Depends(get_db)) -> SystemUserRead:
return create_system_user(db, payload)
@router.put("/users/{user_id}/roles", response_model=SystemUserRead)
def put_system_user_roles(
user_id: int,
payload: SystemUserRoleUpdate,
db: Session = Depends(get_db),
) -> SystemUserRead:
return update_system_user_roles(db, user_id, payload.role_ids)
@router.put("/users/{user_id}/status", response_model=SystemUserRead)
def put_system_user_status(
user_id: int,
payload: SystemUserStatusUpdate,
db: Session = Depends(get_db),
context: AuthContext = Depends(require_system_admin),
) -> SystemUserRead:
return update_system_user_status(db, user_id, payload.status, context.user.id)
@router.post("/users/{user_id}/reset-password", response_model=SystemUserRead)
def post_system_user_password_reset(
user_id: int,
payload: SystemUserPasswordReset,
db: Session = Depends(get_db),
) -> SystemUserRead:
return reset_system_user_password(db, user_id, payload.password)