mirror of
https://github.com/NoFxAiOS/nofx.git
synced 2026-06-06 05:51:19 +08:00
126 lines
5.3 KiB
Go
126 lines
5.3 KiB
Go
package config
|
||
|
||
import (
|
||
"fmt"
|
||
"time"
|
||
)
|
||
|
||
// DatabaseInterface 定义了数据库实现需要提供的方法集合
|
||
type DatabaseInterface interface {
|
||
CreateUser(user *User) error
|
||
GetUserByEmail(email string) (*User, error)
|
||
GetUserByID(userID string) (*User, error)
|
||
GetAllUsers() ([]string, error)
|
||
UpdateUserOTPVerified(userID string, verified bool) error
|
||
GetAIModels(userID string) ([]*AIModelConfig, error)
|
||
UpdateAIModel(userID, id string, enabled bool, apiKey, customAPIURL, customModelName string) error
|
||
GetExchanges(userID string) ([]*ExchangeConfig, error)
|
||
UpdateExchange(userID, id string, enabled bool, apiKey, secretKey string, testnet bool, hyperliquidWalletAddr, asterUser, asterSigner, asterPrivateKey string) error
|
||
CreateAIModel(userID, id, name, provider string, enabled bool, apiKey, customAPIURL string) error
|
||
CreateExchange(userID, id, name, typ string, enabled bool, apiKey, secretKey string, testnet bool, hyperliquidWalletAddr, asterUser, asterSigner, asterPrivateKey string) error
|
||
CreateTrader(trader *TraderRecord) error
|
||
GetTraders(userID string) ([]*TraderRecord, error)
|
||
UpdateTraderStatus(userID, id string, isRunning bool) error
|
||
UpdateTrader(trader *TraderRecord) error
|
||
UpdateTraderInitialBalance(userID, id string, newBalance float64) error
|
||
UpdateTraderCustomPrompt(userID, id string, customPrompt string, overrideBase bool) error
|
||
DeleteTrader(userID, id string) error
|
||
GetTraderConfig(userID, traderID string) (*TraderRecord, *AIModelConfig, *ExchangeConfig, error)
|
||
GetSystemConfig(key string) (string, error)
|
||
SetSystemConfig(key, value string) error
|
||
CreateUserSignalSource(userID, coinPoolURL, oiTopURL string) error
|
||
GetUserSignalSource(userID string) (*UserSignalSource, error)
|
||
UpdateUserSignalSource(userID, coinPoolURL, oiTopURL string) error
|
||
GetCustomCoins() []string
|
||
LoadBetaCodesFromFile(filePath string) error
|
||
ValidateBetaCode(code string) (bool, error)
|
||
UseBetaCode(code, userEmail string) error
|
||
GetBetaCodeStats() (total, used int, err error)
|
||
Close() error
|
||
}
|
||
|
||
// User 用户配置
|
||
type User struct {
|
||
ID string `json:"id"`
|
||
Email string `json:"email"`
|
||
PasswordHash string `json:"-"` // 不返回到前端
|
||
OTPSecret string `json:"-"` // 不返回到前端
|
||
OTPVerified bool `json:"otp_verified"`
|
||
CreatedAt time.Time `json:"created_at"`
|
||
UpdatedAt time.Time `json:"updated_at"`
|
||
}
|
||
|
||
// AIModelConfig AI模型配置
|
||
type AIModelConfig struct {
|
||
ID string `json:"id"`
|
||
UserID string `json:"user_id"`
|
||
Name string `json:"name"`
|
||
Provider string `json:"provider"`
|
||
Enabled bool `json:"enabled"`
|
||
APIKey string `json:"apiKey"`
|
||
CustomAPIURL string `json:"customApiUrl"`
|
||
CustomModelName string `json:"customModelName"`
|
||
CreatedAt time.Time `json:"created_at"`
|
||
UpdatedAt time.Time `json:"updated_at"`
|
||
}
|
||
|
||
// ExchangeConfig 交易所配置
|
||
type ExchangeConfig struct {
|
||
ID string `json:"id"`
|
||
UserID string `json:"user_id"`
|
||
Name string `json:"name"`
|
||
Type string `json:"type"`
|
||
Enabled bool `json:"enabled"`
|
||
APIKey string `json:"apiKey"`
|
||
SecretKey string `json:"secretKey"`
|
||
Testnet bool `json:"testnet"`
|
||
HyperliquidWalletAddr string `json:"hyperliquidWalletAddr"`
|
||
AsterUser string `json:"asterUser"`
|
||
AsterSigner string `json:"asterSigner"`
|
||
AsterPrivateKey string `json:"asterPrivateKey"`
|
||
CreatedAt time.Time `json:"created_at"`
|
||
UpdatedAt time.Time `json:"updated_at"`
|
||
}
|
||
|
||
// TraderRecord 交易员配置(数据库实体)
|
||
type TraderRecord struct {
|
||
ID string `json:"id"`
|
||
UserID string `json:"user_id"`
|
||
Name string `json:"name"`
|
||
AIModelID string `json:"ai_model_id"`
|
||
ExchangeID string `json:"exchange_id"`
|
||
InitialBalance float64 `json:"initial_balance"`
|
||
ScanIntervalMinutes int `json:"scan_interval_minutes"`
|
||
IsRunning bool `json:"is_running"`
|
||
BTCETHLeverage int `json:"btc_eth_leverage"`
|
||
AltcoinLeverage int `json:"altcoin_leverage"`
|
||
TradingSymbols string `json:"trading_symbols"`
|
||
UseCoinPool bool `json:"use_coin_pool"`
|
||
UseOITop bool `json:"use_oi_top"`
|
||
CustomPrompt string `json:"custom_prompt"`
|
||
OverrideBasePrompt bool `json:"override_base_prompt"`
|
||
SystemPromptTemplate string `json:"system_prompt_template"`
|
||
IsCrossMargin bool `json:"is_cross_margin"`
|
||
CreatedAt time.Time `json:"created_at"`
|
||
UpdatedAt time.Time `json:"updated_at"`
|
||
}
|
||
|
||
// UserSignalSource 用户信号源配置
|
||
type UserSignalSource struct {
|
||
ID int `json:"id"`
|
||
UserID string `json:"user_id"`
|
||
CoinPoolURL string `json:"coin_pool_url"`
|
||
OITopURL string `json:"oi_top_url"`
|
||
CreatedAt time.Time `json:"created_at"`
|
||
UpdatedAt time.Time `json:"updated_at"`
|
||
}
|
||
|
||
// NewDatabase 创建数据库连接(仅支持 PostgreSQL)
|
||
func NewDatabase() (DatabaseInterface, error) {
|
||
pgDB, err := NewPostgreSQLDatabase()
|
||
if err != nil {
|
||
return nil, fmt.Errorf("创建PostgreSQL数据库失败: %w", err)
|
||
}
|
||
return pgDB, nil
|
||
}
|