178 lines
3.8 KiB
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, ""
|
|
}
|