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>
This commit is contained in:
101
server/internal/service/approval_service.go
Normal file
101
server/internal/service/approval_service.go
Normal file
@@ -0,0 +1,101 @@
|
||||
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()
|
||||
}
|
||||
Reference in New Issue
Block a user