from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from backend.app.api.deps import get_system_service from backend.app.db import get_db_session from backend.app.schemas.common import success_payload from backend.app.schemas.system import ( CreateMenuRequest, CreateRoleRequest, CreateUserRequest, ResetPasswordRequest, UpdateMenuRequest, UpdateRoleRequest, UpdateUserRequest, ) from backend.app.services.system_service import SystemService router = APIRouter(prefix="/api/system", tags=["system"]) @router.get("/users") def list_users( username: str | None = Query(default=None), real_name: str | None = Query(default=None), mobile: str | None = Query(default=None), role_id: int | None = Query(default=None), status: int | None = Query(default=None), page_no: int = Query(default=1), page_size: int = Query(default=20), system_service: SystemService = Depends(get_system_service), session: Session = Depends(get_db_session), ) -> dict: result = system_service.list_users( session, { "username": username, "real_name": real_name, "mobile": mobile, "role_id": role_id, "status": status, }, ) start = max(page_no - 1, 0) * page_size result["list"] = result["list"][start : start + page_size] result["page_no"] = page_no result["page_size"] = page_size return success_payload(result) @router.post("/users") def create_user( payload: CreateUserRequest, system_service: SystemService = Depends(get_system_service), session: Session = Depends(get_db_session), ) -> dict: return success_payload(system_service.create_user(payload.model_dump(), session)) @router.put("/users/{user_id}") def update_user( user_id: int, payload: UpdateUserRequest, system_service: SystemService = Depends(get_system_service), session: Session = Depends(get_db_session), ) -> dict: return success_payload(system_service.update_user(user_id, payload.model_dump(), session)) @router.post("/users/{user_id}/reset-password") def reset_password( user_id: int, payload: ResetPasswordRequest, system_service: SystemService = Depends(get_system_service), session: Session = Depends(get_db_session), ) -> dict: return success_payload(system_service.reset_password(user_id, payload.new_password, session)) @router.get("/roles") def list_roles( role_name: str | None = Query(default=None), role_code: str | None = Query(default=None), status: int | None = Query(default=None), page_no: int = Query(default=1), page_size: int = Query(default=20), system_service: SystemService = Depends(get_system_service), session: Session = Depends(get_db_session), ) -> dict: result = system_service.list_roles( session, {"role_name": role_name, "role_code": role_code, "status": status}, ) start = max(page_no - 1, 0) * page_size result["list"] = result["list"][start : start + page_size] result["page_no"] = page_no result["page_size"] = page_size return success_payload(result) @router.post("/roles") def create_role( payload: CreateRoleRequest, system_service: SystemService = Depends(get_system_service), session: Session = Depends(get_db_session), ) -> dict: return success_payload(system_service.create_role(payload.model_dump(), session)) @router.put("/roles/{role_id}") def update_role( role_id: int, payload: UpdateRoleRequest, system_service: SystemService = Depends(get_system_service), session: Session = Depends(get_db_session), ) -> dict: return success_payload(system_service.update_role(role_id, payload.model_dump(), session)) @router.get("/menus") def list_menus( status: int | None = Query(default=None), menu_type: str | None = Query(default=None), system_service: SystemService = Depends(get_system_service), session: Session = Depends(get_db_session), ) -> dict: return success_payload( system_service.list_menus( session, {"status": status, "menu_type": menu_type}, ) ) @router.post("/menus") def create_menu( payload: CreateMenuRequest, system_service: SystemService = Depends(get_system_service), session: Session = Depends(get_db_session), ) -> dict: return success_payload(system_service.create_menu(payload.model_dump(), session)) @router.put("/menus/{menu_id}") def update_menu( menu_id: int, payload: UpdateMenuRequest, system_service: SystemService = Depends(get_system_service), session: Session = Depends(get_db_session), ) -> dict: return success_payload(system_service.update_menu(menu_id, payload.model_dump(), session))