176 lines
5.4 KiB
Python
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)
|