Files
SingBox-Gopanel/internal/handler/admin_traffic_reset_api.go
CN-JS-HuiBai 981ee4f406
All checks were successful
build / build (api, amd64, linux) (push) Successful in -47s
build / build (api, arm64, linux) (push) Successful in -47s
build / build (api.exe, amd64, windows) (push) Successful in -48s
基本功能复刻完成
2026-04-17 12:24:00 +08:00

59 lines
1.5 KiB
Go

package handler
import (
"strings"
"xboard-go/internal/database"
"xboard-go/internal/model"
"github.com/gin-gonic/gin"
)
// AdminTrafficResetFetch returns logs of traffic resets.
func AdminTrafficResetFetch(c *gin.Context) {
page := parsePositiveInt(c.DefaultQuery("page", "1"), 1)
perPage := parsePositiveInt(c.DefaultQuery("per_page", "50"), 50)
keyword := strings.TrimSpace(c.Query("keyword"))
query := database.DB.Model(&model.TrafficResetLog{}).Preload("User").Order("id DESC")
if keyword != "" {
// Search by user email or ID
query = query.Joins("JOIN v2_user ON v2_user.id = v2_traffic_reset_logs.user_id").
Where("v2_user.email LIKE ? OR CAST(v2_traffic_reset_logs.user_id AS CHAR) = ?", "%"+keyword+"%", keyword)
}
var total int64
query.Count(&total)
var logs []model.TrafficResetLog
query.Offset((page - 1) * perPage).Limit(perPage).Find(&logs)
items := make([]gin.H, 0, len(logs))
for _, l := range logs {
email := ""
if l.User != nil {
email = l.User.Email
}
items = append(items, gin.H{
"id": l.ID,
"user_id": l.UserID,
"user_email": email,
"reset_type": l.ResetType,
"reset_time": l.ResetTime,
"old_total": l.OldTotal,
"new_total": l.NewTotal,
"trigger_source": l.TriggerSource,
"created_at": l.CreatedAt,
})
}
Success(c, gin.H{
"list": items,
"pagination": gin.H{
"current": page,
"last_page": calculateLastPage(total, perPage),
"per_page": perPage,
"total": total,
},
})
}