mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-08-10 16:53:35 +08:00
- 支持 Nacos 连接测试及多命名空间资源树 - 提供配置搜索、发布、删除、历史回滚和变更监听 - 增加 Beta 发布、配置导入导出与批量操作 - 支持服务发现、实例管理、只读保护和多语言界面 - 补充 Wails 接口绑定及前后端回归测试 Refs #756
94 lines
2.6 KiB
Go
94 lines
2.6 KiB
Go
package nacos
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
TransferFileFormat = "gonavi.nacos.configs"
|
|
TransferFileVersion = 1
|
|
)
|
|
|
|
// NewTransferFile builds an export payload shell.
|
|
func NewTransferFile(namespaceID, namespaceName string) TransferFile {
|
|
return TransferFile{
|
|
Format: TransferFileFormat,
|
|
Version: TransferFileVersion,
|
|
ExportedAt: time.Now().UTC().Format(time.RFC3339),
|
|
NamespaceID: normalizeNamespaceID(namespaceID),
|
|
NamespaceName: strings.TrimSpace(namespaceName),
|
|
SourceAppName: "GoNavi",
|
|
Configs: []TransferConfigEntry{},
|
|
}
|
|
}
|
|
|
|
// ValidateTransferFile checks import payload structure.
|
|
func ValidateTransferFile(payload TransferFile) error {
|
|
if strings.TrimSpace(payload.Format) != TransferFileFormat {
|
|
return localizedNacosBackendError("nacos.backend.error.import_format_invalid", map[string]any{
|
|
"format": payload.Format,
|
|
})
|
|
}
|
|
if payload.Version <= 0 || payload.Version > TransferFileVersion {
|
|
return localizedNacosBackendError("nacos.backend.error.import_version_invalid", map[string]any{
|
|
"version": payload.Version,
|
|
})
|
|
}
|
|
if len(payload.Configs) == 0 {
|
|
return localizedNacosBackendError("nacos.backend.error.import_empty", nil)
|
|
}
|
|
for i, item := range payload.Configs {
|
|
if strings.TrimSpace(item.DataID) == "" {
|
|
return localizedNacosBackendError("nacos.backend.error.import_item_invalid", map[string]any{
|
|
"index": i,
|
|
})
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// ReadTransferFile loads a transfer JSON file from disk.
|
|
func ReadTransferFile(path string) (TransferFile, error) {
|
|
raw, err := os.ReadFile(path)
|
|
if err != nil {
|
|
return TransferFile{}, err
|
|
}
|
|
var payload TransferFile
|
|
if err := json.Unmarshal(raw, &payload); err != nil {
|
|
return TransferFile{}, err
|
|
}
|
|
if err := ValidateTransferFile(payload); err != nil {
|
|
return TransferFile{}, err
|
|
}
|
|
// normalize groups
|
|
for i := range payload.Configs {
|
|
if strings.TrimSpace(payload.Configs[i].Group) == "" {
|
|
payload.Configs[i].Group = "DEFAULT_GROUP"
|
|
}
|
|
payload.Configs[i].DataID = strings.TrimSpace(payload.Configs[i].DataID)
|
|
payload.Configs[i].Group = strings.TrimSpace(payload.Configs[i].Group)
|
|
}
|
|
return payload, nil
|
|
}
|
|
|
|
// WriteTransferFile writes payload as pretty JSON.
|
|
func WriteTransferFile(path string, payload TransferFile) error {
|
|
if strings.TrimSpace(payload.Format) == "" {
|
|
payload.Format = TransferFileFormat
|
|
}
|
|
if payload.Version <= 0 {
|
|
payload.Version = TransferFileVersion
|
|
}
|
|
if strings.TrimSpace(payload.ExportedAt) == "" {
|
|
payload.ExportedAt = time.Now().UTC().Format(time.RFC3339)
|
|
}
|
|
content, err := json.MarshalIndent(payload, "", " ")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return os.WriteFile(path, content, 0o644)
|
|
}
|