Restructure project
This commit is contained in:
parent
e44e7caa11
commit
16b2f17301
46 changed files with 1744 additions and 1265 deletions
70
internal/env/env.go
vendored
Normal file
70
internal/env/env.go
vendored
Normal file
|
@ -0,0 +1,70 @@
|
|||
package env
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"os"
|
||||
|
||||
"github.com/caarlos0/env/v8"
|
||||
"github.com/containrrr/shoutrrr"
|
||||
"github.com/go-playground/validator/v10"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
TimeZone string `env:"TZ" envDefault:"Etc/UTC" validate:"timezone"`
|
||||
Port int `env:"PORT" envDefault:"8080" validate:"min=1024,max=49151"`
|
||||
LogLevel string `env:"LOG_LEVEL" envDefault:"info" validate:"oneof=debug info warn error panic fatal"`
|
||||
Version string `env:"APP_VERSION" envDefault:"v0.0.0"`
|
||||
SwaggerHost string `env:"SWAGGER_HOST" envDefault:"https://cafe.test"`
|
||||
DB_Host string `env:"DB_HOST"`
|
||||
DB_User string `env:"DB_USER"`
|
||||
DB_Password string `env:"DB_PASSWORD"`
|
||||
DB_Database string `env:"DB_DATABASE"`
|
||||
}
|
||||
|
||||
var errParse = errors.New("error parsing environment variables")
|
||||
|
||||
func Parse() (*Config, error) {
|
||||
cfg := &Config{}
|
||||
if err := env.Parse(cfg); err != nil {
|
||||
return cfg, err
|
||||
}
|
||||
if err := validateContent(cfg); err != nil {
|
||||
return cfg, err
|
||||
}
|
||||
setAllDefaultEnvs(cfg)
|
||||
return cfg, nil
|
||||
}
|
||||
|
||||
func newEnvValidator() *validator.Validate {
|
||||
validate := validator.New()
|
||||
validate.RegisterValidation(`shoutrrr`, func(fl validator.FieldLevel) bool {
|
||||
value := fl.Field().Interface().(string)
|
||||
_, err := shoutrrr.CreateSender(value)
|
||||
return err == nil
|
||||
})
|
||||
|
||||
return validate
|
||||
}
|
||||
|
||||
func validateContent(cfg *Config) error {
|
||||
validate := newEnvValidator()
|
||||
err := validate.Struct(cfg)
|
||||
if err != nil {
|
||||
if _, ok := err.(*validator.InvalidValidationError); ok {
|
||||
return err
|
||||
} else {
|
||||
for _, err := range err.(validator.ValidationErrors) {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return errParse
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func setAllDefaultEnvs(cfg *Config) {
|
||||
os.Setenv("TZ", cfg.TimeZone)
|
||||
os.Setenv("PORT", fmt.Sprintf("%d", cfg.Port))
|
||||
os.Setenv("LOG_LEVEL", cfg.LogLevel)
|
||||
}
|
56
internal/env/env_test.go
vendored
Normal file
56
internal/env/env_test.go
vendored
Normal file
|
@ -0,0 +1,56 @@
|
|||
package env
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestPortParser(t *testing.T) {
|
||||
key := "PORT"
|
||||
var err error
|
||||
defer func() {
|
||||
os.Unsetenv(key)
|
||||
}()
|
||||
|
||||
os.Setenv(key, "1024")
|
||||
_, err = Parse()
|
||||
assert.Equal(t, err, nil, "Parsing should pass")
|
||||
|
||||
os.Setenv(key, "-12")
|
||||
_, err = Parse()
|
||||
assert.Equal(t, err.Error(), "Key: 'Config.Port' Error:Field validation for 'Port' failed on the 'min' tag", "Validation should fail")
|
||||
|
||||
os.Setenv(key, "60000")
|
||||
_, err = Parse()
|
||||
assert.Equal(t, err.Error(), "Key: 'Config.Port' Error:Field validation for 'Port' failed on the 'max' tag", "Validation should fail")
|
||||
|
||||
os.Setenv(key, "abc")
|
||||
_, err = Parse()
|
||||
assert.Equal(t, err.Error(), "env: parse error on field \"Port\" of type \"int\": strconv.ParseInt: parsing \"abc\": invalid syntax", "Parsing should fail")
|
||||
}
|
||||
|
||||
func TestTimeZoneParser(t *testing.T) {
|
||||
key := "TZ"
|
||||
var err error
|
||||
defer func() {
|
||||
os.Unsetenv(key)
|
||||
}()
|
||||
|
||||
os.Setenv(key, "Europe/Berlin")
|
||||
_, err = Parse()
|
||||
assert.Equal(t, err, nil, "Parsing should pass")
|
||||
|
||||
os.Setenv(key, "Etc/UTC")
|
||||
_, err = Parse()
|
||||
assert.Equal(t, err, nil, "Parsing should pass")
|
||||
|
||||
os.Setenv(key, "abc")
|
||||
_, err = Parse()
|
||||
assert.Equal(t, err.Error(), "Key: 'Config.TimeZone' Error:Field validation for 'TimeZone' failed on the 'timezone' tag", "Validation should fail")
|
||||
|
||||
os.Setenv(key, "-1")
|
||||
_, err = Parse()
|
||||
assert.Equal(t, err.Error(), "Key: 'Config.TimeZone' Error:Field validation for 'TimeZone' failed on the 'timezone' tag", "Validation should fail")
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue