diff --git a/cmd/server/main.go b/cmd/server/main.go index 0fdbfd8..cf054c7 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -19,6 +19,7 @@ import ( "relaybox/internal/adapter/input/parser" tcpadapter "relaybox/internal/adapter/input/tcp" wsadapter "relaybox/internal/adapter/input/websocket" + outputconfig "relaybox/internal/adapter/output/config" "relaybox/internal/adapter/output/expression" "relaybox/internal/adapter/output/filequeue" mariadbadapter "relaybox/internal/adapter/output/mariadb" @@ -121,7 +122,7 @@ func runServer(cfgPath string) error { exprRegistry.Register(exprEngine) // Config-based routing (hot-reload support) - ruleReader := cfgpkg.NewInMemoryRuleConfigReader(cfg) + ruleReader := outputconfig.NewInMemoryRuleConfigReader(cfg) // Viper WatchConfig -> hot-reload v, err := cfgpkg.NewViper(cfgPath) diff --git a/internal/apidocs/asyncapi.yaml b/internal/adapter/input/http/apidocs/asyncapi.yaml similarity index 100% rename from internal/apidocs/asyncapi.yaml rename to internal/adapter/input/http/apidocs/asyncapi.yaml diff --git a/internal/apidocs/embed.go b/internal/adapter/input/http/apidocs/embed.go similarity index 100% rename from internal/apidocs/embed.go rename to internal/adapter/input/http/apidocs/embed.go diff --git a/internal/apidocs/embed_test.go b/internal/adapter/input/http/apidocs/embed_test.go similarity index 97% rename from internal/apidocs/embed_test.go rename to internal/adapter/input/http/apidocs/embed_test.go index 38d01c9..0b83660 100644 --- a/internal/apidocs/embed_test.go +++ b/internal/adapter/input/http/apidocs/embed_test.go @@ -6,7 +6,7 @@ import ( "strings" "testing" - "relaybox/internal/apidocs" + "relaybox/internal/adapter/input/http/apidocs" ) func TestOpenAPIHandler(t *testing.T) { diff --git a/internal/apidocs/openapi.yaml b/internal/adapter/input/http/apidocs/openapi.yaml similarity index 100% rename from internal/apidocs/openapi.yaml rename to internal/adapter/input/http/apidocs/openapi.yaml diff --git a/internal/apidocs/redoc.standalone.js b/internal/adapter/input/http/apidocs/redoc.standalone.js similarity index 100% rename from internal/apidocs/redoc.standalone.js rename to internal/adapter/input/http/apidocs/redoc.standalone.js diff --git a/internal/adapter/input/http/router.go b/internal/adapter/input/http/router.go index 526d975..e6ccc4e 100644 --- a/internal/adapter/input/http/router.go +++ b/internal/adapter/input/http/router.go @@ -6,7 +6,7 @@ import ( "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" "relaybox/internal/adapter/input/websocket" - "relaybox/internal/apidocs" + "relaybox/internal/adapter/input/http/apidocs" "relaybox/internal/application/port/input" ) diff --git a/internal/config/rule_config_reader.go b/internal/adapter/output/config/rule_config_reader.go similarity index 92% rename from internal/config/rule_config_reader.go rename to internal/adapter/output/config/rule_config_reader.go index f409b4d..13ec8a8 100644 --- a/internal/config/rule_config_reader.go +++ b/internal/adapter/output/config/rule_config_reader.go @@ -1,10 +1,11 @@ -package config +package outputconfig import ( "context" "fmt" "sync" + "relaybox/internal/config" "relaybox/internal/domain" ) @@ -19,13 +20,13 @@ type InMemoryRuleConfigReader struct { inputs map[string]inputEntry // keyed by input ID } -func NewInMemoryRuleConfigReader(cfg *Config) *InMemoryRuleConfigReader { +func NewInMemoryRuleConfigReader(cfg *config.Config) *InMemoryRuleConfigReader { r := &InMemoryRuleConfigReader{} r.Update(cfg) return r } -func (r *InMemoryRuleConfigReader) Update(cfg *Config) { +func (r *InMemoryRuleConfigReader) Update(cfg *config.Config) { outputsByID := make(map[string]domain.Output, len(cfg.Outputs)) for _, c := range cfg.Outputs { outputsByID[c.ID] = domain.Output{ diff --git a/internal/config/rule_config_reader_test.go b/internal/adapter/output/config/rule_config_reader_test.go similarity index 85% rename from internal/config/rule_config_reader_test.go rename to internal/adapter/output/config/rule_config_reader_test.go index fab9fce..2589c14 100644 --- a/internal/config/rule_config_reader_test.go +++ b/internal/adapter/output/config/rule_config_reader_test.go @@ -1,16 +1,15 @@ -package config_test +package outputconfig_test import ( "context" "testing" + outputconfig "relaybox/internal/adapter/output/config" "relaybox/internal/config" ) // TestInMemoryRuleConfigReader_GetRulesByInputID verifies that rules are indexed // by input ID regardless of any legacy type value. -// RED: currently fails because Update() uses inp.Type ("BESZEL") as key, -// so GetRules("beszel") returns ErrInputNotFound. func TestInMemoryRuleConfigReader_GetRulesByInputID(t *testing.T) { cfg := &config.Config{ Inputs: []config.InputConfig{ @@ -25,7 +24,7 @@ func TestInMemoryRuleConfigReader_GetRulesByInputID(t *testing.T) { }, } - r := config.NewInMemoryRuleConfigReader(cfg) + r := outputconfig.NewInMemoryRuleConfigReader(cfg) // Must find rules by input ID "beszel" engine, entries, err := r.GetRules(context.Background(), "beszel") diff --git a/test/e2e/e2e_test.go b/test/e2e/e2e_test.go index 44c3364..5e92772 100644 --- a/test/e2e/e2e_test.go +++ b/test/e2e/e2e_test.go @@ -12,6 +12,7 @@ import ( "time" httpadapter "relaybox/internal/adapter/input/http" + outputconfig "relaybox/internal/adapter/output/config" "relaybox/internal/adapter/output/expression" "relaybox/internal/adapter/output/filequeue" sqliteadapter "relaybox/internal/adapter/output/sqlite" @@ -86,7 +87,7 @@ func TestE2E_PostMessage_Returns201(t *testing.T) { registry := webhookadapter.NewRegistry(map[domain.OutputType]output.OutputSender{ domain.OutputTypeWebhook: sender, }) - ruleReader := cfgpkg.NewInMemoryRuleConfigReader(cfg) + ruleReader := outputconfig.NewInMemoryRuleConfigReader(cfg) msgSvc := service.NewMessageService(repo, queue, nil, nil) worker := service.NewRelayWorker(queue, repo, ruleReader, registry, newExprRegistry(), service.DefaultRelayWorkerConfig())