59 lines
1.5 KiB
Go
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,
|
|
},
|
|
})
|
|
}
|