Files
X-Agents/server/internal/service/approval_service.go
DESKTOP-72TV0V4\caoxiaozhu b2bc9988a9 feat: 重构前后端架构,添加Go后端和Python Agent服务
- 新增 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>
2026-03-06 16:39:42 +08:00

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()
}