jinshan/internal/config/config.go
2025-06-19 10:35:26 +08:00

167 lines
4.5 KiB
Go

package config
import (
"fmt"
"gitlab.guxuan.icu/jinshan_community/pkg/encoding/json"
"gitlab.guxuan.icu/jinshan_community/pkg/logging"
)
type Config struct {
Logger logging.LoggerConfig
General General
Storage Storage
Middleware Middleware
Util Util
Dictionary Dictionary
FileConfig FileConfig
}
type FileConfig struct {
UploadDir string
StaticPrefix string
}
type General struct {
AppName string `default:"haibei"`
Version string `default:"v1.0.0"`
Debug bool
PprofAddr string
DisableSwagger bool
DisablePrintConfig bool
DefaultLoginPwd string `default:"6351623c8cef86fefabfa7da046fc619"` // MD5(abc-123)
WorkDir string // From command arguments
MenuFile string // From schema.Menus (JSON/YAML)
DenyOperateMenu bool
HTTP struct {
Addr string `default:":8040"`
ShutdownTimeout int `default:"10"` // seconds
ReadTimeout int `default:"60"` // seconds
WriteTimeout int `default:"60"` // seconds
IdleTimeout int `default:"10"` // seconds
CertFile string
KeyFile string
}
Root struct {
ID string `default:"root"`
Username string `default:"admin"`
Password string
Name string `default:"Admin"`
}
}
type Storage struct {
Cache struct {
Type string `default:"memory"` // memory/badger/redis
Delimiter string `default:":"` // delimiter for key
Memory struct {
CleanupInterval int `default:"60"` // seconds
}
Badger struct {
Path string `default:"data/cache"`
}
Redis struct {
Addr string
Username string
Password string
DB int
}
}
DB struct {
Debug bool
Type string `default:"sqlite3"` // sqlite3/mysql/postgres
DSN string `default:"data/haibei.db"` // database source name
MaxLifetime int `default:"86400"` // seconds
MaxIdleTime int `default:"3600"` // seconds
MaxOpenConns int `default:"100"` // connections
MaxIdleConns int `default:"50"` // connections
TablePrefix string `default:""`
AutoMigrate bool
PrepareStmt bool
Resolver []struct {
DBType string // sqlite3/mysql/postgres
Sources []string // DSN
Replicas []string // DSN
Tables []string
}
}
}
type Util struct {
Captcha struct {
Length int `default:"4"`
Width int `default:"400"`
Height int `default:"160"`
CacheType string `default:"memory"` // memory/redis
Redis struct {
Addr string
Username string
Password string
DB int
KeyPrefix string `default:"captcha:"`
}
}
Prometheus struct {
Enable bool
Port int `default:"9100"`
BasicUsername string `default:"admin"`
BasicPassword string `default:"admin"`
LogApis []string
LogMethods []string
DefaultCollect bool
}
}
type Dictionary struct {
UserCacheExp int `default:"4"` // hours
}
func (c *Config) IsDebug() bool {
return c.General.Debug
}
func (c *Config) String() string {
b, err := json.MarshalIndent(c, "", " ")
if err != nil {
panic("Failed to marshal config: " + err.Error())
}
return string(b)
}
func (c *Config) PreLoad() {
if addr := c.Storage.Cache.Redis.Addr; addr != "" {
username := c.Storage.Cache.Redis.Username
password := c.Storage.Cache.Redis.Password
if c.Util.Captcha.CacheType == "redis" &&
c.Util.Captcha.Redis.Addr == "" {
c.Util.Captcha.Redis.Addr = addr
c.Util.Captcha.Redis.Username = username
c.Util.Captcha.Redis.Password = password
}
if c.Middleware.RateLimiter.Store.Type == "redis" &&
c.Middleware.RateLimiter.Store.Redis.Addr == "" {
c.Middleware.RateLimiter.Store.Redis.Addr = addr
c.Middleware.RateLimiter.Store.Redis.Username = username
c.Middleware.RateLimiter.Store.Redis.Password = password
}
if c.Middleware.Auth.Store.Type == "redis" &&
c.Middleware.Auth.Store.Redis.Addr == "" {
c.Middleware.Auth.Store.Redis.Addr = addr
c.Middleware.Auth.Store.Redis.Username = username
c.Middleware.Auth.Store.Redis.Password = password
}
}
}
func (c *Config) Print() {
if c.General.DisablePrintConfig {
return
}
fmt.Println("// ----------------------- Load configurations start ------------------------")
fmt.Println(c.String())
fmt.Println("// ----------------------- Load configurations end --------------------------")
}
func (c *Config) FormatTableName(name string) string {
return c.Storage.DB.TablePrefix + name
}