mirror of
https://github.com/QuantumNous/new-api.git
synced 2026-03-30 16:26:03 +00:00
* wip ionet integrate * wip ionet integrate * wip ionet integrate * ollama wip * wip * feat: ionet integration & ollama manage * fix merge conflict * wip * fix: test conn cors * wip * fix ionet * fix ionet * wip * fix model select * refactor: Remove `pkg/ionet` test files and update related Go source and web UI model deployment components. * feat: Enhance model deployment UI with styling improvements, updated text, and a new description component. * Revert "feat: Enhance model deployment UI with styling improvements, updated text, and a new description component." This reverts commit 8b75cb5bf0d1a534b339df8c033be9a6c7df7964.
97 lines
2.1 KiB
Go
97 lines
2.1 KiB
Go
package ionet
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/samber/lo"
|
|
)
|
|
|
|
// decodeWithFlexibleTimes unmarshals API responses while tolerating timestamp strings
|
|
// that omit timezone information by normalizing them to RFC3339Nano.
|
|
func decodeWithFlexibleTimes(data []byte, target interface{}) error {
|
|
var intermediate interface{}
|
|
if err := json.Unmarshal(data, &intermediate); err != nil {
|
|
return err
|
|
}
|
|
|
|
normalized := normalizeTimeValues(intermediate)
|
|
reencoded, err := json.Marshal(normalized)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return json.Unmarshal(reencoded, target)
|
|
}
|
|
|
|
func decodeData[T any](data []byte, target *T) error {
|
|
var wrapper struct {
|
|
Data T `json:"data"`
|
|
}
|
|
if err := json.Unmarshal(data, &wrapper); err != nil {
|
|
return err
|
|
}
|
|
*target = wrapper.Data
|
|
return nil
|
|
}
|
|
|
|
func decodeDataWithFlexibleTimes[T any](data []byte, target *T) error {
|
|
var wrapper struct {
|
|
Data T `json:"data"`
|
|
}
|
|
if err := decodeWithFlexibleTimes(data, &wrapper); err != nil {
|
|
return err
|
|
}
|
|
*target = wrapper.Data
|
|
return nil
|
|
}
|
|
|
|
func normalizeTimeValues(value interface{}) interface{} {
|
|
switch v := value.(type) {
|
|
case map[string]interface{}:
|
|
return lo.MapValues(v, func(val interface{}, _ string) interface{} {
|
|
return normalizeTimeValues(val)
|
|
})
|
|
case []interface{}:
|
|
return lo.Map(v, func(item interface{}, _ int) interface{} {
|
|
return normalizeTimeValues(item)
|
|
})
|
|
case string:
|
|
if normalized, changed := normalizeTimeString(v); changed {
|
|
return normalized
|
|
}
|
|
return v
|
|
default:
|
|
return value
|
|
}
|
|
}
|
|
|
|
func normalizeTimeString(input string) (string, bool) {
|
|
trimmed := strings.TrimSpace(input)
|
|
if trimmed == "" {
|
|
return input, false
|
|
}
|
|
|
|
if _, err := time.Parse(time.RFC3339Nano, trimmed); err == nil {
|
|
return trimmed, trimmed != input
|
|
}
|
|
if _, err := time.Parse(time.RFC3339, trimmed); err == nil {
|
|
return trimmed, trimmed != input
|
|
}
|
|
|
|
layouts := []string{
|
|
"2006-01-02T15:04:05.999999999",
|
|
"2006-01-02T15:04:05.999999",
|
|
"2006-01-02T15:04:05",
|
|
}
|
|
|
|
for _, layout := range layouts {
|
|
if parsed, err := time.Parse(layout, trimmed); err == nil {
|
|
return parsed.UTC().Format(time.RFC3339Nano), true
|
|
}
|
|
}
|
|
|
|
return input, false
|
|
}
|