2021-12-03 03:11:01 -08:00
|
|
|
package config
|
|
|
|
|
|
|
|
import (
|
2021-12-14 17:14:11 -08:00
|
|
|
"os"
|
2021-12-03 03:11:01 -08:00
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/joeshaw/envdecode"
|
|
|
|
)
|
|
|
|
|
2021-12-10 05:49:15 -08:00
|
|
|
const (
|
2021-12-14 08:30:31 -08:00
|
|
|
TemplateDir = "templates"
|
2021-12-10 05:49:15 -08:00
|
|
|
TemplateExt = ".gohtml"
|
|
|
|
StaticDir = "static"
|
|
|
|
StaticPrefix = "files"
|
|
|
|
)
|
|
|
|
|
2021-12-14 17:17:09 -08:00
|
|
|
type Environment string
|
2021-12-03 03:11:01 -08:00
|
|
|
|
|
|
|
const (
|
2021-12-14 17:17:09 -08:00
|
|
|
EnvLocal Environment = "local"
|
|
|
|
EnvTest Environment = "test"
|
|
|
|
EnvDevelop Environment = "dev"
|
|
|
|
EnvStaging Environment = "staging"
|
|
|
|
EnvQA Environment = "qa"
|
|
|
|
EnvProduction Environment = "prod"
|
2021-12-03 03:11:01 -08:00
|
|
|
)
|
|
|
|
|
2021-12-11 16:32:34 -08:00
|
|
|
type (
|
|
|
|
// Config stores complete application configuration
|
|
|
|
Config struct {
|
|
|
|
HTTP HTTPConfig
|
|
|
|
App AppConfig
|
|
|
|
Cache CacheConfig
|
|
|
|
Database DatabaseConfig
|
2021-12-14 08:29:45 -08:00
|
|
|
Mail MailConfig
|
2021-12-11 16:32:34 -08:00
|
|
|
}
|
2021-12-03 03:11:01 -08:00
|
|
|
|
2021-12-11 16:32:34 -08:00
|
|
|
// HTTPConfig stores HTTP configuration
|
|
|
|
HTTPConfig struct {
|
|
|
|
Hostname string `env:"HTTP_HOSTNAME"`
|
|
|
|
Port uint16 `env:"HTTP_PORT,default=8000"`
|
|
|
|
ReadTimeout time.Duration `env:"HTTP_READ_TIMEOUT,default=5s"`
|
|
|
|
WriteTimeout time.Duration `env:"HTTP_WRITE_TIMEOUT,default=10s"`
|
|
|
|
IdleTimeout time.Duration `env:"HTTP_IDLE_TIMEOUT,default=2m"`
|
|
|
|
}
|
2021-12-03 03:11:01 -08:00
|
|
|
|
2021-12-11 16:32:34 -08:00
|
|
|
// AppConfig stores application configuration
|
|
|
|
AppConfig struct {
|
2021-12-17 16:58:44 -08:00
|
|
|
Name string `env:"APP_NAME,default=Goweb"`
|
|
|
|
Environment Environment `env:"APP_ENVIRONMENT,default=local"`
|
|
|
|
EncryptionKey string `env:"APP_ENCRYPTION_KEY,default=?E(G+KbPeShVmYq3t6w9z$C&F)J@McQf"`
|
|
|
|
Timeout time.Duration `env:"APP_TIMEOUT,default=20s"`
|
|
|
|
PasswordToken struct {
|
|
|
|
Expiration time.Duration `env:"APP_PASSWORD_TOKEN_EXPIRATION,default=60m"`
|
|
|
|
Length int `env:"APP_PASSWORD_TOKEN_LENGTH,default=64"`
|
|
|
|
}
|
2021-12-11 16:32:34 -08:00
|
|
|
}
|
2021-12-03 03:11:01 -08:00
|
|
|
|
2021-12-11 16:32:34 -08:00
|
|
|
CacheConfig struct {
|
|
|
|
Hostname string `env:"CACHE_HOSTNAME,default=localhost"`
|
|
|
|
Port uint16 `env:"CACHE_PORT,default=6379"`
|
|
|
|
Password string `env:"CACHE_PASSWORD"`
|
|
|
|
Expiration struct {
|
|
|
|
StaticFile time.Duration `env:"CACHE_EXPIRATION_STATIC_FILE,default=4380h"`
|
|
|
|
Page time.Duration `env:"CACHE_EXPIRATION_PAGE,default=24h"`
|
|
|
|
}
|
2021-12-05 18:56:57 -08:00
|
|
|
}
|
2021-12-05 17:56:38 -08:00
|
|
|
|
2021-12-11 16:32:34 -08:00
|
|
|
DatabaseConfig struct {
|
2021-12-13 09:51:00 -08:00
|
|
|
Hostname string `env:"DB_HOSTNAME,default=localhost"`
|
|
|
|
Port uint16 `env:"DB_PORT,default=5432"`
|
|
|
|
User string `env:"DB_USER,default=admin"`
|
|
|
|
Password string `env:"DB_PASSWORD,default=admin"`
|
|
|
|
Database string `env:"DB_NAME,default=app"`
|
|
|
|
TestDatabase string `env:"DB_NAME_TEST,default=app_test"`
|
2021-12-11 16:32:34 -08:00
|
|
|
}
|
2021-12-14 08:29:45 -08:00
|
|
|
|
|
|
|
MailConfig struct {
|
|
|
|
Hostname string `env:"MAIL_HOSTNAME,default=localhost"`
|
|
|
|
Port uint16 `env:"MAIL_PORT,default=25"`
|
|
|
|
User string `env:"MAIL_USER,default=admin"`
|
|
|
|
Password string `env:"MAIL_PASSWORD,default=admin"`
|
|
|
|
FromAddress string `env:"MAIL_FROM_ADDRESS,default=admin@localhost"`
|
|
|
|
}
|
2021-12-11 16:32:34 -08:00
|
|
|
)
|
2021-12-10 05:49:15 -08:00
|
|
|
|
2021-12-03 03:11:01 -08:00
|
|
|
// GetConfig loads and returns application configuration
|
|
|
|
func GetConfig() (Config, error) {
|
|
|
|
var cfg Config
|
|
|
|
err := envdecode.StrictDecode(&cfg)
|
|
|
|
return cfg, err
|
|
|
|
}
|
2021-12-14 17:14:11 -08:00
|
|
|
|
2021-12-14 17:17:09 -08:00
|
|
|
func SwitchEnvironment(env Environment) {
|
|
|
|
if err := os.Setenv("APP_ENVIRONMENT", string(env)); err != nil {
|
2021-12-14 17:14:11 -08:00
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
}
|