62 lines
1.8 KiB
Go
62 lines
1.8 KiB
Go
package handler
|
|
|
|
import (
|
|
"net/http"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"gpt-load/internal/db"
|
|
"gpt-load/internal/models"
|
|
"gpt-load/internal/response"
|
|
)
|
|
|
|
// GetDashboardStats godoc
|
|
// @Summary Get dashboard statistics
|
|
// @Description Get statistics for the dashboard, including total requests, success rate, and group distribution.
|
|
// @Tags Dashboard
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Success 200 {object} models.DashboardStats
|
|
// @Router /api/dashboard/stats [get]
|
|
func GetDashboardStats(c *gin.Context) {
|
|
var totalRequests, successRequests int64
|
|
var groupStats []models.GroupRequestStat
|
|
|
|
// Get total requests
|
|
if err := db.DB.Model(&models.RequestLog{}).Count(&totalRequests).Error; err != nil {
|
|
response.Error(c, http.StatusInternalServerError, "Failed to get total requests")
|
|
return
|
|
}
|
|
|
|
// Get success requests (status code 2xx)
|
|
if err := db.DB.Model(&models.RequestLog{}).Where("status_code >= ? AND status_code < ?", 200, 300).Count(&successRequests).Error; err != nil {
|
|
response.Error(c, http.StatusInternalServerError, "Failed to get success requests")
|
|
return
|
|
}
|
|
|
|
// Calculate success rate
|
|
var successRate float64
|
|
if totalRequests > 0 {
|
|
successRate = float64(successRequests) / float64(totalRequests)
|
|
}
|
|
|
|
// Get group stats
|
|
err := db.DB.Table("request_logs").
|
|
Select("groups.name as group_name, count(request_logs.id) as request_count").
|
|
Joins("join groups on groups.id = request_logs.group_id").
|
|
Group("groups.name").
|
|
Order("request_count desc").
|
|
Scan(&groupStats).Error
|
|
if err != nil {
|
|
response.Error(c, http.StatusInternalServerError, "Failed to get group stats")
|
|
return
|
|
}
|
|
|
|
stats := models.DashboardStats{
|
|
TotalRequests: totalRequests,
|
|
SuccessRequests: successRequests,
|
|
SuccessRate: successRate,
|
|
GroupStats: groupStats,
|
|
}
|
|
|
|
response.Success(c, stats)
|
|
} |