Files
MonkeyCode/backend/internal/dashboard/handler/v1/dashboard.go
2025-07-17 16:45:27 +08:00

170 lines
5.0 KiB
Go

package v1
import (
"github.com/GoYoko/web"
"github.com/chaitin/MonkeyCode/backend/domain"
"github.com/chaitin/MonkeyCode/backend/internal/middleware"
)
type DashboardHandler struct {
usecase domain.DashboardUsecase
}
func NewDashboardHandler(
w *web.Web,
usecase domain.DashboardUsecase,
auth *middleware.AuthMiddleware,
active *middleware.ActiveMiddleware,
) *DashboardHandler {
h := &DashboardHandler{usecase: usecase}
g := w.Group("/api/v1/dashboard")
g.Use(auth.Auth(), active.Active("admin"))
g.GET("/statistics", web.BaseHandler(h.Statistics))
g.GET("/category-stat", web.BindHandler(h.CategoryStat))
g.GET("/time-stat", web.BindHandler(h.TimeStat))
g.GET("/user-stat", web.BindHandler(h.UserStat))
g.GET("/user-events", web.BaseHandler(h.UserEvents))
g.GET("/user-code-rank", web.BindHandler(h.UserCodeRank))
g.GET("/user-heatmap", web.BaseHandler(h.UserHeatmap))
return h
}
// Statistics 获取统计信息
//
// @Tags Dashboard
// @Summary 获取统计信息
// @Description 获取统计信息
// @ID statistics-dashboard
// @Accept json
// @Produce json
// @Success 200 {object} web.Resp{data=domain.Statistics}
// @Router /api/v1/dashboard/statistics [get]
func (h *DashboardHandler) Statistics(c *web.Context) error {
statistics, err := h.usecase.Statistics(c.Request().Context())
if err != nil {
return err
}
return c.Success(statistics)
}
// CategoryStat 获取分类统计信息
//
// @Tags Dashboard
// @Summary 获取分类统计信息
// @Description 获取分类统计信息
// @ID category-stat-dashboard
// @Accept json
// @Produce json
// @Param filter query domain.StatisticsFilter true "筛选参数"
// @Success 200 {object} web.Resp{data=domain.CategoryStat}
// @Router /api/v1/dashboard/category-stat [get]
func (h *DashboardHandler) CategoryStat(c *web.Context, req domain.StatisticsFilter) error {
categoryStat, err := h.usecase.CategoryStat(c.Request().Context(), req)
if err != nil {
return err
}
return c.Success(categoryStat)
}
// TimeStat 获取时间统计信息
//
// @Tags Dashboard
// @Summary 获取时间统计信息
// @Description 获取时间统计信息
// @ID time-stat-dashboard
// @Accept json
// @Produce json
// @Param filter query domain.StatisticsFilter true "筛选参数"
// @Success 200 {object} web.Resp{data=domain.TimeStat}
// @Router /api/v1/dashboard/time-stat [get]
func (h *DashboardHandler) TimeStat(c *web.Context, req domain.StatisticsFilter) error {
timeStat, err := h.usecase.TimeStat(c.Request().Context(), req)
if err != nil {
return err
}
return c.Success(timeStat)
}
// UserStat 获取用户统计信息
//
// @Tags Dashboard
// @Summary 获取用户统计信息
// @Description 获取用户统计信息
// @ID user-stat-dashboard
// @Accept json
// @Produce json
// @Param filter query domain.StatisticsFilter true "筛选参数"
// @Success 200 {object} web.Resp{data=domain.UserStat}
// @Router /api/v1/dashboard/user-stat [get]
func (h *DashboardHandler) UserStat(c *web.Context, req domain.StatisticsFilter) error {
userStat, err := h.usecase.UserStat(c.Request().Context(), req)
if err != nil {
return err
}
return c.Success(userStat)
}
// UserEvents 获取用户事件
//
// @Tags Dashboard
// @Summary 获取用户事件
// @Description 获取用户事件
// @ID user-events-dashboard
// @Accept json
// @Produce json
// @Param filter query domain.StatisticsFilter true "筛选参数"
// @Success 200 {object} web.Resp{data=[]domain.UserEvent}
// @Router /api/v1/dashboard/user-events [get]
func (h *DashboardHandler) UserEvents(c *web.Context) error {
userEvents, err := h.usecase.UserEvents(c.Request().Context(), domain.StatisticsFilter{
Precision: "day",
Duration: 90,
UserID: c.QueryParam("user_id"),
})
if err != nil {
return err
}
return c.Success(userEvents)
}
// UserCodeRank 用户贡献榜
//
// @Tags Dashboard
// @Summary 用户贡献榜
// @Description 用户贡献榜
// @ID user-code-rank-dashboard
// @Accept json
// @Produce json
// @Param filter query domain.StatisticsFilter true "筛选参数"
// @Success 200 {object} web.Resp{data=[]domain.UserCodeRank}
// @Router /api/v1/dashboard/user-code-rank [get]
func (h *DashboardHandler) UserCodeRank(c *web.Context, req domain.StatisticsFilter) error {
userCodeRank, err := h.usecase.UserCodeRank(c.Request().Context(), req)
if err != nil {
return err
}
return c.Success(userCodeRank)
}
// UserHeatmap 用户热力图
//
// @Tags Dashboard
// @Summary 用户热力图
// @Description 用户热力图
// @ID user-heatmap-dashboard
// @Accept json
// @Produce json
// @Param user_id query string true "用户ID"
// @Success 200 {object} web.Resp{data=domain.UserHeatmapResp}
// @Router /api/v1/dashboard/user-heatmap [get]
func (h *DashboardHandler) UserHeatmap(c *web.Context) error {
userHeatmap, err := h.usecase.UserHeatmap(c.Request().Context(), c.QueryParam("user_id"))
if err != nil {
return err
}
return c.Success(userHeatmap)
}