From aec235867c8f3f36a19b0aa5359bdc7c8e989278 Mon Sep 17 00:00:00 2001 From: Zach Hayes Date: Wed, 28 Jan 2026 10:50:46 -0700 Subject: [PATCH 1/9] http server and entrypoint --- go.mod | 1 + go.sum | 2 ++ main.go | 51 +++++++++++++++++++++++++++++++++++++++++++++++ server/server.go | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 106 insertions(+) create mode 100644 main.go create mode 100644 server/server.go diff --git a/go.mod b/go.mod index 9e2dd21..ffd4abe 100644 --- a/go.mod +++ b/go.mod @@ -18,6 +18,7 @@ require ( require ( github.com/ajg/form v1.5.1 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/go-chi/chi/v5 v5.2.4 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/mattn/go-sqlite3 v1.14.22 // indirect diff --git a/go.sum b/go.sum index 1131cf1..f103270 100644 --- a/go.sum +++ b/go.sum @@ -6,6 +6,8 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/go-chi/chi/v5 v5.2.4 h1:WtFKPHwlywe8Srng8j2BhOD9312j9cGUxG1SP4V2cR4= +github.com/go-chi/chi/v5 v5.2.4/go.mod h1:X7Gx4mteadT3eDOMTsXzmI4/rwUpOwBHLpAfupzFJP0= github.com/go-chi/render v1.0.3 h1:AsXqd2a1/INaIfUSKq3G5uA8weYx20FOsM7uSoCyyt4= github.com/go-chi/render v1.0.3/go.mod h1:/gr3hVkmYR0YlEy3LxCuVRFzEu9Ruok+gFqbIofjao0= github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= diff --git a/main.go b/main.go new file mode 100644 index 0000000..1642b35 --- /dev/null +++ b/main.go @@ -0,0 +1,51 @@ +package main + +import ( + "context" + "errors" + "fmt" + "net/http" + "os" + "os/signal" + "syscall" + "time" + + "reverse-watch/config" + "reverse-watch/domain/models" + "reverse-watch/logging" + "reverse-watch/server" +) + +func main() { + logging.Initialize() + cfg := config.Load() + models.InitSnowflakeGenerator(0, 0) + + logging.Log.Info("Starting Reverse Watch") + + done := make(chan os.Signal, 1) + signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) + + httpSrv := http.Server{ + Addr: fmt.Sprintf("0.0.0.0:%s", cfg.HTTP.Port), + Handler: server.New(cfg), + } + + go func() { + logging.Log.Infof("Starting HTTP Server on %v", httpSrv.Addr) + if err := httpSrv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { + panic(err) + } + }() + + <-done + + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer func() { + cancel() + }() + + if err := httpSrv.Shutdown(ctx); err != nil { + panic(err) + } +} diff --git a/server/server.go b/server/server.go new file mode 100644 index 0000000..ab668dc --- /dev/null +++ b/server/server.go @@ -0,0 +1,52 @@ +package server + +import ( + "net/http" + + "reverse-watch/config" + "reverse-watch/domain/repository" + "reverse-watch/repository/private" + "reverse-watch/repository/public" + "reverse-watch/secret" + + "github.com/go-chi/chi/v5" + "github.com/go-chi/chi/v5/middleware" +) + +type Server struct { + router chi.Router + + privateRepo repository.PrivateRepository + publicRepo repository.PublicRepository +} + +func New(cfg config.Config) *Server { + keygen := secret.NewKeyGenerator(cfg.Environment) + privateRepo, err := private.NewPrivateRepository(cfg, keygen) + if err != nil { + panic(err) + } + publicRepo, err := public.NewPublicRepository(cfg) + if err != nil { + panic(err) + } + + r := chi.NewRouter() + + r.Use(middleware.RequestID) + r.Use(middleware.RealIP) + r.Use(middleware.Logger) + r.Use(middleware.Recoverer) + + // TODO(zach): Define routes + + return &Server{ + router: r, + privateRepo: privateRepo, + publicRepo: publicRepo, + } +} + +func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { + s.router.ServeHTTP(w, r) +} From 46cc4a76e389c2b8f72a78609a8ec9b8dc36a2b3 Mon Sep 17 00:00:00 2001 From: Zach Hayes Date: Wed, 28 Jan 2026 12:00:19 -0700 Subject: [PATCH 2/9] close db connections --- main.go | 14 +++++++++----- server/server.go | 16 +++++++++++++--- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/main.go b/main.go index 1642b35..b90b84f 100644 --- a/main.go +++ b/main.go @@ -24,11 +24,12 @@ func main() { logging.Log.Info("Starting Reverse Watch") done := make(chan os.Signal, 1) - signal.Notify(done, os.Interrupt, syscall.SIGINT, syscall.SIGTERM) + signal.Notify(done, os.Interrupt, syscall.SIGTERM) + srv := server.New(cfg) httpSrv := http.Server{ Addr: fmt.Sprintf("0.0.0.0:%s", cfg.HTTP.Port), - Handler: server.New(cfg), + Handler: srv, } go func() { @@ -41,9 +42,12 @@ func main() { <-done ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) - defer func() { - cancel() - }() + defer cancel() + + // Close db connections + if err := srv.Close(); err != nil { + panic(err) + } if err := httpSrv.Shutdown(ctx); err != nil { panic(err) diff --git a/server/server.go b/server/server.go index ab668dc..b3f0903 100644 --- a/server/server.go +++ b/server/server.go @@ -14,7 +14,7 @@ import ( ) type Server struct { - router chi.Router + r chi.Router privateRepo repository.PrivateRepository publicRepo repository.PublicRepository @@ -41,12 +41,22 @@ func New(cfg config.Config) *Server { // TODO(zach): Define routes return &Server{ - router: r, + r: r, privateRepo: privateRepo, publicRepo: publicRepo, } } func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { - s.router.ServeHTTP(w, r) + s.r.ServeHTTP(w, r) +} + +func (s *Server) Close() error { + if err := s.privateRepo.Close(); err != nil { + return err + } + if err := s.publicRepo.Close(); err != nil { + return err + } + return nil } From 815bcf06339f953ff6d299d7026c7d04f0334d2d Mon Sep 17 00:00:00 2001 From: Zach Hayes Date: Wed, 28 Jan 2026 12:27:35 -0700 Subject: [PATCH 3/9] mitigate slowloris attack --- main.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/main.go b/main.go index b90b84f..2d5235f 100644 --- a/main.go +++ b/main.go @@ -28,8 +28,12 @@ func main() { srv := server.New(cfg) httpSrv := http.Server{ - Addr: fmt.Sprintf("0.0.0.0:%s", cfg.HTTP.Port), - Handler: srv, + Addr: fmt.Sprintf("0.0.0.0:%s", cfg.HTTP.Port), + Handler: srv, + ReadHeaderTimeout: 5 * time.Second, + ReadTimeout: 10 * time.Second, + WriteTimeout: 10 * time.Second, + IdleTimeout: 120 * time.Second, } go func() { @@ -44,12 +48,12 @@ func main() { ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() - // Close db connections - if err := srv.Close(); err != nil { + if err := httpSrv.Shutdown(ctx); err != nil { panic(err) } - if err := httpSrv.Shutdown(ctx); err != nil { + // Close db connections + if err := srv.Close(); err != nil { panic(err) } } From 2f60630259cd27465350b0a36871ea14ce655b19 Mon Sep 17 00:00:00 2001 From: Zach Hayes Date: Wed, 28 Jan 2026 13:42:21 -0700 Subject: [PATCH 4/9] return error instead of panicking --- main.go | 9 +++++++-- server/server.go | 23 +++++++++++++++-------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/main.go b/main.go index 2d5235f..3a2e1dc 100644 --- a/main.go +++ b/main.go @@ -26,8 +26,11 @@ func main() { done := make(chan os.Signal, 1) signal.Notify(done, os.Interrupt, syscall.SIGTERM) - srv := server.New(cfg) - httpSrv := http.Server{ + srv, err := server.New(cfg) + if err != nil { + panic(err) + } + httpSrv := &http.Server{ Addr: fmt.Sprintf("0.0.0.0:%s", cfg.HTTP.Port), Handler: srv, ReadHeaderTimeout: 5 * time.Second, @@ -45,6 +48,8 @@ func main() { <-done + logging.Log.Info("Shutting down server connections gracefully") + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() diff --git a/server/server.go b/server/server.go index b3f0903..59020dd 100644 --- a/server/server.go +++ b/server/server.go @@ -1,10 +1,13 @@ package server import ( + "errors" + "fmt" "net/http" "reverse-watch/config" "reverse-watch/domain/repository" + "reverse-watch/logging" "reverse-watch/repository/private" "reverse-watch/repository/public" "reverse-watch/secret" @@ -20,23 +23,26 @@ type Server struct { publicRepo repository.PublicRepository } -func New(cfg config.Config) *Server { +func New(cfg config.Config) (*Server, error) { keygen := secret.NewKeyGenerator(cfg.Environment) privateRepo, err := private.NewPrivateRepository(cfg, keygen) if err != nil { - panic(err) + logging.Log.Errorf("failed to create private repository: %v", err) + return nil, fmt.Errorf("failed to create private repository: %v", err) } publicRepo, err := public.NewPublicRepository(cfg) if err != nil { - panic(err) + privateRepo.Close() + logging.Log.Errorf("failed to create public repository: %v", err) + return nil, fmt.Errorf("failed to create public repository: %v", err) } r := chi.NewRouter() + r.Use(middleware.Recoverer) r.Use(middleware.RequestID) r.Use(middleware.RealIP) r.Use(middleware.Logger) - r.Use(middleware.Recoverer) // TODO(zach): Define routes @@ -44,7 +50,7 @@ func New(cfg config.Config) *Server { r: r, privateRepo: privateRepo, publicRepo: publicRepo, - } + }, nil } func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { @@ -52,11 +58,12 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { } func (s *Server) Close() error { + var errs []error if err := s.privateRepo.Close(); err != nil { - return err + errs = append(errs, err) } if err := s.publicRepo.Close(); err != nil { - return err + errs = append(errs, err) } - return nil + return errors.Join(errs...) } From 094c2c4d0ca575e414da398f1477d88a70e1a23f Mon Sep 17 00:00:00 2001 From: Zach Hayes Date: Wed, 28 Jan 2026 18:29:10 -0700 Subject: [PATCH 5/9] check for empty token --- middleware/middleware.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/middleware/middleware.go b/middleware/middleware.go index b857d0e..5b4e225 100644 --- a/middleware/middleware.go +++ b/middleware/middleware.go @@ -22,7 +22,12 @@ func parseBearerToken(authHeader string) (string, bool) { if !strings.EqualFold(authHeader[:len(prefix)], prefix) { return "", false } - return authHeader[len(prefix):], true + + token := authHeader[len(prefix):] + if token == "" { + return "", false + } + return token, true } func AuthMiddleware(keyRepo repository.KeyRepository) func(http.Handler) http.Handler { From ba657212937be43871ff4c05cbd42c1aa69e60d3 Mon Sep 17 00:00:00 2001 From: Zach Hayes Date: Wed, 28 Jan 2026 18:29:34 -0700 Subject: [PATCH 6/9] Revert "check for empty token" This reverts commit 094c2c4d0ca575e414da398f1477d88a70e1a23f. --- middleware/middleware.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/middleware/middleware.go b/middleware/middleware.go index 5b4e225..b857d0e 100644 --- a/middleware/middleware.go +++ b/middleware/middleware.go @@ -22,12 +22,7 @@ func parseBearerToken(authHeader string) (string, bool) { if !strings.EqualFold(authHeader[:len(prefix)], prefix) { return "", false } - - token := authHeader[len(prefix):] - if token == "" { - return "", false - } - return token, true + return authHeader[len(prefix):], true } func AuthMiddleware(keyRepo repository.KeyRepository) func(http.Handler) http.Handler { From 4766bd44967ff3aec9731bf852bc82477e4505d7 Mon Sep 17 00:00:00 2001 From: Zach Hayes Date: Fri, 30 Jan 2026 12:16:26 -0700 Subject: [PATCH 7/9] add factory --- domain/repository/factory.go | 6 ++++++ middleware/factory.go | 20 ++++++++++++++++++++ repository/factory/factory.go | 23 +++++++++++++++++++++++ server/server.go | 5 +++++ 4 files changed, 54 insertions(+) create mode 100644 domain/repository/factory.go create mode 100644 middleware/factory.go create mode 100644 repository/factory/factory.go diff --git a/domain/repository/factory.go b/domain/repository/factory.go new file mode 100644 index 0000000..0bf3952 --- /dev/null +++ b/domain/repository/factory.go @@ -0,0 +1,6 @@ +package repository + +type Factory interface { + Private() PrivateRepository + Public() PublicRepository +} diff --git a/middleware/factory.go b/middleware/factory.go new file mode 100644 index 0000000..7ee4724 --- /dev/null +++ b/middleware/factory.go @@ -0,0 +1,20 @@ +package middleware + +import ( + "context" + "net/http" + + "reverse-watch/domain/repository" +) + +const FactoryContextKey ContextKey = "factory" + +func Factory(factory repository.Factory) func(http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + ctx := context.WithValue(r.Context(), FactoryContextKey, factory) + next.ServeHTTP(w, r.WithContext(ctx)) + } + return http.HandlerFunc(fn) + } +} diff --git a/repository/factory/factory.go b/repository/factory/factory.go new file mode 100644 index 0000000..abb3363 --- /dev/null +++ b/repository/factory/factory.go @@ -0,0 +1,23 @@ +package factory + +import "reverse-watch/domain/repository" + +type factory struct { + privateRepo repository.PrivateRepository + publicRepo repository.PublicRepository +} + +func NewFactory(privateRepo repository.PrivateRepository, publicRepo repository.PublicRepository) repository.RepositoryFactory { + return &factory{ + privateRepo: privateRepo, + publicRepo: publicRepo, + } +} + +func (f *factory) Private() repository.PrivateRepository { + return f.privateRepo +} + +func (f *factory) Public() repository.PublicRepository { + return f.publicRepo +} diff --git a/server/server.go b/server/server.go index 59020dd..d8b0b19 100644 --- a/server/server.go +++ b/server/server.go @@ -8,6 +8,8 @@ import ( "reverse-watch/config" "reverse-watch/domain/repository" "reverse-watch/logging" + rwmiddleware "reverse-watch/middleware" + "reverse-watch/repository/factory" "reverse-watch/repository/private" "reverse-watch/repository/public" "reverse-watch/secret" @@ -44,6 +46,9 @@ func New(cfg config.Config) (*Server, error) { r.Use(middleware.RealIP) r.Use(middleware.Logger) + f := factory.NewFactory(privateRepo, publicRepo) + r.Use(rwmiddleware.Factory(f)) + // TODO(zach): Define routes return &Server{ From 0d0b20fc86d614aa766329e0ee88a30074af5ecd Mon Sep 17 00:00:00 2001 From: Zach Hayes Date: Fri, 30 Jan 2026 13:12:08 -0700 Subject: [PATCH 8/9] use correct type --- go.mod | 2 +- repository/factory/factory.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index ffd4abe..4256af3 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.24.0 toolchain go1.24.7 require ( + github.com/go-chi/chi/v5 v5.2.4 github.com/go-chi/render v1.0.3 github.com/go-viper/mapstructure/v2 v2.4.0 github.com/google/go-cmp v0.7.0 @@ -18,7 +19,6 @@ require ( require ( github.com/ajg/form v1.5.1 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect - github.com/go-chi/chi/v5 v5.2.4 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/mattn/go-sqlite3 v1.14.22 // indirect diff --git a/repository/factory/factory.go b/repository/factory/factory.go index abb3363..54a5af8 100644 --- a/repository/factory/factory.go +++ b/repository/factory/factory.go @@ -7,7 +7,7 @@ type factory struct { publicRepo repository.PublicRepository } -func NewFactory(privateRepo repository.PrivateRepository, publicRepo repository.PublicRepository) repository.RepositoryFactory { +func NewFactory(privateRepo repository.PrivateRepository, publicRepo repository.PublicRepository) repository.Factory { return &factory{ privateRepo: privateRepo, publicRepo: publicRepo, From fd581b0ef14e05822612af2be0de0205c7d5e68e Mon Sep 17 00:00:00 2001 From: Zach Hayes Date: Fri, 30 Jan 2026 15:22:40 -0700 Subject: [PATCH 9/9] update factory and add tests --- domain/repository/factory.go | 6 ++-- internal/testutil/factory.go | 55 ++++++++++++++++++++++++++++++++++ middleware/factory.go | 2 +- middleware/factory_test.go | 39 ++++++++++++++++++++++++ middleware/middleware_test.go | 4 +-- middleware/permissions_test.go | 4 +-- repository/factory/factory.go | 26 ++++++++++------ server/server.go | 2 +- 8 files changed, 121 insertions(+), 17 deletions(-) create mode 100644 internal/testutil/factory.go create mode 100644 middleware/factory_test.go diff --git a/domain/repository/factory.go b/domain/repository/factory.go index 0bf3952..51ef3a9 100644 --- a/domain/repository/factory.go +++ b/domain/repository/factory.go @@ -1,6 +1,8 @@ package repository type Factory interface { - Private() PrivateRepository - Public() PublicRepository + Key() KeyRepository + Marketplace() MarketplaceRepository + AdminAudit() AdminAuditRepository + Reversal() ReversalRepository } diff --git a/internal/testutil/factory.go b/internal/testutil/factory.go new file mode 100644 index 0000000..a2897a1 --- /dev/null +++ b/internal/testutil/factory.go @@ -0,0 +1,55 @@ +package testutil + +import ( + "testing" + + "reverse-watch/domain/repository" +) + +type factory struct { + key repository.KeyRepository + marketplace repository.MarketplaceRepository + adminAudit repository.AdminAuditRepository + reversal repository.ReversalRepository +} + +func NewTestFactory(t *testing.T) *factory { + t.Helper() + return &factory{} +} + +func (f *factory) Key() repository.KeyRepository { + return f.key +} + +func (f *factory) Marketplace() repository.MarketplaceRepository { + return f.marketplace +} + +func (f *factory) AdminAudit() repository.AdminAuditRepository { + return f.adminAudit +} + +func (f *factory) Reversal() repository.ReversalRepository { + return f.reversal +} + +func (f *factory) WithKey(key repository.KeyRepository) *factory { + f.key = key + return f +} + +func (f *factory) WithMarketplace(marketplace repository.MarketplaceRepository) *factory { + f.marketplace = marketplace + return f +} + +func (f *factory) WithAdminAudit(adminAudit repository.AdminAuditRepository) *factory { + f.adminAudit = adminAudit + return f +} + +func (f *factory) WithReversal(reversal repository.ReversalRepository) *factory { + f.reversal = reversal + return f +} diff --git a/middleware/factory.go b/middleware/factory.go index 7ee4724..a9731e9 100644 --- a/middleware/factory.go +++ b/middleware/factory.go @@ -9,7 +9,7 @@ import ( const FactoryContextKey ContextKey = "factory" -func Factory(factory repository.Factory) func(http.Handler) http.Handler { +func FactoryMiddleware(factory repository.Factory) func(http.Handler) http.Handler { return func(next http.Handler) http.Handler { fn := func(w http.ResponseWriter, r *http.Request) { ctx := context.WithValue(r.Context(), FactoryContextKey, factory) diff --git a/middleware/factory_test.go b/middleware/factory_test.go new file mode 100644 index 0000000..d7c5438 --- /dev/null +++ b/middleware/factory_test.go @@ -0,0 +1,39 @@ +package middleware + +import ( + "net/http" + "net/http/httptest" + "testing" + + "reverse-watch/internal/testutil" +) + +func TestFactoryMiddleware(t *testing.T) { + var capturedRequest *http.Request + fn := func(w http.ResponseWriter, r *http.Request) { + capturedRequest = r + w.WriteHeader(http.StatusOK) + } + next := http.HandlerFunc(fn) + + factory := testutil.NewTestFactory(t) + factoryMiddleware := FactoryMiddleware(factory) + handler := factoryMiddleware(next) + + w := httptest.NewRecorder() + r := httptest.NewRequest(http.MethodGet, "/", nil) + handler.ServeHTTP(w, r) + + if w.Code != http.StatusOK { + t.Errorf("got status code %d, wanted %d", w.Code, http.StatusOK) + } + + if capturedRequest == nil { + t.Fatalf("captured request is nil") + } + + capturedFactory := capturedRequest.Context().Value(FactoryContextKey) + if capturedFactory == nil { + t.Fatalf("captured factory is nil") + } +} diff --git a/middleware/middleware_test.go b/middleware/middleware_test.go index 71e496d..d7255e2 100644 --- a/middleware/middleware_test.go +++ b/middleware/middleware_test.go @@ -97,10 +97,10 @@ func TestAuthMiddleware(t *testing.T) { fn := func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) } - dummyHandler := http.HandlerFunc(fn) + next := http.HandlerFunc(fn) middlewareFunc := AuthMiddleware(keyRepo) - handler := middlewareFunc(dummyHandler) + handler := middlewareFunc(next) w := httptest.NewRecorder() r, err := tc.setup() diff --git a/middleware/permissions_test.go b/middleware/permissions_test.go index 6e61a90..cdc7a81 100644 --- a/middleware/permissions_test.go +++ b/middleware/permissions_test.go @@ -85,10 +85,10 @@ func TestRequirePermissions(t *testing.T) { fn := func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) } - dummyHandler := http.HandlerFunc(fn) + next := http.HandlerFunc(fn) middlewareFunc := RequirePermissions(tc.permissions...) - handler := middlewareFunc(dummyHandler) + handler := middlewareFunc(next) w := httptest.NewRecorder() r := tc.setup() diff --git a/repository/factory/factory.go b/repository/factory/factory.go index 54a5af8..1ad0419 100644 --- a/repository/factory/factory.go +++ b/repository/factory/factory.go @@ -3,21 +3,29 @@ package factory import "reverse-watch/domain/repository" type factory struct { - privateRepo repository.PrivateRepository - publicRepo repository.PublicRepository + private repository.PrivateRepository + public repository.PublicRepository } -func NewFactory(privateRepo repository.PrivateRepository, publicRepo repository.PublicRepository) repository.Factory { +func NewFactory(private repository.PrivateRepository, public repository.PublicRepository) repository.Factory { return &factory{ - privateRepo: privateRepo, - publicRepo: publicRepo, + private: private, + public: public, } } -func (f *factory) Private() repository.PrivateRepository { - return f.privateRepo +func (f *factory) Key() repository.KeyRepository { + return f.private.Key() } -func (f *factory) Public() repository.PublicRepository { - return f.publicRepo +func (f *factory) Marketplace() repository.MarketplaceRepository { + return f.private.Marketplace() +} + +func (f *factory) AdminAudit() repository.AdminAuditRepository { + return f.private.AdminAudit() +} + +func (f *factory) Reversal() repository.ReversalRepository { + return f.public.Reversal() } diff --git a/server/server.go b/server/server.go index d8b0b19..f1a0027 100644 --- a/server/server.go +++ b/server/server.go @@ -47,7 +47,7 @@ func New(cfg config.Config) (*Server, error) { r.Use(middleware.Logger) f := factory.NewFactory(privateRepo, publicRepo) - r.Use(rwmiddleware.Factory(f)) + r.Use(rwmiddleware.FactoryMiddleware(f)) // TODO(zach): Define routes