"""云资源管理动作路由 统一入口 /api/actions/{asset_id},把资产解析成对应平台适配器后下发真实云端指令。 安全约束: - 所有写操作(实例动作、DNS 增删改)强制 require_api_key,与项目其余写端点一致 - 每次动作由 action_service 落 EventLog 审计(source="action"),成功失败都记 - 能力探测端点 GET /capabilities 无副作用,供前端预先禁用不支持的按钮 """ from fastapi import APIRouter, Depends from sqlmodel import Session from app.core.security import require_api_key from app.database import get_session from app.schemas.action import DNSRecordIn, InstanceActionRequest from app.services import action_service router = APIRouter(prefix="/api/actions", tags=["actions"]) @router.get( "/{asset_id}/capabilities", summary="查询该资产可执行的动作(前端据此渲染/禁用按钮)", ) def capabilities(asset_id: int, session: Session = Depends(get_session)) -> dict: return action_service.asset_actions(session, asset_id) @router.post( "/{asset_id}/instance", summary="实例动作:开机 / 关机 / 重启 / 续费(真实操作云端资源)", dependencies=[Depends(require_api_key)], ) def instance_action( asset_id: int, data: InstanceActionRequest, session: Session = Depends(get_session) ) -> dict: return action_service.perform_instance_action( session, asset_id, data.action, data.period_months ) @router.get( "/{asset_id}/dns", summary="列出该域名的 DNS 解析记录", dependencies=[Depends(require_api_key)], ) def list_dns(asset_id: int, session: Session = Depends(get_session)) -> dict: return action_service.list_dns_records(session, asset_id) @router.post( "/{asset_id}/dns", summary="新增 DNS 解析记录", dependencies=[Depends(require_api_key)], ) def create_dns( asset_id: int, record: DNSRecordIn, session: Session = Depends(get_session) ) -> dict: return action_service.create_dns_record(session, asset_id, record.model_dump()) @router.put( "/{asset_id}/dns/{record_id}", summary="修改 DNS 解析记录", dependencies=[Depends(require_api_key)], ) def update_dns( asset_id: int, record_id: str, record: DNSRecordIn, session: Session = Depends(get_session), ) -> dict: return action_service.update_dns_record( session, asset_id, record_id, record.model_dump() ) @router.delete( "/{asset_id}/dns/{record_id}", summary="删除 DNS 解析记录", dependencies=[Depends(require_api_key)], ) def delete_dns( asset_id: int, record_id: str, session: Session = Depends(get_session) ) -> dict: return action_service.delete_dns_record(session, asset_id, record_id)