91ed4e196a
- Added support for tiered billing expressions in the billing system. - Introduced new types and functions for handling billing expressions, including caching and execution. - Updated existing billing logic to accommodate tiered billing scenarios. - Enhanced request handling to support incoming billing expression requests. - Added tests for tiered billing functionality to ensure correctness.
55 lines
1.3 KiB
Go
55 lines
1.3 KiB
Go
package helper
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/QuantumNous/new-api/common"
|
|
"github.com/QuantumNous/new-api/pkg/billingexpr"
|
|
relaycommon "github.com/QuantumNous/new-api/relay/common"
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
func ResolveIncomingBillingExprRequestInput(c *gin.Context, info *relaycommon.RelayInfo) (billingexpr.RequestInput, error) {
|
|
input := billingexpr.RequestInput{}
|
|
if info != nil {
|
|
input.Headers = cloneStringMap(info.RequestHeaders)
|
|
}
|
|
|
|
bodyBytes, err := readIncomingBillingExprBody(c)
|
|
if err != nil {
|
|
return billingexpr.RequestInput{}, err
|
|
}
|
|
input.Body = bodyBytes
|
|
return input, nil
|
|
}
|
|
|
|
func readIncomingBillingExprBody(c *gin.Context) ([]byte, error) {
|
|
if c == nil || c.Request == nil || !isJSONContentType(c.Request.Header.Get("Content-Type")) {
|
|
return nil, nil
|
|
}
|
|
storage, err := common.GetBodyStorage(c)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return storage.Bytes()
|
|
}
|
|
|
|
func isJSONContentType(contentType string) bool {
|
|
contentType = strings.ToLower(strings.TrimSpace(contentType))
|
|
return strings.HasPrefix(contentType, "application/json")
|
|
}
|
|
|
|
func cloneStringMap(src map[string]string) map[string]string {
|
|
if len(src) == 0 {
|
|
return map[string]string{}
|
|
}
|
|
dst := make(map[string]string, len(src))
|
|
for key, value := range src {
|
|
if strings.TrimSpace(key) == "" {
|
|
continue
|
|
}
|
|
dst[key] = value
|
|
}
|
|
return dst
|
|
}
|