- 新增 Go 语言后端服务(server/),包含用户认证、Agent管理、数据库连接等API - 新增 Python Agent 服务(agent/),实现Agent核心逻辑和工具集 - 前端从原生HTML迁移到Vue.js框架(web/src/) - 添加 Docker Compose 支持(docker-compose.yml) - 添加项目架构文档(docs/ARCHITECTURE.md) - 添加环境变量示例(.env.example)和本地启动脚本(start-local.ps1) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
102 lines
2.3 KiB
Go
102 lines
2.3 KiB
Go
package service
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"x-agents/server/internal/model"
|
|
"x-agents/server/internal/repository"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
type ApprovalService struct {
|
|
auditRepo *repository.AuditRepository
|
|
}
|
|
|
|
func NewApprovalService(auditRepo *repository.AuditRepository) *ApprovalService {
|
|
return &ApprovalService{auditRepo: auditRepo}
|
|
}
|
|
|
|
// CreateApprovalRequest 创建审批请求
|
|
func (s *ApprovalService) CreateApprovalRequest(
|
|
toolName string,
|
|
params map[string]interface{},
|
|
userID string,
|
|
agentID string,
|
|
reason string,
|
|
) (*model.ToolApprovalRequest, error) {
|
|
|
|
req := &model.ToolApprovalRequest{
|
|
ID: uuid.New().String(),
|
|
ToolName: toolName,
|
|
Params: params,
|
|
UserID: userID,
|
|
AgentID: agentID,
|
|
Reason: reason,
|
|
Status: model.ApprovalStatusPending,
|
|
}
|
|
|
|
if err := s.auditRepo.CreateApproval(req); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return req, nil
|
|
}
|
|
|
|
// Approve 批准请求
|
|
func (s *ApprovalService) Approve(requestID, reviewedBy string) (*model.ToolApprovalRequest, error) {
|
|
req, err := s.auditRepo.FindApprovalByID(requestID)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("request not found: %w", err)
|
|
}
|
|
|
|
if req.Status != model.ApprovalStatusPending {
|
|
return nil, fmt.Errorf("request already processed")
|
|
}
|
|
|
|
now := time.Now()
|
|
req.Status = model.ApprovalStatusApproved
|
|
req.ReviewedBy = &reviewedBy
|
|
req.ReviewedAt = &now
|
|
|
|
if err := s.auditRepo.UpdateApproval(req); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return req, nil
|
|
}
|
|
|
|
// Reject 拒绝请求
|
|
func (s *ApprovalService) Reject(requestID, reviewedBy string) (*model.ToolApprovalRequest, error) {
|
|
req, err := s.auditRepo.FindApprovalByID(requestID)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("request not found: %w", err)
|
|
}
|
|
|
|
if req.Status != model.ApprovalStatusPending {
|
|
return nil, fmt.Errorf("request already processed")
|
|
}
|
|
|
|
now := time.Now()
|
|
req.Status = model.ApprovalStatusRejected
|
|
req.ReviewedBy = &reviewedBy
|
|
req.ReviewedAt = &now
|
|
|
|
if err := s.auditRepo.UpdateApproval(req); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return req, nil
|
|
}
|
|
|
|
// GetApproval 获取审批状态
|
|
func (s *ApprovalService) GetApproval(requestID string) (*model.ToolApprovalRequest, error) {
|
|
return s.auditRepo.FindApprovalByID(requestID)
|
|
}
|
|
|
|
// GetPendingApprovals 获取待审批列表
|
|
func (s *ApprovalService) GetPendingApprovals() ([]model.ToolApprovalRequest, error) {
|
|
return s.auditRepo.FindPendingApprovals()
|
|
}
|