Files
Mycontent/soul-api/internal/handler/admin_chapter_click_stats.go
2026-04-13 14:32:32 +08:00

58 lines
1.4 KiB
Go

package handler
import (
"net/http"
"soul-api/internal/database"
"github.com/gin-gonic/gin"
)
// AdminChapterClickStats GET /api/admin/chapters/:id/click-stats
// 聚合 user_tracks 表,返回指定章节的点击用户列表(昵称、次数、最近时间)
func AdminChapterClickStats(c *gin.Context) {
chapterID := c.Param("id")
if chapterID == "" {
c.JSON(http.StatusOK, gin.H{"success": false, "error": "missing chapter id"})
return
}
db := database.DB()
type clickUser struct {
UserID string `json:"userId"`
Nickname string `json:"nickname"`
Avatar string `json:"avatar"`
Count int `json:"count"`
LastClick string `json:"lastClick"`
}
var results []clickUser
err := db.Raw(`
SELECT ut.user_id, COALESCE(u.nickname,'') AS nickname, COALESCE(u.avatar,'') AS avatar,
COUNT(*) AS count, MAX(ut.created_at) AS last_click
FROM user_tracks ut
LEFT JOIN users u ON ut.user_id = u.id
WHERE ut.chapter_id = ? AND ut.action = 'view_chapter'
GROUP BY ut.user_id, u.nickname, u.avatar
ORDER BY count DESC
LIMIT 200
`, chapterID).Scan(&results).Error
if err != nil {
c.JSON(http.StatusOK, gin.H{"success": false, "error": err.Error()})
return
}
totalClicks := 0
for _, r := range results {
totalClicks += r.Count
}
c.JSON(http.StatusOK, gin.H{
"success": true,
"totalClicks": totalClicks,
"users": results,
})
}