79 lines
2.0 KiB
Go
79 lines
2.0 KiB
Go
// Filename: internal/service/log_service.go
|
|
package service
|
|
|
|
import (
|
|
"gemini-balancer/internal/models"
|
|
"strconv"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type LogService struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewLogService(db *gorm.DB) *LogService {
|
|
return &LogService{db: db}
|
|
}
|
|
|
|
func (s *LogService) Record(log *models.RequestLog) error {
|
|
return s.db.Create(log).Error
|
|
}
|
|
|
|
func (s *LogService) GetLogs(c *gin.Context) ([]models.RequestLog, int64, error) {
|
|
var logs []models.RequestLog
|
|
var total int64
|
|
|
|
query := s.db.Model(&models.RequestLog{}).Scopes(s.filtersScope(c))
|
|
|
|
// 先计算总数
|
|
if err := query.Count(&total).Error; err != nil {
|
|
return nil, 0, err
|
|
}
|
|
if total == 0 {
|
|
return []models.RequestLog{}, 0, nil
|
|
}
|
|
|
|
// 再执行分页查询
|
|
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
|
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
|
|
offset := (page - 1) * pageSize
|
|
|
|
err := query.Order("request_time desc").Limit(pageSize).Offset(offset).Find(&logs).Error
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
return logs, total, nil
|
|
}
|
|
|
|
func (s *LogService) filtersScope(c *gin.Context) func(db *gorm.DB) *gorm.DB {
|
|
return func(db *gorm.DB) *gorm.DB {
|
|
if modelName := c.Query("model_name"); modelName != "" {
|
|
db = db.Where("model_name = ?", modelName)
|
|
}
|
|
if isSuccessStr := c.Query("is_success"); isSuccessStr != "" {
|
|
if isSuccess, err := strconv.ParseBool(isSuccessStr); err == nil {
|
|
db = db.Where("is_success = ?", isSuccess)
|
|
}
|
|
}
|
|
if statusCodeStr := c.Query("status_code"); statusCodeStr != "" {
|
|
if statusCode, err := strconv.Atoi(statusCodeStr); err == nil {
|
|
db = db.Where("status_code = ?", statusCode)
|
|
}
|
|
}
|
|
if keyIDStr := c.Query("key_id"); keyIDStr != "" {
|
|
if keyID, err := strconv.ParseUint(keyIDStr, 10, 64); err == nil {
|
|
db = db.Where("key_id = ?", keyID)
|
|
}
|
|
}
|
|
if groupIDStr := c.Query("group_id"); groupIDStr != "" {
|
|
if groupID, err := strconv.ParseUint(groupIDStr, 10, 64); err == nil {
|
|
db = db.Where("group_id = ?", groupID)
|
|
}
|
|
}
|
|
return db
|
|
}
|
|
}
|