Files
ai-code-review/services/interfaces.go
2025-02-18 16:53:34 +08:00

97 lines
2.4 KiB
Go

package services
import (
"code-review/services/types"
"fmt"
"log"
)
// CodeReviewer 定义代码审查的接口
type CodeReviewer interface {
Review(changes *types.CodeChanges) (*types.ReviewResult, error)
}
// WebhookEvent 定义 webhook 事件的接口
type WebhookEvent interface {
ExtractChanges() (*types.CodeChanges, error)
PostComments(result *types.ReviewResult) error
GetPlatform() string
}
// AIPool 定义 AI 池接口
type AIPool interface {
GetAI() CodeReviewer
}
// ReviewService 代码审查服务
type ReviewService struct {
aiPool AIPool
}
// NewReviewService 创建代码审查服务
func NewReviewService(aiPool AIPool) *ReviewService {
return &ReviewService{
aiPool: aiPool,
}
}
// GetCodeChanges 从 webhook 事件中提取代码变更
func (s *ReviewService) GetCodeChanges(event WebhookEvent) (*types.CodeChanges, error) {
return event.ExtractChanges()
}
// ReviewCode 使用配置的审查器进行代码审查
func (s *ReviewService) ReviewCode(changes *types.CodeChanges) (*types.ReviewResult, error) {
if s.aiPool == nil {
return nil, fmt.Errorf("未配置 AI 池")
}
ai := s.aiPool.GetAI()
if ai == nil {
log.Printf("没有可用的 AI")
return nil, fmt.Errorf("没有可用的 AI")
}
return ai.Review(changes)
}
// PostReviewComments 将审查结果发送到代码托管平台
func (s *ReviewService) PostReviewComments(event WebhookEvent, result *types.ReviewResult) error {
return event.PostComments(result)
}
// Review 执行代码审查流程
func (s *ReviewService) Review(event WebhookEvent) error {
log.Printf("开始代码审查: platform=%s", event.GetPlatform())
changes, err := event.ExtractChanges()
if err != nil {
log.Printf("提取代码变更失败: error=%v", err)
return fmt.Errorf("提取代码变更失败: %w", err)
}
// 如果没有变更或者跳过审查,直接返回
if changes == nil || len(changes.Files) == 0 {
log.Printf("没有需要审查的代码变更")
return nil
}
ai := s.aiPool.GetAI()
if ai == nil {
log.Printf("没有可用的 AI")
return fmt.Errorf("没有可用的 AI")
}
result, err := ai.Review(changes)
if err != nil {
log.Printf("AI 代码审查失败: error=%v", err)
return fmt.Errorf("AI 代码审查失败: %w", err)
}
if err := event.PostComments(result); err != nil {
log.Printf("发送审查结果失败: error=%v", err)
return fmt.Errorf("发送审查结果失败: %w", err)
}
log.Printf("代码审查完成")
return nil
}