jaecoo-be/config/config/index.config.go

178 lines
3.8 KiB
Go

package config
import (
"os"
"path/filepath"
"runtime"
"strings"
"time"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/compress"
"github.com/pelletier/go-toml/v2"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
type app = struct {
Name string `toml:"name"`
Host string `toml:"host"`
Domain string `toml:"domain"`
Port string `toml:"port"`
ExternalPort string `toml:"external-port"`
PrintRoutes bool `toml:"print-routes"`
Prefork bool `toml:"prefork"`
Production bool `toml:"production"`
IdleTimeout time.Duration `toml:"idle-timeout"`
BodyLimit int `toml:"body-limit"`
}
// db struct config
type db = struct {
Postgres struct {
DSN string `toml:"dsn"`
LogMode string `toml:"log-mode"`
Migrate bool `toml:"migrate"`
Seed bool `toml:"seed"`
}
}
// log struct config
type logger = struct {
TimeFormat string `toml:"time-format"`
Level zerolog.Level `toml:"level"`
Prettier bool `toml:"prettier"`
}
// middleware
type middleware = struct {
Compress struct {
Enable bool
Level compress.Level
}
Recover struct {
Enable bool
}
Monitor struct {
Enable bool
Path string
}
Pprof struct {
Enable bool
}
Cors struct {
Enable bool
}
Limiter struct {
Enable bool
Max int
Expiration time.Duration `toml:"expiration_seconds"`
}
Csrf struct {
Enable bool
CookieName string `toml:"cookie-name"`
CookieSameSite string `toml:"cookie-same-site"`
CookieSecure bool `toml:"cookie-secure"`
CookieSessionOnly bool `toml:"cookie-session-only"`
CookieHttpOnly bool `toml:"cookie-http-only"`
}
AuditTrails struct {
Enable bool
Retention int
}
}
// minio struct config
type objectStorage = struct {
MinioStorage struct {
Endpoint string `toml:"endpoint"`
AccessKeyID string `toml:"access-key-id"`
SecretAccessKey string `toml:"secret-access-key"`
UseSSL bool `toml:"use-ssl"`
BucketName string `toml:"bucket-name"`
Location string `toml:"location"`
}
}
type keycloak = struct {
Endpoint string `toml:"endpoint"`
Realm string `toml:"realm"`
ClientId string `toml:"client-id"`
ClientSecret string `toml:"client-secret"`
AdminUsername string `toml:"admin-username"`
AdminPassword string `toml:"admin-password"`
Group string `toml:"group"`
}
type smtp = struct {
Host string `toml:"host"`
Port int `toml:"port"`
Username string `toml:"username"`
Password string `toml:"password"`
FromAddress string `toml:"from-address"`
FromName string `toml:"from-name"`
}
type Config struct {
App app
DB db
Logger logger
Middleware middleware
ObjectStorage objectStorage
Keycloak keycloak
Smtp smtp
}
// NewConfig : initialize config
func NewConfig() *Config {
config, err := ParseConfig("config")
if err != nil && !fiber.IsChild() {
// panic if config is not found
log.Panic().Err(err).Msg("config not found")
}
return config
}
// ParseConfig : func to parse config
func ParseConfig(name string, debug ...bool) (*Config, error) {
var (
contents *Config
file []byte
err error
)
if len(debug) > 0 {
file, err = os.ReadFile(name)
} else {
_, b, _, _ := runtime.Caller(0)
// get base path
path := filepath.Dir(filepath.Dir(filepath.Dir(b)))
file, err = os.ReadFile(filepath.Join(path, "./config/toml/", name+".toml"))
}
if err != nil {
return &Config{}, err
}
err = toml.Unmarshal(file, &contents)
return contents, err
}
// ParseAddress : func to parse address
func ParseAddress(raw string) (host, port string) {
if i := strings.LastIndex(raw, ":"); i > 0 {
return raw[:i], raw[i+1:]
}
return raw, ""
}