mirror of
https://github.com/router-for-me/CLIProxyAPI.git
synced 2026-02-03 04:50:52 +08:00
80 lines
2.2 KiB
Go
80 lines
2.2 KiB
Go
package management
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/router-for-me/CLIProxyAPI/v6/internal/usage"
|
|
)
|
|
|
|
type usageExportPayload struct {
|
|
Version int `json:"version"`
|
|
ExportedAt time.Time `json:"exported_at"`
|
|
Usage usage.StatisticsSnapshot `json:"usage"`
|
|
}
|
|
|
|
type usageImportPayload struct {
|
|
Version int `json:"version"`
|
|
Usage usage.StatisticsSnapshot `json:"usage"`
|
|
}
|
|
|
|
// GetUsageStatistics returns the in-memory request statistics snapshot.
|
|
func (h *Handler) GetUsageStatistics(c *gin.Context) {
|
|
var snapshot usage.StatisticsSnapshot
|
|
if h != nil && h.usageStats != nil {
|
|
snapshot = h.usageStats.Snapshot()
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"usage": snapshot,
|
|
"failed_requests": snapshot.FailureCount,
|
|
})
|
|
}
|
|
|
|
// ExportUsageStatistics returns a complete usage snapshot for backup/migration.
|
|
func (h *Handler) ExportUsageStatistics(c *gin.Context) {
|
|
var snapshot usage.StatisticsSnapshot
|
|
if h != nil && h.usageStats != nil {
|
|
snapshot = h.usageStats.Snapshot()
|
|
}
|
|
c.JSON(http.StatusOK, usageExportPayload{
|
|
Version: 1,
|
|
ExportedAt: time.Now().UTC(),
|
|
Usage: snapshot,
|
|
})
|
|
}
|
|
|
|
// ImportUsageStatistics merges a previously exported usage snapshot into memory.
|
|
func (h *Handler) ImportUsageStatistics(c *gin.Context) {
|
|
if h == nil || h.usageStats == nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "usage statistics unavailable"})
|
|
return
|
|
}
|
|
|
|
data, err := c.GetRawData()
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "failed to read request body"})
|
|
return
|
|
}
|
|
|
|
var payload usageImportPayload
|
|
if err := json.Unmarshal(data, &payload); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid json"})
|
|
return
|
|
}
|
|
if payload.Version != 0 && payload.Version != 1 {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": "unsupported version"})
|
|
return
|
|
}
|
|
|
|
result := h.usageStats.MergeSnapshot(payload.Usage)
|
|
snapshot := h.usageStats.Snapshot()
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"added": result.Added,
|
|
"skipped": result.Skipped,
|
|
"total_requests": snapshot.TotalRequests,
|
|
"failed_requests": snapshot.FailureCount,
|
|
})
|
|
}
|