From bc0bd533a1d48aa9ab08a994a67372f2f82970ff Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Sun, 30 Nov 2025 15:14:57 +0100 Subject: [PATCH 1/2] restructure and move --- internals/config/loader.go | 22 +++++------- internals/config/parser.go | 5 +-- internals/config/structure/structure.go | 45 +++++++++++++++--------- internals/config/tokens.go | 27 ++++++-------- internals/proxy/middlewares/auth.go | 8 ++++- internals/proxy/middlewares/common.go | 20 +++++------ internals/proxy/middlewares/endpoints.go | 8 ++--- internals/proxy/middlewares/mapping.go | 13 +++---- internals/proxy/middlewares/message.go | 10 +++--- internals/proxy/middlewares/policy.go | 6 ++-- internals/proxy/middlewares/template.go | 6 ++-- 11 files changed, 89 insertions(+), 81 deletions(-) diff --git a/internals/config/loader.go b/internals/config/loader.go index a5340209..ebded9b1 100644 --- a/internals/config/loader.go +++ b/internals/config/loader.go @@ -4,7 +4,6 @@ import ( "errors" "io/fs" "os" - "strconv" "strings" "github.com/codeshelldev/secured-signal-api/internals/config/structure" @@ -19,11 +18,12 @@ var ENV *structure.ENV = &structure.ENV{ DEFAULTS_PATH: os.Getenv("DEFAULTS_PATH"), TOKENS_DIR: os.Getenv("TOKENS_DIR"), FAVICON_PATH: os.Getenv("FAVICON_PATH"), - API_TOKENS: []string{}, - SETTINGS: map[string]*structure.SETTINGS{}, + CONFIGS: map[string]*structure.CONFIG{}, INSECURE: false, } +var DEFAULT *structure.CONFIG + var defaultsConf *configutils.Config var userConf *configutils.Config var tokenConf *configutils.Config @@ -85,7 +85,7 @@ func LowercaseKeys(config *configutils.Config) { } func NormalizeConfig(config *configutils.Config) { - Normalize(config, "settings", &structure.SETTINGS{}) + Normalize(config, "", &structure.CONFIG{}) } func Normalize(config *configutils.Config, path string, structure any) { @@ -125,17 +125,13 @@ func InitReload() { } func InitEnv() { - ENV.PORT = strconv.Itoa(mainConf.Layer.Int("service.port")) - - ENV.LOG_LEVEL = strings.ToLower(mainConf.Layer.String("loglevel")) + var config structure.CONFIG - ENV.API_URL = mainConf.Layer.String("api.url") + mainConf.Layer.Unmarshal("", &config) - var settings structure.SETTINGS + ENV.CONFIGS["*"] = &config - mainConf.Layer.Unmarshal("settings", &settings) - - ENV.SETTINGS["*"] = &settings + DEFAULT = ENV.CONFIGS["*"] } func LoadDefaults() { @@ -160,4 +156,4 @@ func LoadConfig() { log.Error("Could not Load Config ", ENV.CONFIG_PATH, ": ", err.Error()) } -} +} \ No newline at end of file diff --git a/internals/config/parser.go b/internals/config/parser.go index 96acd486..0222cdde 100644 --- a/internals/config/parser.go +++ b/internals/config/parser.go @@ -5,12 +5,13 @@ import ( ) var transformFuncs = map[string]func(string, any) (string, any) { - "default": defaultTransform, + "default": lowercaseTransform, "lower": lowercaseTransform, "upper": uppercaseTransform, + "keep": keepTransform, } -func defaultTransform(key string, value any) (string, any) { +func keepTransform(key string, value any) (string, any) { return key, value } diff --git a/internals/config/structure/structure.go b/internals/config/structure/structure.go index d9f2120e..38fce9cd 100644 --- a/internals/config/structure/structure.go +++ b/internals/config/structure/structure.go @@ -5,36 +5,49 @@ type ENV struct { DEFAULTS_PATH string FAVICON_PATH string TOKENS_DIR string - LOG_LEVEL string - PORT string - API_URL string - API_TOKENS []string - SETTINGS map[string]*SETTINGS `koanf:"settings"` INSECURE bool + + CONFIGS map[string]*CONFIG +} + +type CONFIG struct { + SERVICE SERVICE `koanf:"service"` + API API `koanf:"api"` + SETTINGS SETTINGS `koanf:"settings" aliases:"overrides"` +} + +type SERVICE struct { + PORT string `koanf:"port"` + LOG_LEVEL string `koanf:"loglevel"` +} + +type API struct { + URL string `koanf:"url"` + TOKENS []string `koanf:"tokens" aliases:"token"` } type SETTINGS struct { - ACCESS ACCESS_SETTINGS `koanf:"access" transform:"lower"` - MESSAGE MESSAGE_SETTINGS `koanf:"message" transform:"lower"` + ACCESS ACCESS_SETTINGS `koanf:"access"` + MESSAGE MESSAGE_SETTINGS `koanf:"message"` } type MESSAGE_SETTINGS struct { - VARIABLES map[string]any `koanf:"variables" childtransform:"upper"` - FIELD_MAPPINGS map[string][]FieldMapping `koanf:"fieldmappings" childtransform:"default"` - TEMPLATE string `koanf:"template" transform:"lower"` + VARIABLES map[string]any `koanf:"variables" childtransform:"upper"` + FIELD_MAPPINGS map[string][]FieldMapping `koanf:"fieldmappings" childtransform:"default"` + TEMPLATE string `koanf:"template"` } type FieldMapping struct { - Field string `koanf:"field" transform:"lower"` - Score int `koanf:"score" transform:"lower"` + Field string `koanf:"field"` + Score int `koanf:"score"` } type ACCESS_SETTINGS struct { - ENDPOINTS []string `koanf:"endpoints" transform:"lower"` - FIELD_POLICIES map[string]FieldPolicy `koanf:"fieldpolicies" transform:"lower" childtransform:"default"` + ENDPOINTS []string `koanf:"endpoints"` + FIELD_POLICIES map[string]FieldPolicy `koanf:"fieldpolicies" childtransform:"default"` } type FieldPolicy struct { - Value any `koanf:"value" transform:"lower"` - Action string `koanf:"action" transform:"lower"` + Value any `koanf:"value"` + Action string `koanf:"action"` } \ No newline at end of file diff --git a/internals/config/tokens.go b/internals/config/tokens.go index ac6af7ee..980fa14c 100644 --- a/internals/config/tokens.go +++ b/internals/config/tokens.go @@ -9,11 +9,6 @@ import ( "github.com/knadh/koanf/parsers/yaml" ) -type TOKEN_CONFIG struct { - TOKENS []string `koanf:"tokens"` - OVERRIDES structure.SETTINGS `koanf:"overrides"` -} - func LoadTokens() { log.Debug("Loading Configs in ", ENV.TOKENS_DIR) @@ -47,16 +42,16 @@ func NormalizeTokens() { func InitTokens() { apiTokens := mainConf.Layer.Strings("api.tokens") - var tokenConfigs []TOKEN_CONFIG + var tokenConfigs []structure.CONFIG tokenConf.Layer.Unmarshal("tokenconfigs", &tokenConfigs) - overrides := parseTokenConfigs(tokenConfigs) + config := parseTokenConfigs(tokenConfigs) - for token, override := range overrides { + for token, config := range config { apiTokens = append(apiTokens, token) - ENV.SETTINGS[token] = &override + ENV.CONFIGS[token] = &config } if len(apiTokens) <= 0 { @@ -73,19 +68,17 @@ func InitTokens() { if len(apiTokens) > 0 { log.Debug("Registered " + strconv.Itoa(len(apiTokens)) + " Tokens") - - ENV.API_TOKENS = apiTokens } } -func parseTokenConfigs(configs []TOKEN_CONFIG) map[string]structure.SETTINGS { - settings := map[string]structure.SETTINGS{} +func parseTokenConfigs(configArray []structure.CONFIG) map[string]structure.CONFIG { + configs := map[string]structure.CONFIG{} - for _, config := range configs { - for _, token := range config.TOKENS { - settings[token] = config.OVERRIDES + for _, config := range configArray { + for _, token := range config.API.TOKENS { + configs[token] = config } } - return settings + return configs } diff --git a/internals/proxy/middlewares/auth.go b/internals/proxy/middlewares/auth.go index 60afc459..88f1394d 100644 --- a/internals/proxy/middlewares/auth.go +++ b/internals/proxy/middlewares/auth.go @@ -3,6 +3,7 @@ package middlewares import ( "context" "encoding/base64" + "maps" "net/http" "slices" "strings" @@ -17,7 +18,12 @@ var Auth Middleware = Middleware{ } func authHandler(next http.Handler) http.Handler { - tokens := config.ENV.API_TOKENS + tokenKeys := maps.Keys(config.ENV.CONFIGS) + tokens := slices.Collect(tokenKeys) + + if tokens == nil { + tokens = []string{} + } return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { if len(tokens) <= 0 { diff --git a/internals/proxy/middlewares/common.go b/internals/proxy/middlewares/common.go index c3f56bb8..6984b471 100644 --- a/internals/proxy/middlewares/common.go +++ b/internals/proxy/middlewares/common.go @@ -24,22 +24,18 @@ type contextKey string const tokenKey contextKey = "token" -func getSettingsByReq(req *http.Request) *structure.SETTINGS { - token, ok := req.Context().Value(tokenKey).(string) +func getConfigByReq(req *http.Request) *structure.CONFIG { + token := req.Context().Value(tokenKey).(string) - if !ok { - token = "*" - } - - return getSettings(token) + return getConfig(token) } -func getSettings(token string) *structure.SETTINGS { - settings, exists := config.ENV.SETTINGS[token] +func getConfig(token string) *structure.CONFIG { + conf, exists := config.ENV.CONFIGS[token] - if !exists || settings == nil { - settings = config.ENV.SETTINGS["*"] + if !exists || conf == nil { + conf = config.DEFAULT } - return settings + return conf } diff --git a/internals/proxy/middlewares/endpoints.go b/internals/proxy/middlewares/endpoints.go index 2a26d77b..3006b13e 100644 --- a/internals/proxy/middlewares/endpoints.go +++ b/internals/proxy/middlewares/endpoints.go @@ -2,9 +2,9 @@ package middlewares import ( "net/http" + "path" "slices" "strings" - "path" log "github.com/codeshelldev/secured-signal-api/utils/logger" ) @@ -16,12 +16,12 @@ var Endpoints Middleware = Middleware{ func endpointsHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - settings := getSettingsByReq(req) + conf := getConfigByReq(req) - endpoints := settings.ACCESS.ENDPOINTS + endpoints := conf.SETTINGS.ACCESS.ENDPOINTS if endpoints == nil { - endpoints = getSettings("*").ACCESS.ENDPOINTS + endpoints = getConfig("").SETTINGS.ACCESS.ENDPOINTS } reqPath := req.URL.Path diff --git a/internals/proxy/middlewares/mapping.go b/internals/proxy/middlewares/mapping.go index 1dd055c0..dbd763dc 100644 --- a/internals/proxy/middlewares/mapping.go +++ b/internals/proxy/middlewares/mapping.go @@ -16,16 +16,17 @@ var Mapping Middleware = Middleware{ func mappingHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - settings := getSettingsByReq(req) + conf := getConfigByReq(req) - fieldMappings := settings.MESSAGE.FIELD_MAPPINGS + variables := conf.SETTINGS.MESSAGE.VARIABLES + fieldMappings := conf.SETTINGS.MESSAGE.FIELD_MAPPINGS if fieldMappings == nil { - fieldMappings = getSettings("*").MESSAGE.FIELD_MAPPINGS + fieldMappings = getConfig("").SETTINGS.MESSAGE.FIELD_MAPPINGS } - if settings.MESSAGE.VARIABLES == nil { - settings.MESSAGE.VARIABLES = getSettings("*").MESSAGE.VARIABLES + if variables == nil { + variables = getConfig("").SETTINGS.MESSAGE.VARIABLES } body, err := request.GetReqBody(req) @@ -53,7 +54,7 @@ func mappingHandler(next http.Handler) http.Handler { bodyData[keyWithoutPrefix] = value modifiedBody = true case ".": - settings.MESSAGE.VARIABLES[keyWithoutPrefix] = value + variables[keyWithoutPrefix] = value } } } diff --git a/internals/proxy/middlewares/message.go b/internals/proxy/middlewares/message.go index 57491716..4a7cb4ac 100644 --- a/internals/proxy/middlewares/message.go +++ b/internals/proxy/middlewares/message.go @@ -14,17 +14,17 @@ var Message Middleware = Middleware{ func messageHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - settings := getSettingsByReq(req) + conf := getConfigByReq(req) - variables := settings.MESSAGE.VARIABLES - messageTemplate := settings.MESSAGE.TEMPLATE + variables := conf.SETTINGS.MESSAGE.VARIABLES + messageTemplate := conf.SETTINGS.MESSAGE.TEMPLATE if variables == nil { - variables = getSettings("*").MESSAGE.VARIABLES + variables = getConfig("").SETTINGS.MESSAGE.VARIABLES } if messageTemplate == "" { - messageTemplate = getSettings("*").MESSAGE.TEMPLATE + messageTemplate = getConfig("").SETTINGS.MESSAGE.TEMPLATE } body, err := request.GetReqBody(req) diff --git a/internals/proxy/middlewares/policy.go b/internals/proxy/middlewares/policy.go index 004f8a44..31023641 100644 --- a/internals/proxy/middlewares/policy.go +++ b/internals/proxy/middlewares/policy.go @@ -18,12 +18,12 @@ var Policy Middleware = Middleware{ func policyHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - settings := getSettingsByReq(req) + conf := getConfigByReq(req) - policies := settings.ACCESS.FIELD_POLICIES + policies := conf.SETTINGS.ACCESS.FIELD_POLICIES if policies == nil { - policies = getSettings("*").ACCESS.FIELD_POLICIES + policies = getConfig("").SETTINGS.ACCESS.FIELD_POLICIES } body, err := request.GetReqBody(req) diff --git a/internals/proxy/middlewares/template.go b/internals/proxy/middlewares/template.go index 9d8ae0fa..a136313c 100644 --- a/internals/proxy/middlewares/template.go +++ b/internals/proxy/middlewares/template.go @@ -22,10 +22,12 @@ var Template Middleware = Middleware{ func templateHandler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - variables := getSettingsByReq(req).MESSAGE.VARIABLES + conf := getConfigByReq(req) + + variables := conf.SETTINGS.MESSAGE.VARIABLES if variables == nil { - variables = getSettings("*").MESSAGE.VARIABLES + variables = getConfig("").SETTINGS.MESSAGE.VARIABLES } body, err := request.GetReqBody(req) From c082deab5292461f5bf4b7a290f3b10319729f33 Mon Sep 17 00:00:00 2001 From: CodeShell <122738806+CodeShellDev@users.noreply.github.com> Date: Mon, 1 Dec 2025 17:45:02 +0100 Subject: [PATCH 2/2] fix main.go --- main.go | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/main.go b/main.go index 3ac13228..71f1de5a 100644 --- a/main.go +++ b/main.go @@ -5,7 +5,6 @@ import ( "os" config "github.com/codeshelldev/secured-signal-api/internals/config" - "github.com/codeshelldev/secured-signal-api/internals/config/structure" reverseProxy "github.com/codeshelldev/secured-signal-api/internals/proxy" docker "github.com/codeshelldev/secured-signal-api/utils/docker" log "github.com/codeshelldev/secured-signal-api/utils/logger" @@ -13,8 +12,6 @@ import ( var proxy reverseProxy.Proxy -var ENV *structure.ENV - func main() { logLevel := os.Getenv("LOG_LEVEL") @@ -24,10 +21,8 @@ func main() { config.Load() - ENV = config.ENV - - if ENV.LOG_LEVEL != log.Level() { - log.Init(ENV.LOG_LEVEL) + if config.DEFAULT.SERVICE.LOG_LEVEL != log.Level() { + log.Init(config.DEFAULT.SERVICE.LOG_LEVEL) } log.Info("Initialized Logger with Level of ", log.Level()) @@ -39,13 +34,13 @@ func main() { config.Log() - proxy = reverseProxy.Create(ENV.API_URL) + proxy = reverseProxy.Create(config.DEFAULT.API.URL) handler := proxy.Init() log.Info("Initialized Middlewares") - addr := "0.0.0.0:" + ENV.PORT + addr := "0.0.0.0:" + config.DEFAULT.SERVICE.PORT log.Info("Server Listening on ", addr)