package handlers import ( "net/http" "strconv" "time" "github.com/gin-gonic/gin" "airwallex-admin/models" ) func ListCardLogs(c *gin.Context) { pageNum, _ := strconv.Atoi(c.DefaultQuery("page_num", "0")) pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20")) query := models.DB.Model(&models.CardLog{}) if v := c.Query("card_id"); v != "" { query = query.Where("card_id = ?", v) } if v := c.Query("action"); v != "" { query = query.Where("action = ?", v) } var total int64 query.Count(&total) var logs []models.CardLog query.Order("created_at DESC"). Offset(pageNum * pageSize). Limit(pageSize). Find(&logs) if logs == nil { logs = []models.CardLog{} } hasMore := int64((pageNum+1)*pageSize) < total c.JSON(http.StatusOK, gin.H{ "items": logs, "page_num": pageNum, "page_size": pageSize, "total": total, "has_more": hasMore, }) } func ListAuditLogs(c *gin.Context) { pageNum, _ := strconv.Atoi(c.DefaultQuery("page_num", "0")) pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20")) query := models.DB.Model(&models.AuditLog{}) if v := c.Query("action"); v != "" { query = query.Where("action = ?", v) } if v := c.Query("resource_type"); v != "" { query = query.Where("resource_type = ?", v) } if v := c.Query("from_date"); v != "" { if t, err := time.Parse("2006-01-02", v); err == nil { query = query.Where("created_at >= ?", t) } } if v := c.Query("to_date"); v != "" { if t, err := time.Parse("2006-01-02", v); err == nil { query = query.Where("created_at < ?", t.Add(24*time.Hour)) } } var total int64 query.Count(&total) var logs []models.AuditLog query.Order("created_at DESC"). Offset(pageNum * pageSize). Limit(pageSize). Find(&logs) if logs == nil { logs = []models.AuditLog{} } hasMore := int64((pageNum+1)*pageSize) < total c.JSON(http.StatusOK, gin.H{ "items": logs, "page_num": pageNum, "page_size": pageSize, "total": total, "has_more": hasMore, }) }