94 lines
2.0 KiB
Go
94 lines
2.0 KiB
Go
package config
|
|
|
|
import (
|
|
"errors"
|
|
"log/slog"
|
|
"os"
|
|
"strconv"
|
|
|
|
customlogger "github.com/SamuelTariku/FortuneBet-Backend/internal/logger"
|
|
"github.com/joho/godotenv"
|
|
)
|
|
|
|
var (
|
|
ErrInvalidDbUrl = errors.New("db url is invalid")
|
|
ErrInvalidPort = errors.New("port number is invalid")
|
|
ErrRefreshExpiry = errors.New("refresh token expiry is invalid")
|
|
ErrAccessExpiry = errors.New("access token expiry is invalid")
|
|
ErrInvalidJwtKey = errors.New("jwt key is invalid")
|
|
ErrLogLevel = errors.New("log level not set")
|
|
ErrInvalidLevel = errors.New("invalid log level")
|
|
ErrInvalidEnv = errors.New("env not set or invalid")
|
|
)
|
|
|
|
type Config struct {
|
|
Port int
|
|
DbUrl string
|
|
RefreshExpiry int
|
|
AccessExpiry int
|
|
JwtKey string
|
|
LogLevel slog.Level
|
|
Env string
|
|
}
|
|
|
|
func NewConfig() (*Config, error) {
|
|
config := &Config{}
|
|
if err := config.loadEnv(); err != nil {
|
|
return nil, err
|
|
}
|
|
return config, nil
|
|
}
|
|
func (c *Config) loadEnv() error {
|
|
err := godotenv.Load()
|
|
if err != nil {
|
|
return errors.New("failed to load env file")
|
|
}
|
|
// env
|
|
env := os.Getenv("ENV")
|
|
if env == "" {
|
|
return ErrInvalidEnv
|
|
}
|
|
c.Env = env
|
|
portStr := os.Getenv("PORT")
|
|
port, err := strconv.Atoi(portStr)
|
|
if err != nil {
|
|
return ErrInvalidPort
|
|
}
|
|
c.Port = port
|
|
|
|
dbUrl := os.Getenv("DB_URL")
|
|
if dbUrl == "" {
|
|
return ErrInvalidDbUrl
|
|
}
|
|
c.DbUrl = dbUrl
|
|
refreshExpiryStr := os.Getenv("REFRESH_EXPIRY")
|
|
refreshExpiry, err := strconv.Atoi(refreshExpiryStr)
|
|
if err != nil {
|
|
return ErrRefreshExpiry
|
|
}
|
|
c.RefreshExpiry = refreshExpiry
|
|
jwtKey := os.Getenv("JWT_KEY")
|
|
if jwtKey == "" {
|
|
return ErrInvalidJwtKey
|
|
}
|
|
c.JwtKey = jwtKey
|
|
accessExpiryStr := os.Getenv("ACCESS_EXPIRY")
|
|
accessExpiry, err := strconv.Atoi(accessExpiryStr)
|
|
if err != nil {
|
|
return ErrAccessExpiry
|
|
}
|
|
c.AccessExpiry = accessExpiry
|
|
// log level
|
|
logLevel := os.Getenv("LOG_LEVEL")
|
|
if logLevel == "" {
|
|
return ErrLogLevel
|
|
}
|
|
|
|
lvl, ok := customlogger.LogLevels[logLevel]
|
|
if !ok {
|
|
return ErrInvalidLevel
|
|
}
|
|
c.LogLevel = lvl
|
|
return nil
|
|
}
|