forked from grassrootseconomics/visedriver
Compare commits
No commits in common. "31d505d969e651ed7afa11aacdb85453d1310bb7" and "1eb0b1555244a46756dd9fae2d0f0f31746c7c81" have entirely different histories.
31d505d969
...
1eb0b15552
@ -1,7 +1,6 @@
|
|||||||
package config
|
package config
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"git.defalsify.org/vise.git/logging"
|
"git.defalsify.org/vise.git/logging"
|
||||||
@ -24,7 +23,6 @@ var (
|
|||||||
userDbConn string
|
userDbConn string
|
||||||
userDbConnMode storage.DbMode
|
userDbConnMode storage.DbMode
|
||||||
Languages []string
|
Languages []string
|
||||||
configManager *Config
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type Override struct {
|
type Override struct {
|
||||||
@ -136,17 +134,6 @@ func GetConns() (storage.Conns, error) {
|
|||||||
|
|
||||||
// LoadConfig initializes the configuration values after environment variables are loaded.
|
// LoadConfig initializes the configuration values after environment variables are loaded.
|
||||||
func LoadConfig() error {
|
func LoadConfig() error {
|
||||||
configManager = NewConfig(logg)
|
|
||||||
|
|
||||||
// Add configuration keys with validation
|
|
||||||
configManager.AddKey("HOST", "127.0.0.1", false, nil)
|
|
||||||
configManager.AddKey("PORT", "7123", false, func(v string) error {
|
|
||||||
_, err := strconv.Atoi(v)
|
|
||||||
return err
|
|
||||||
})
|
|
||||||
configManager.AddKey("DB_CONN", "", true, nil)
|
|
||||||
// ... add other keys ? or is enough :/ ...
|
|
||||||
|
|
||||||
err := setConn()
|
err := setConn()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -158,7 +145,5 @@ func LoadConfig() error {
|
|||||||
DefaultLanguage = defaultLanguage
|
DefaultLanguage = defaultLanguage
|
||||||
Languages = languages
|
Languages = languages
|
||||||
|
|
||||||
// Report configuration
|
|
||||||
configManager.Report("INFO")
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,63 +0,0 @@
|
|||||||
// +build configreport
|
|
||||||
|
|
||||||
package config
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
"git.defalsify.org/vise.git/logging"
|
|
||||||
)
|
|
||||||
|
|
||||||
// go test -tags configreport ./config/... ---> run with tag
|
|
||||||
func TestConfig(t *testing.T) {
|
|
||||||
logger := logging.NewVanilla().WithDomain("test")
|
|
||||||
cfg := NewConfig(logger)
|
|
||||||
|
|
||||||
t.Run("Default Values", func(t *testing.T) {
|
|
||||||
cfg.AddKey("TEST_KEY", "default", false, nil)
|
|
||||||
value, err := cfg.GetValue("TEST_KEY")
|
|
||||||
t.Logf("Got value: %q, error: %v", value, err)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("unexpected error: %v", err)
|
|
||||||
}
|
|
||||||
if value != "default" {
|
|
||||||
t.Errorf("expected 'default', got '%s'", value)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("Environment Override", func(t *testing.T) {
|
|
||||||
os.Setenv("TEST_ENV_KEY", "override")
|
|
||||||
defer os.Unsetenv("TEST_ENV_KEY")
|
|
||||||
|
|
||||||
cfg.AddKey("TEST_ENV_KEY", "default", false, nil)
|
|
||||||
value, err := cfg.GetValue("TEST_ENV_KEY")
|
|
||||||
t.Logf("Got value: %q, error: %v", value, err)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("unexpected error: %v", err)
|
|
||||||
}
|
|
||||||
if value != "override" {
|
|
||||||
t.Errorf("expected 'override', got '%s'", value)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
t.Run("Validation", func(t *testing.T) {
|
|
||||||
validator := func(v string) error {
|
|
||||||
if v != "valid" {
|
|
||||||
return fmt.Errorf("invalid value")
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
cfg.AddKey("VALIDATED_KEY", "valid", false, validator)
|
|
||||||
os.Setenv("VALIDATED_KEY", "invalid")
|
|
||||||
defer os.Unsetenv("VALIDATED_KEY")
|
|
||||||
|
|
||||||
value, err := cfg.GetValue("VALIDATED_KEY")
|
|
||||||
t.Logf("Got value: %q, error: %v", value, err)
|
|
||||||
if err == nil {
|
|
||||||
t.Error("expected validation error, got nil")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
@ -1,95 +0,0 @@
|
|||||||
//go:build configreport
|
|
||||||
|
|
||||||
package config
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"git.defalsify.org/vise.git/logging"
|
|
||||||
"git.grassecon.net/grassrootseconomics/visedriver/env"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ConfigValue represents a configuration key-value pair
|
|
||||||
type ConfigValue struct {
|
|
||||||
Key string
|
|
||||||
Default string
|
|
||||||
Validator func(string) error
|
|
||||||
Sensitive bool
|
|
||||||
}
|
|
||||||
|
|
||||||
// Config handles configuration management and reporting
|
|
||||||
type Config struct {
|
|
||||||
values map[string]ConfigValue
|
|
||||||
logger logging.Vanilla
|
|
||||||
}
|
|
||||||
|
|
||||||
func NewConfig(logger logging.Vanilla) *Config {
|
|
||||||
return &Config{
|
|
||||||
values: make(map[string]ConfigValue),
|
|
||||||
logger: logger,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// AddKey registers a new configuration key with optional validation
|
|
||||||
func (c *Config) AddKey(key string, defaultValue string, sensitive bool, validator func(string) error) {
|
|
||||||
c.values[key] = ConfigValue{
|
|
||||||
Key: key,
|
|
||||||
Default: defaultValue,
|
|
||||||
Validator: validator,
|
|
||||||
Sensitive: sensitive,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// GetValue returns the value for a given key, applying environment override if present
|
|
||||||
func (c *Config) GetValue(key string) (string, error) {
|
|
||||||
// Find config value by key
|
|
||||||
var cv ConfigValue
|
|
||||||
for _, v := range c.values {
|
|
||||||
if v.Key == key {
|
|
||||||
cv = v
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if cv.Key == "" {
|
|
||||||
return "", fmt.Errorf("configuration key not found: %s", key)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get value from environment or default
|
|
||||||
value := env.GetEnv(key, cv.Default)
|
|
||||||
|
|
||||||
// Validate if validator exists
|
|
||||||
if cv.Validator != nil && cv.Validator(value) != nil {
|
|
||||||
return "", fmt.Errorf("invalid value for key %s", key)
|
|
||||||
}
|
|
||||||
|
|
||||||
return value, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// Report outputs all configuration values at the specified log level
|
|
||||||
func (c *Config) Report(level string) {
|
|
||||||
for _, cv := range c.values {
|
|
||||||
value, err := c.GetValue(cv.Key)
|
|
||||||
if err != nil {
|
|
||||||
c.logger.Errorf("Error getting value for %s: %v", cv.Key, err)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if cv.Sensitive {
|
|
||||||
value = "****"
|
|
||||||
}
|
|
||||||
|
|
||||||
switch level {
|
|
||||||
case "DEBUG":
|
|
||||||
c.logger.Debugf("config set", cv.Key, value)
|
|
||||||
case "INFO":
|
|
||||||
c.logger.Infof("config set", cv.Key, value)
|
|
||||||
case "WARN":
|
|
||||||
c.logger.Warnf("config set", cv.Key, value)
|
|
||||||
case "ERROR":
|
|
||||||
c.logger.Errorf("config set", cv.Key, value)
|
|
||||||
default:
|
|
||||||
c.logger.Infof("config set", cv.Key, value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
//go:build !configreport
|
|
||||||
|
|
||||||
package config
|
|
||||||
|
|
||||||
import (
|
|
||||||
"git.defalsify.org/vise.git/logging"
|
|
||||||
)
|
|
||||||
|
|
||||||
type Config struct{}
|
|
||||||
|
|
||||||
func NewConfig(logger logging.Vanilla) *Config {
|
|
||||||
return &Config{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Config) AddKey(key string, defaultValue string, sensitive bool, validator func(string) error) {}
|
|
||||||
|
|
||||||
func (c *Config) GetValue(key string) (string, error) {
|
|
||||||
return "", nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *Config) Report(level string) {}
|
|
||||||
1
go.mod
1
go.mod
@ -19,7 +19,6 @@ require (
|
|||||||
github.com/mattn/kinako v0.0.0-20170717041458-332c0a7e205a // indirect
|
github.com/mattn/kinako v0.0.0-20170717041458-332c0a7e205a // indirect
|
||||||
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
||||||
github.com/stretchr/testify v1.9.0 // indirect
|
github.com/stretchr/testify v1.9.0 // indirect
|
||||||
github.com/uptrace/bunrouter v1.0.23 // indirect
|
|
||||||
github.com/x448/float16 v0.8.4 // indirect
|
github.com/x448/float16 v0.8.4 // indirect
|
||||||
golang.org/x/crypto v0.27.0 // indirect
|
golang.org/x/crypto v0.27.0 // indirect
|
||||||
golang.org/x/sync v0.8.0 // indirect
|
golang.org/x/sync v0.8.0 // indirect
|
||||||
|
|||||||
2
go.sum
2
go.sum
@ -33,8 +33,6 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
|
|||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
||||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
github.com/uptrace/bunrouter v1.0.23 h1:Bi7NKw3uCQkcA/GUCtDNPq5LE5UdR9pe+UyWbjHB/wU=
|
|
||||||
github.com/uptrace/bunrouter v1.0.23/go.mod h1:O3jAcl+5qgnF+ejhgkmbceEk0E/mqaK+ADOocdNpY8M=
|
|
||||||
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
|
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
|
||||||
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
|
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
|
||||||
golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
|
golang.org/x/crypto v0.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
|
||||||
|
|||||||
@ -7,7 +7,6 @@ import (
|
|||||||
"git.defalsify.org/vise.git/logging"
|
"git.defalsify.org/vise.git/logging"
|
||||||
"git.grassecon.net/grassrootseconomics/visedriver/errors"
|
"git.grassecon.net/grassrootseconomics/visedriver/errors"
|
||||||
"git.grassecon.net/grassrootseconomics/visedriver/request"
|
"git.grassecon.net/grassrootseconomics/visedriver/request"
|
||||||
"github.com/uptrace/bunrouter"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -17,7 +16,6 @@ var (
|
|||||||
// HTTPRequestHandler implements the session handler for HTTP
|
// HTTPRequestHandler implements the session handler for HTTP
|
||||||
type HTTPRequestHandler struct {
|
type HTTPRequestHandler struct {
|
||||||
request.RequestHandler
|
request.RequestHandler
|
||||||
router *bunrouter.Router
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *HTTPRequestHandler) WriteError(w http.ResponseWriter, code int, err error) {
|
func (f *HTTPRequestHandler) WriteError(w http.ResponseWriter, code int, err error) {
|
||||||
@ -32,25 +30,12 @@ func (f *HTTPRequestHandler) WriteError(w http.ResponseWriter, code int, err err
|
|||||||
}
|
}
|
||||||
|
|
||||||
func NewHTTPRequestHandler(h request.RequestHandler) *HTTPRequestHandler {
|
func NewHTTPRequestHandler(h request.RequestHandler) *HTTPRequestHandler {
|
||||||
handler := &HTTPRequestHandler{
|
return &HTTPRequestHandler{
|
||||||
RequestHandler: h,
|
RequestHandler: h,
|
||||||
router: bunrouter.New(),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Route all requests to existing vise logic
|
|
||||||
handler.router.GET("/*path", handler.handleViseRequest)
|
|
||||||
handler.router.POST("/*path", handler.handleViseRequest)
|
|
||||||
handler.router.PUT("/*path", handler.handleViseRequest)
|
|
||||||
handler.router.DELETE("/*path", handler.handleViseRequest)
|
|
||||||
|
|
||||||
return handler
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (hh *HTTPRequestHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
func (hh *HTTPRequestHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) {
|
||||||
hh.router.ServeHTTP(w, req)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (hh *HTTPRequestHandler) handleViseRequest(w http.ResponseWriter, req bunrouter.Request) error {
|
|
||||||
var code int
|
var code int
|
||||||
var err error
|
var err error
|
||||||
var perr error
|
var perr error
|
||||||
@ -62,18 +47,17 @@ func (hh *HTTPRequestHandler) handleViseRequest(w http.ResponseWriter, req bunro
|
|||||||
|
|
||||||
rp := hh.GetRequestParser()
|
rp := hh.GetRequestParser()
|
||||||
cfg := hh.GetConfig()
|
cfg := hh.GetConfig()
|
||||||
cfg.SessionId, err = rp.GetSessionId(req.Context(), req.Request)
|
cfg.SessionId, err = rp.GetSessionId(req.Context(), req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logg.ErrorCtxf(rqs.Ctx, "", "header processing error", err)
|
logg.ErrorCtxf(rqs.Ctx, "", "header processing error", err)
|
||||||
hh.WriteError(w, 400, err)
|
hh.WriteError(w, 400, err)
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
rqs.Config = cfg
|
rqs.Config = cfg
|
||||||
rqs.Input, err = rp.GetInput(req.Request)
|
rqs.Input, err = rp.GetInput(req)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logg.ErrorCtxf(rqs.Ctx, "", "header processing error", err)
|
logg.ErrorCtxf(rqs.Ctx, "", "header processing error", err)
|
||||||
hh.WriteError(w, 400, err)
|
hh.WriteError(w, 400, err)
|
||||||
return err
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
rqs, err = hh.Process(rqs)
|
rqs, err = hh.Process(rqs)
|
||||||
@ -90,7 +74,7 @@ func (hh *HTTPRequestHandler) handleViseRequest(w http.ResponseWriter, req bunro
|
|||||||
|
|
||||||
if code != 200 {
|
if code != 200 {
|
||||||
hh.WriteError(w, 500, err)
|
hh.WriteError(w, 500, err)
|
||||||
return err
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
w.WriteHeader(200)
|
w.WriteHeader(200)
|
||||||
@ -99,11 +83,10 @@ func (hh *HTTPRequestHandler) handleViseRequest(w http.ResponseWriter, req bunro
|
|||||||
rqs, perr = hh.Reset(rqs.Ctx, rqs)
|
rqs, perr = hh.Reset(rqs.Ctx, rqs)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
hh.WriteError(w, 500, err)
|
hh.WriteError(w, 500, err)
|
||||||
return err
|
return
|
||||||
}
|
}
|
||||||
if perr != nil {
|
if perr != nil {
|
||||||
hh.WriteError(w, 500, perr)
|
hh.WriteError(w, 500, perr)
|
||||||
return perr
|
return
|
||||||
}
|
}
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -99,7 +99,9 @@ func TestRequestHandler_ServeHTTP(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
sessionHandler := NewHTTPRequestHandler(mockRequestHandler)
|
sessionHandler := &HTTPRequestHandler{
|
||||||
|
RequestHandler: mockRequestHandler,
|
||||||
|
}
|
||||||
|
|
||||||
req := httptest.NewRequest(http.MethodPost, "/", bytes.NewBuffer(tt.input))
|
req := httptest.NewRequest(http.MethodPost, "/", bytes.NewBuffer(tt.input))
|
||||||
req.Header.Set("X-Vise-Session", tt.sessionID)
|
req.Header.Set("X-Vise-Session", tt.sessionID)
|
||||||
@ -117,7 +119,7 @@ func TestRequestHandler_ServeHTTP(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestRequestHandler_WriteError(t *testing.T) {
|
func TestRequestHandler_WriteError(t *testing.T) {
|
||||||
handler := NewHTTPRequestHandler(&httpmocks.MockRequestHandler{})
|
handler := &HTTPRequestHandler{}
|
||||||
mockWriter := &httpmocks.MockWriter{}
|
mockWriter := &httpmocks.MockWriter{}
|
||||||
err := errors.New("test error")
|
err := errors.New("test error")
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user