from fastapi import APIRouter, Depends, Request from sqlmodel import Session from core.database import get_session from schemas.dashboard import ( BotCreateRequest, BotDeployRequest, BotEnvParamsUpdateRequest, BotMcpConfigUpdateRequest, BotToolsConfigUpdateRequest, BotUpdateRequest, ChannelConfigRequest, ChannelConfigUpdateRequest, ) from api.dashboard_router_support import DashboardRouterDeps def build_dashboard_bot_admin_router(*, deps: DashboardRouterDeps) -> APIRouter: router = APIRouter() @router.post("/api/bots") def create_bot(payload: BotCreateRequest, session: Session = Depends(get_session)): return deps.bot_lifecycle_service.create_bot(session=session, payload=payload) @router.get("/api/bots") def list_bots(request: Request, session: Session = Depends(get_session)): current_user_id = int(getattr(request.state, "sys_user_id", 0) or 0) return deps.bot_query_service.list_bots(app_state=request.app.state, session=session, current_user_id=current_user_id) @router.get("/api/bots/{bot_id}") def get_bot_detail(bot_id: str, request: Request, session: Session = Depends(get_session)): return deps.bot_query_service.get_bot_detail(app_state=request.app.state, session=session, bot_id=bot_id) @router.get("/api/bots/{bot_id}/resources") def get_bot_resources(bot_id: str, request: Request, session: Session = Depends(get_session)): return deps.bot_query_service.get_bot_resources(app_state=request.app.state, session=session, bot_id=bot_id) @router.put("/api/bots/{bot_id}") def update_bot(bot_id: str, payload: BotUpdateRequest, session: Session = Depends(get_session)): return deps.bot_lifecycle_service.update_bot(session=session, bot_id=bot_id, payload=payload) @router.post("/api/bots/{bot_id}/deploy") async def deploy_bot(bot_id: str, payload: BotDeployRequest, request: Request, session: Session = Depends(get_session)): return await deps.bot_lifecycle_service.deploy_bot( app_state=request.app.state, session=session, bot_id=bot_id, node_id=payload.node_id, runtime_kind=payload.runtime_kind, image_tag=payload.image_tag, auto_start=bool(payload.auto_start), ) @router.post("/api/bots/{bot_id}/start") async def start_bot(bot_id: str, request: Request, session: Session = Depends(get_session)): return await deps.bot_lifecycle_service.start_bot(app_state=request.app.state, session=session, bot_id=bot_id) @router.post("/api/bots/{bot_id}/stop") def stop_bot(bot_id: str, request: Request, session: Session = Depends(get_session)): return deps.bot_lifecycle_service.stop_bot(app_state=request.app.state, session=session, bot_id=bot_id) @router.post("/api/bots/{bot_id}/enable") def enable_bot(bot_id: str, session: Session = Depends(get_session)): return deps.bot_lifecycle_service.enable_bot(session=session, bot_id=bot_id) @router.post("/api/bots/{bot_id}/disable") def disable_bot(bot_id: str, request: Request, session: Session = Depends(get_session)): return deps.bot_lifecycle_service.disable_bot(app_state=request.app.state, session=session, bot_id=bot_id) @router.post("/api/bots/{bot_id}/deactivate") def deactivate_bot(bot_id: str, request: Request, session: Session = Depends(get_session)): return deps.bot_lifecycle_service.deactivate_bot(app_state=request.app.state, session=session, bot_id=bot_id) @router.delete("/api/bots/{bot_id}") def delete_bot(bot_id: str, request: Request, delete_workspace: bool = True, session: Session = Depends(get_session)): return deps.bot_lifecycle_service.delete_bot( app_state=request.app.state, session=session, bot_id=bot_id, delete_workspace=delete_workspace, ) @router.get("/api/bots/{bot_id}/channels") def list_bot_channels(bot_id: str, session: Session = Depends(get_session)): return deps.bot_channel_service.list_channels(session=session, bot_id=bot_id) @router.post("/api/bots/{bot_id}/channels") def create_bot_channel(bot_id: str, payload: ChannelConfigRequest, session: Session = Depends(get_session)): return deps.bot_channel_service.create_channel(session=session, bot_id=bot_id, payload=payload) @router.put("/api/bots/{bot_id}/channels/{channel_id}") def update_bot_channel(bot_id: str, channel_id: str, payload: ChannelConfigUpdateRequest, session: Session = Depends(get_session)): return deps.bot_channel_service.update_channel( session=session, bot_id=bot_id, channel_id=channel_id, payload=payload, ) @router.delete("/api/bots/{bot_id}/channels/{channel_id}") def delete_bot_channel(bot_id: str, channel_id: str, session: Session = Depends(get_session)): return deps.bot_channel_service.delete_channel(session=session, bot_id=bot_id, channel_id=channel_id) @router.get("/api/bots/{bot_id}/tools-config") def get_bot_tools_config(bot_id: str, session: Session = Depends(get_session)): return deps.bot_query_service.get_tools_config(session=session, bot_id=bot_id) @router.put("/api/bots/{bot_id}/tools-config") def update_bot_tools_config(bot_id: str, payload: BotToolsConfigUpdateRequest, session: Session = Depends(get_session)): return deps.bot_query_service.update_tools_config(session=session, bot_id=bot_id, payload=payload) @router.get("/api/bots/{bot_id}/mcp-config") def get_bot_mcp_config(bot_id: str, session: Session = Depends(get_session)): return deps.bot_config_state_service.get_mcp_config_for_bot(session=session, bot_id=bot_id) @router.put("/api/bots/{bot_id}/mcp-config") def update_bot_mcp_config(bot_id: str, payload: BotMcpConfigUpdateRequest, session: Session = Depends(get_session)): return deps.bot_config_state_service.update_mcp_config_for_bot( session=session, bot_id=bot_id, mcp_servers=payload.mcp_servers, ) @router.get("/api/bots/{bot_id}/env-params") def get_bot_env_params(bot_id: str, session: Session = Depends(get_session)): return deps.bot_config_state_service.get_env_params_for_bot(session=session, bot_id=bot_id) @router.put("/api/bots/{bot_id}/env-params") def update_bot_env_params(bot_id: str, payload: BotEnvParamsUpdateRequest, session: Session = Depends(get_session)): return deps.bot_config_state_service.update_env_params_for_bot( session=session, bot_id=bot_id, env_params=payload.env_params, ) @router.get("/api/bots/{bot_id}/cron/jobs") def list_cron_jobs(bot_id: str, include_disabled: bool = True, session: Session = Depends(get_session)): return deps.bot_config_state_service.list_cron_jobs_for_bot( session=session, bot_id=bot_id, include_disabled=include_disabled, ) @router.post("/api/bots/{bot_id}/cron/jobs/{job_id}/stop") def stop_cron_job(bot_id: str, job_id: str, session: Session = Depends(get_session)): return deps.bot_config_state_service.stop_cron_job_for_bot(session=session, bot_id=bot_id, job_id=job_id) @router.delete("/api/bots/{bot_id}/cron/jobs/{job_id}") def delete_cron_job(bot_id: str, job_id: str, session: Session = Depends(get_session)): return deps.bot_config_state_service.delete_cron_job_for_bot(session=session, bot_id=bot_id, job_id=job_id) return router