da6c599efd
- Renamed handler and test methods for better clarity on functionality. - Updated route from `/v0/management/usage` to `/v0/management/usage-queue`. - Adjusted integration and unit tests to reflect new naming and routes.
56 lines
1.2 KiB
Go
56 lines
1.2 KiB
Go
package management
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"net/http"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/router-for-me/CLIProxyAPI/v6/internal/redisqueue"
|
|
)
|
|
|
|
type usageQueueRecord []byte
|
|
|
|
func (r usageQueueRecord) MarshalJSON() ([]byte, error) {
|
|
if json.Valid(r) {
|
|
return append([]byte(nil), r...), nil
|
|
}
|
|
return json.Marshal(string(r))
|
|
}
|
|
|
|
// GetUsageQueue pops queued usage records from the usage queue.
|
|
func (h *Handler) GetUsageQueue(c *gin.Context) {
|
|
if h == nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": "handler unavailable"})
|
|
return
|
|
}
|
|
|
|
count, errCount := parseUsageQueueCount(c.Query("count"))
|
|
if errCount != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": errCount.Error()})
|
|
return
|
|
}
|
|
|
|
items := redisqueue.PopOldest(count)
|
|
records := make([]usageQueueRecord, 0, len(items))
|
|
for _, item := range items {
|
|
records = append(records, usageQueueRecord(append([]byte(nil), item...)))
|
|
}
|
|
|
|
c.JSON(http.StatusOK, records)
|
|
}
|
|
|
|
func parseUsageQueueCount(value string) (int, error) {
|
|
value = strings.TrimSpace(value)
|
|
if value == "" {
|
|
return 1, nil
|
|
}
|
|
count, errCount := strconv.Atoi(value)
|
|
if errCount != nil || count <= 0 {
|
|
return 0, errors.New("count must be a positive integer")
|
|
}
|
|
return count, nil
|
|
}
|