From 1001be08e9af455edfda34d1f9cc64925cecd5b6 Mon Sep 17 00:00:00 2001 From: Angel Beltran Date: Mon, 12 Jan 2026 05:03:05 -0700 Subject: [PATCH] simplified NewServer() --- internal/server/server.go | 189 +++++++++++++++++--------------------- 1 file changed, 82 insertions(+), 107 deletions(-) diff --git a/internal/server/server.go b/internal/server/server.go index 6f1ab88..6705b11 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -27,18 +27,6 @@ import ( etsy_webhooks "ruben/inventory2/internal/server/webhooks/etsy" ) -type Server struct { - log *slog.Logger - *router.Mux - contentDir string - templater *templater.Templater - rawEvents *raw_events.Store - accts *accounts.Store - etsy *etsy_platform.Platform - auth *authentication.Authenticator - authMiddleware *middleware.Auth -} - func NewServer( ctx context.Context, logger *slog.Logger, @@ -47,91 +35,95 @@ func NewServer( accts *accounts.Store, etsy *etsy_platform.Platform, auth *authentication.Authenticator, -) *Server { +) http.Handler { mux := router.NewMux( logger, middleware.LogRequests(ctx, logger.WithGroup("request")), ) - tmpl := templater.NewTemplater( - contentDir+"/templates", - func() template.FuncMap { - return template.FuncMap{ - // params - "addPathParam": func(k string, v any, args map[string]any) (map[string]any, error) { - pathParams, ok := args["PathParams"].(map[string]string) - if !ok { - return nil, fmt.Errorf("PathParams no set are args: %v", args) - } - - pathParams[k] = fmt.Sprint(v) - - return args, nil - }, - - // parsing - "parseInt": func(s string) (int, error) { - return strconv.Atoi(s) - }, - "parseInt64": func(s string) (int64, error) { - return strconv.ParseInt(s, 10, 64) - }, - "parsePlatform": func(s string) (accounts.Platform, error) { - return accounts.NewPlatform(s) - }, - - // arithmetic - "addInt": func(a, b int) int { - return a + b - }, - "subInt": func(a, b int) int { - return a - b - }, - "multInt": func(a, b int) int { - return a * b - }, - - // json - "prettyPrintJSON": func(j json.RawMessage) string { - b, err := json.MarshalIndent(j, " ", "") - if err != nil { - return string(j) - } - return string(b) - }, - } - }, + // TODO: shouldn't this ACTUALLY be a middleware? + // - only try to make this an actual middleware AFTER all the routers are broken out, so that way how the middleware is supposed to work can be known + authMiddleware := middleware.NewAuth( + logger.WithGroup("auth-middleware"), + auth, + auth_api.NewLoginURL, + accts, ) - s := &Server{ - // TODO: eliminate fields that aren't needed anymore - log: logger, - Mux: mux, - contentDir: contentDir, - templater: tmpl, - rawEvents: rawEvents, - accts: accts, - etsy: etsy, - auth: auth, - // TODO: shouldn't this ACTUALLY be a middleware? - // - only try to make this an actual middleware AFTER all the routers are broken out, so that way how the middleware is supposed to work can be known - authMiddleware: middleware.NewAuth( - logger.WithGroup("auth-middleware"), - auth, - auth_api.NewLoginURL, - accts, - ), - } + // webpage content + + // non-html content: scripts, styles, images, etc + + scfs := http.FileServer(http.Dir(contentDir + "/scripts")) + mux.Mux.Handle("GET /scripts/", http.StripPrefix("/scripts", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "text/javascript") + if path.Ext(r.URL.Path) == ".gz" { + w.Header().Set("Content-Encoding", "gzip") + } + scfs.ServeHTTP(w, r) + }))) + mux.Mux.Handle("GET /styles/", http.StripPrefix("/styles", http.FileServer(http.Dir(contentDir+"/styles")))) + mux.Mux.Handle("GET /favicon/", http.StripPrefix("/favicon", http.FileServer(http.Dir(contentDir+"/favicon")))) + + // html (must be before the api endpoints, because the webpage middleware has to be installed beforehand // kind of a dumb way to capture routes for webpages wpr := templates_api.NewWebpageRouter( - s.log.WithGroup("templates"), + logger.WithGroup("templates"), contentDir, - tmpl, + templater.NewTemplater( + contentDir+"/templates", + func() template.FuncMap { + return template.FuncMap{ + // params + "addPathParam": func(k string, v any, args map[string]any) (map[string]any, error) { + pathParams, ok := args["PathParams"].(map[string]string) + if !ok { + return nil, fmt.Errorf("PathParams no set are args: %v", args) + } + + pathParams[k] = fmt.Sprint(v) + + return args, nil + }, + + // parsing + "parseInt": func(s string) (int, error) { + return strconv.Atoi(s) + }, + "parseInt64": func(s string) (int64, error) { + return strconv.ParseInt(s, 10, 64) + }, + "parsePlatform": func(s string) (accounts.Platform, error) { + return accounts.NewPlatform(s) + }, + + // arithmetic + "addInt": func(a, b int) int { + return a + b + }, + "subInt": func(a, b int) int { + return a - b + }, + "multInt": func(a, b int) int { + return a * b + }, + + // json + "prettyPrintJSON": func(j json.RawMessage) string { + b, err := json.MarshalIndent(j, " ", "") + if err != nil { + return string(j) + } + return string(b) + }, + } + }, + ), rawEvents, accts, etsy, - s.authMiddleware, + authMiddleware, ) mux.AddMiddleware( func(fn response.HandlerFunc) response.HandlerFunc { @@ -155,13 +147,15 @@ func NewServer( }, ) + mux.Route("/", wpr) + // api endpoints - mux.Route("/auth", auth_api.NewLoginSubrouter(s.log.WithGroup("/auth"), auth)) + mux.Route("/auth", auth_api.NewLoginSubrouter(logger.WithGroup("/auth"), auth)) mux.Route("/accounts", accounts_api.NewAccountSubrouter( - s.log.WithGroup("/accounts"), - s.accts, - s.authMiddleware, + logger.WithGroup("/accounts"), + accts, + authMiddleware, )) // api webhooks (TODO: make a router for these) @@ -180,24 +174,5 @@ func NewServer( mux.Mux.Handle("POST /webhooks/", webhookHandler) mux.Mux.Handle("PUT /webhooks/", webhookHandler) - // webpage content - - // non-html content: scripts, styles, images, etc - - scfs := http.FileServer(http.Dir(contentDir + "/scripts")) - mux.Mux.Handle("GET /scripts/", http.StripPrefix("/scripts", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "text/javascript") - if path.Ext(r.URL.Path) == ".gz" { - w.Header().Set("Content-Encoding", "gzip") - } - scfs.ServeHTTP(w, r) - }))) - mux.Mux.Handle("GET /styles/", http.StripPrefix("/styles", http.FileServer(http.Dir(contentDir+"/styles")))) - mux.Mux.Handle("GET /favicon/", http.StripPrefix("/favicon", http.FileServer(http.Dir(contentDir+"/favicon")))) - - // html - - mux.Route("/", wpr) - - return s + return mux }