init
This commit is contained in:
96
services/interfaces.go
Normal file
96
services/interfaces.go
Normal file
@ -0,0 +1,96 @@
|
||||
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
|
||||
}
|
Reference in New Issue
Block a user